236 lines
5.6 KiB
Bash

#!/bin/bash
set -e
echo "========== RK1808 Docker 宿主机初始化 =========="
if [ "$(id -u)" != "0" ]; then
echo "请使用 root 用户执行"
exit 1
fi
DOCKER_MIRROR="https://docker.1panel.live"
CODENAME=$(. /etc/os-release && echo "$VERSION_CODENAME")
ARCH=$(dpkg --print-architecture)
KERNEL=$(uname -r)
echo "[1/8] 系统信息"
uname -a
cat /etc/os-release || true
echo "ARCH=$ARCH"
echo "CODENAME=$CODENAME"
echo "KERNEL=$KERNEL"
echo "[2/8] 安装基础依赖"
apt update
apt install -y ca-certificates curl gnupg lsb-release apt-transport-https kmod
echo "[3/8] 配置 Docker APT 源"
install -m 0755 -d /etc/apt/keyrings
try_docker_repo() {
local name="$1"
local base_url="$2"
echo "尝试 Docker 源: $name -> $base_url"
rm -f /etc/apt/keyrings/docker.asc
rm -f /etc/apt/sources.list.d/docker.sources
if ! curl -L --connect-timeout 15 --retry 3 --retry-delay 2 \
"$base_url/gpg" -o /etc/apt/keyrings/docker.asc; then
echo "$name GPG 下载失败"
return 1
fi
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: $base_url
Suites: $CODENAME
Components: stable
Architectures: $ARCH
Signed-By: /etc/apt/keyrings/docker.asc
EOF
if apt update; then
echo "$name Docker 源配置成功"
return 0
else
echo "$name apt update 失败"
return 1
fi
}
if try_docker_repo "清华源" "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian"; then
echo "使用清华 Docker 源"
elif try_docker_repo "阿里源" "https://mirrors.aliyun.com/docker-ce/linux/debian"; then
echo "使用阿里 Docker 源"
elif try_docker_repo "Docker 官方源" "https://download.docker.com/linux/debian"; then
echo "使用 Docker 官方源"
else
echo "所有 Docker 源配置失败,请检查网络"
exit 1
fi
echo "[4/8] 安装 Docker"
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "[5/8] 配置 Docker 镜像加速和 overlay2 存储驱动"
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"$DOCKER_MIRROR"
],
"log-driver": "none",
"features": {
"containerd-snapshotter": false
},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
echo "当前 Docker 存储驱动:"
docker info | grep -E "Storage Driver|driver-type" -A3 || true
echo "[6/8] 检查 FFmpeg 动态库"
REQUIRED_LIBS="
/lib/libavformat.so.58
/lib/libavcodec.so.58
/lib/libavutil.so.56
/lib/libswresample.so.3
/lib/libswscale.so.5
"
for lib in $REQUIRED_LIBS; do
if [ -e "$lib" ]; then
echo "存在: $lib"
else
echo "缺失: $lib"
fi
done
echo "查找 libswscale:"
find /lib /usr/lib -name "libswscale.so*" || true
if [ ! -e /lib/libswscale.so.5 ] && [ ! -e /usr/lib/libswscale.so.5 ]; then
if [ -e /usr/lib/libswscale.so.5.7.100 ]; then
echo "修复 libswscale.so.5 -> /usr/lib/libswscale.so.5.7.100"
ln -sf /usr/lib/libswscale.so.5.7.100 /usr/lib/libswscale.so.5
ln -sf /usr/lib/libswscale.so.5.7.100 /lib/libswscale.so.5 || true
ldconfig || true
elif [ -e /lib/libswscale.so.5.7.100 ]; then
echo "修复 libswscale.so.5 -> /lib/libswscale.so.5.7.100"
ln -sf /lib/libswscale.so.5.7.100 /lib/libswscale.so.5
ldconfig || true
else
echo "警告: 未找到 libswscale.so.5.7.100,后续可能需要手动补 FFmpeg 库"
fi
fi
echo "[7/8] 检查并加载 RK1808 设备节点"
if [ ! -e /dev/galcore ]; then
echo "/dev/galcore 不存在,尝试加载 galcore.ko"
if [ -e "/lib/modules/$KERNEL/galcore.ko" ]; then
insmod "/lib/modules/$KERNEL/galcore.ko" || true
elif [ -e "/usr/lib/modules/$KERNEL/galcore.ko" ]; then
insmod "/usr/lib/modules/$KERNEL/galcore.ko" || true
else
echo "未找到 galcore.ko"
fi
fi
if lsmod | grep -q "galcore"; then
echo "galcore 模块已加载"
echo "galcore" > /etc/modules-load.d/galcore.conf
depmod || true
if [ -e /dev/galcore ]; then
echo "存在: /dev/galcore"
else
echo "警告: galcore 模块已加载,但 /dev/galcore 不存在"
fi
else
echo "警告: galcore 模块未加载"
fi
for dev in /dev/rga /dev/vpu_service /dev/dri/card0; do
if [ -e "$dev" ]; then
echo "存在: $dev"
else
echo "缺失: $dev"
fi
done
if [ -d /lib/npu ]; then
echo "存在: /lib/npu"
else
echo "缺失: /lib/npu"
fi
echo "[8/8] 输出 Docker 信息"
docker version
echo
docker info | grep -E "Server Version|Storage Driver|Cgroup|Kernel Version|Operating System|Architecture|Registry Mirrors" -A5 || true
echo
echo "========== 初始化结果汇总 =========="
if command -v docker >/dev/null 2>&1; then
echo "Docker: 已安装"
else
echo "Docker: 未安装"
fi
if docker info >/dev/null 2>&1; then
echo "Docker 服务: 正常"
else
echo "Docker 服务: 异常"
fi
if docker info 2>/dev/null | grep -q "$DOCKER_MIRROR"; then
echo "Docker 镜像加速: 已配置 $DOCKER_MIRROR"
else
echo "Docker 镜像加速: 未确认"
fi
if docker info 2>/dev/null | grep -q "Storage Driver: overlay2"; then
echo "Docker 存储驱动: 正常 overlay2"
else
echo "Docker 存储驱动: 异常,未使用 overlay2"
fi
for lib in $REQUIRED_LIBS; do
if [ -e "$lib" ]; then
echo "FFmpeg库: 正常 $lib"
else
echo "FFmpeg库: 缺失 $lib"
fi
done
for dev in /dev/galcore /dev/rga /dev/vpu_service /dev/dri/card0; do
if [ -e "$dev" ]; then
echo "设备节点: 正常 $dev"
else
echo "设备节点: 缺失 $dev"
fi
done
if [ -d /lib/npu ]; then
echo "NPU目录: 正常 /lib/npu"
else
echo "NPU目录: 缺失 /lib/npu"
fi
echo "========== 初始化完成 =========="