#!/bin/bash set -u SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_MARIADB="$(cd "${SCRIPT_DIR}/../../../../SDK/mariadb" 2>/dev/null && pwd || true)" DEB_DIR="${1:-}" log() { echo "[ParkingSpaceGuide][MariaDB] $*" } wait_for_dpkg_lock() { local i=0 while [ "$i" -lt 60 ]; do if ! fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 \ && ! fuser /var/lib/dpkg/lock >/dev/null 2>&1; then return 0 fi sleep 2 i=$((i + 1)) done log "等待 dpkg 锁超时" return 1 } if [ -z "${DEB_DIR}" ]; then if [ -d /opt/parkingspaceguide/mariadb-offline ]; then DEB_DIR="/opt/parkingspaceguide/mariadb-offline" elif [ -n "${REPO_MARIADB}" ] && [ -d "${REPO_MARIADB}" ]; then DEB_DIR="${REPO_MARIADB}" else DEB_DIR="${SCRIPT_DIR}/mariadb-offline" fi fi if [ ! -d "${DEB_DIR}" ]; then log "找不到 MariaDB 离线包目录: ${DEB_DIR}" exit 1 fi shopt -s nullglob DEB_FILES=( "${DEB_DIR}"/*.deb ) shopt -u nullglob if [ ${#DEB_FILES[@]} -eq 0 ]; then log "目录中没有 .deb 文件: ${DEB_DIR}" exit 1 fi libc_has_glibc_233() { if [ -e /lib/aarch64-linux-gnu/libc.so.6 ] && command -v objdump >/dev/null 2>&1; then objdump -T /lib/aarch64-linux-gnu/libc.so.6 2>/dev/null | grep -q 'GLIBC_2\.33' return $? fi return 1 } # Ubuntu 22.04 / MariaDB 10.6 的包在 20.04 上不可装(要 libc6>=2.34、libssl3)。 # 20.04 的 libaio1 / gawk / rsync / socat / libnuma1_2.0.12 必须装。 should_skip_system_deb() { local name name="$(basename "$1")" case "${name}" in libnuma1_2.0.14*|libnuma1_*ubuntu2*|liburing2_*|libpmem1_*|galera-4_*|libdaxctl1_*|libndctl6_*|*10.6*|libssl3_*) return 0 ;; esac return 1 } FILTERED_DEBS=() for deb in "${DEB_FILES[@]}"; do if should_skip_system_deb "${deb}"; then log "跳过系统库,避免覆盖板子 glibc 不兼容的文件: $(basename "${deb}")" continue fi FILTERED_DEBS+=("${deb}") done DEB_FILES=("${FILTERED_DEBS[@]}") if [ ${#DEB_FILES[@]} -eq 0 ]; then log "过滤后没有可安装的 MariaDB 包" exit 1 fi if [ -e /lib/aarch64-linux-gnu/libnuma.so.1 ] && command -v objdump >/dev/null 2>&1 && objdump -T /lib/aarch64-linux-gnu/libnuma.so.1 2>/dev/null | grep -q 'GLIBC_2\.33' && ! libc_has_glibc_233; then log "当前 libnuma.so.1 需要 GLIBC_2.33,本机 libc 没有该版本。" log "请安装 Ubuntu 20.04 的 libnuma1_2.0.12-1_arm64.deb 后再启动应用。" log "下载:http://ports.ubuntu.com/pool/main/n/numactl/libnuma1_2.0.12-1_arm64.deb" fi if ! wait_for_dpkg_lock; then exit 1 fi export DEBIAN_FRONTEND=noninteractive # 上次若已解开 22.04/10.6 包,dpkg --configure -a 仍会去配它们,先卸掉。 log "清除未配置完成的 Ubuntu 22.04 / MariaDB 10.6 残留包" dpkg --remove --force-depends \ libdaxctl1 libndctl6 libpmem1 liburing2 galera-4 libssl3 \ mariadb-server-10.6 mariadb-server-core-10.6 \ mariadb-client-10.6 mariadb-client-core-10.6 \ >/dev/null 2>&1 || true log "安装离线 MariaDB: ${DEB_DIR}(共 ${#DEB_FILES[@]} 个包)" for deb in "${DEB_FILES[@]}"; do log " $(basename "$deb")" done # 一次传入全部离线包,dpkg 才能解析 mariadb-server 对 mariadb-server-core 等依赖。 install_offline_debs() { dpkg -i "${DEB_FILES[@]}" } if ! install_offline_debs; then log "第一次安装未完全成功,配置已解开的包后再装一次" dpkg --configure -a || true install_offline_debs || true fi dpkg --configure -a || true if ! dpkg -s mariadb-server-10.3 >/dev/null 2>&1 && ! dpkg -s mariadb-server >/dev/null 2>&1; then log "mariadb-server 仍未安装。离线目录可能缺依赖包,或包版本与板子系统不一致。" log "当前 MariaDB/MySQL 包状态:" dpkg -l 'mariadb*' 'mysql-common' 2>/dev/null || true dpkg --audit || true exit 1 fi systemctl enable mariadb >/dev/null 2>&1 || systemctl enable mysql >/dev/null 2>&1 || true systemctl start mariadb >/dev/null 2>&1 || systemctl start mysql >/dev/null 2>&1 || true CONF_DIR="/etc/mysql/mariadb.conf.d" if [ -d "${CONF_DIR}" ]; then cat > "${CONF_DIR}/99-parkingspaceguide.cnf" <<'EOF' [mysqld] bind-address = 0.0.0.0 EOF systemctl restart mariadb >/dev/null 2>&1 || systemctl restart mysql >/dev/null 2>&1 || true fi MYSQL_BIN="" for candidate in mysql mariadb; do if command -v "${candidate}" >/dev/null 2>&1; then MYSQL_BIN="${candidate}" break fi done if [ -z "${MYSQL_BIN}" ]; then log "未找到 mysql/mariadb 客户端,跳过建库" exit 1 fi ready=0 for _ in $(seq 1 30); do if "${MYSQL_BIN}" --protocol=socket -e "SELECT 1" >/dev/null 2>&1; then ready=1 break fi sleep 1 done if [ "${ready}" -ne 1 ]; then log "MariaDB 服务未就绪,跳过建库" exit 1 fi "${MYSQL_BIN}" --protocol=socket <<'SQL' CREATE DATABASE IF NOT EXISTS parking_guide DEFAULT CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS 'parking'@'localhost' IDENTIFIED BY 'parking'; CREATE USER IF NOT EXISTS 'parking'@'%' IDENTIFIED BY 'parking'; GRANT ALL PRIVILEGES ON parking_guide.* TO 'parking'@'localhost'; GRANT ALL PRIVILEGES ON parking_guide.* TO 'parking'@'%'; FLUSH PRIVILEGES; SQL log "MariaDB 安装完成。默认库 parking_guide,账号 parking/parking。" log "局域网可用只读工具连接板子 3306 端口。"