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 端口。"
|