181 lines
5.4 KiB
Bash
181 lines
5.4 KiB
Bash
#!/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 端口。"
|