#!/bin/sh red() { echo -e "\033[31m\033[01m$1\033[0m" } green() { echo -e "\033[32m\033[01m$1\033[0m" } yellow() { echo -e "\033[33m\033[01m$1\033[0m" } blue() { echo -e "\033[34m\033[01m$1\033[0m" } light_magenta() { echo -e "\033[95m\033[01m$1\033[0m" } light_yellow() { echo -e "\033[93m\033[01m$1\033[0m" } lsblk_url="https://raw.githubusercontent.com/wukongdaily/gl-inet-onescript/master/mt-6000/lsblk.ipk" install_lsblk() { # 查找 lsblk 包 if opkg find lsblk | grep -q lsblk; then # 检查 lsblk 是否已经安装 if opkg list-installed | grep -q lsblk; then blue "系统已包含必备组件lsblk" else blue "正在安装查找USB设备所需要的依赖 lsblk ..." opkg install lsblk >/dev/null 2>&1 # 再次验证安装是否成功 if opkg list-installed | grep -q lsblk; then green "lsblk 安装成功." else red "lsblk 安装失败." exit 1 fi fi else echo "lsblk package not found, attempting to download and install from URL..." mkdir -p /tmp/mt6000 wget -q -O /tmp/mt6000/lsblk.ipk $lsblk_url opkg install /tmp/mt6000/lsblk.ipk >/dev/null 2>&1 if opkg list-installed | grep -q lsblk; then green "formURL lsblk 安装成功." else red "formURL lsblk 安装失败." exit 1 fi fi } green "正在查找USB设备分区,请稍后......" opkg update >/dev/null 2>&1 install_lsblk # 查找USB设备分区 USB_DEVICES=$(lsblk -o NAME,RM,TYPE | grep '1 part' | awk '{print $1}') if [ -z "$USB_DEVICES" ]; then echo "未找到USB设备分区。" exit 1 fi # 遍历所有找到的USB设备分区 for USB_DEVICE_PART in $USB_DEVICES; do # 移除不必要的字符 CORRECTED_PART=$(echo $USB_DEVICE_PART | sed 's/[^a-zA-Z0-9]//g') echo "找到USB设备分区: /dev/$CORRECTED_PART" # 检查USB设备分区是否已挂载,这是glinet自动挂载点 /tmp/mountd/diskX_partX AUTOMOUNT_POINT=$(mount | grep "/dev/$CORRECTED_PART " | awk '{print $3}') if [ -n "$AUTOMOUNT_POINT" ]; then echo "设备分区已挂载在 $AUTOMOUNT_POINT,正在尝试卸载..." if ! command -v docker & >/dev/null then echo "Docker is not installed, skipping Docker stop procedure." # 直接执行后续操作或退出 else # 尝试停止 Docker 服务 /etc/init.d/docker stop # 等待 docker 守护进程停止 while true; do # 检查 docker 守护进程是否停止 if ! docker ps >/dev/null 2>&1; then echo "Docker daemon has stopped." break # 跳出循环 else echo "Waiting for Docker daemon to stop..." sleep 1 # 等待1秒再次检查 fi done fi # 在此处执行卸载或其他操作 umount /dev/$CORRECTED_PART if [ $? -eq 0 ]; then echo "卸载成功。" else echo "卸载失败,请检查设备是否正被使用。" exit 1 fi else echo "设备分区未挂载。" fi # 格式化分区为EXT4,你可以根据需要更改为其他文件系统类型 red "正在格式化U盘: /dev/$CORRECTED_PART 为 EXT4..." mkfs.ext4 -F /dev/$CORRECTED_PART if [ $? -eq 0 ]; then green "格式化成功。" else red "\n U盘格式化失败" exit 1 fi done yellow "为Docker Root 创建挂载点..." USB_MOUNT_POINT="/mnt/upan_data" DOCKER_ROOT="$USB_MOUNT_POINT/docker" mkdir -p $DOCKER_ROOT green "将挂载 U 盘到 $DOCKER_ROOT..." mount -t ext4 /dev/$CORRECTED_PART $USB_MOUNT_POINT # 检查挂载命令的退出状态 if [ $? -ne 0 ]; then red "挂载失败,脚本退出。" exit 1 fi green "U盘挂载成功啦\n" green "正在创建 Docker 配置文件 /etc/docker/daemon.json" mkdir -p /etc/docker echo '{ "bridge": "docker0", "storage-driver": "overlay2", "data-root": "'$DOCKER_ROOT'" }' >/etc/docker/daemon.json # 安装 Docker 和 dockerd opkg update green "正在安装 Docker及相关服务..." opkg install luci-app-dockerman >/dev/null 2>&1 opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1 opkg install dockerd --force-depends >/dev/null 2>&1 if [ $? -eq 0 ]; then green "Docker 安装成功。" else light_magenta "Docker 安装失败。" fi # 创建并配置启动脚本 green "正在设置 Docker 跟随系统启动" cat <<'EOF' >/etc/init.d/docker #!/bin/sh /etc/rc.common START=99 USE_PROCD=1 PROG="/usr/bin/dockerd" start_service() { procd_open_instance procd_set_param command $PROG --config-file /etc/docker/daemon.json procd_set_param stdout 1 procd_set_param stderr 1 procd_close_instance } stop_service() { killall dockerd } restart() { stop start } EOF # 使启动脚本可执行并启用自启动 chmod +x /etc/init.d/docker /etc/init.d/docker enable /etc/init.d/docker start green "设置开机挂载U盘后 再启动Docker" # 首先,备份 /etc/rc.local cp /etc/rc.local /etc/rc.local.backup # U盘分区 /dev/sdx USB_DEVICE_PART="/dev/$CORRECTED_PART" # glinet系统重启后的 USB自动挂载点 SYSTEM_USB_AUTO_MOUNTPOINT="/tmp/mountd/disk1_part1" # 卸载USB自动挂载点 挂载自定义挂载点 /mnt/upan_data if ! grep -q "umount $SYSTEM_USB_AUTO_MOUNTPOINT" /etc/rc.local; then sed -i '/exit 0/d' /etc/rc.local # 将新的命令添加到 /etc/rc.local,然后再加上 exit 0 { echo "umount $SYSTEM_USB_AUTO_MOUNTPOINT || true" echo "mount $USB_DEVICE_PART $USB_MOUNT_POINT || true" echo "/etc/init.d/docker start || true" echo "exit 0" } >>/etc/rc.local fi cat /etc/rc.local # 修改 /etc/config/dockerd 文件中的 data_root 配置 sed -i "/option data_root/c\ option data_root '/mnt/upan_data/docker/'" /etc/config/dockerd # 重启dockerd /etc/init.d/docker restart sleep 2 # 检查Docker是否正在运行 if ! docker info >/dev/null 2>&1; then red "Docker 启动失败" else DOCKER_ROOT_DIR=$(docker info 2>&1 | grep -v "WARNING" | grep "Docker Root Dir" | awk '{print $4}') light_magenta "当前Docker根目录为: $DOCKER_ROOT_DIR" light_yellow "Docker根目录剩余空间:$(df -h $DOCKER_ROOT_DIR | awk 'NR==2{print $4}')" green "OK,Docker启动成功,建议重启一次" fi yellow "Docker 部署完毕,重启路由器来验证Docker是否正常工作。现在重启吗?(y/n)" read -r answer if [ "$answer" = "y" ] || [ -z "$answer" ]; then yellow "正在重启路由器..." reboot else # 检查Docker是否正在运行 if ! docker info >/dev/null 2>&1; then yellow "您还没有启动Docker。" exit 1 else green "好吧,不重启也能用,建议先查看Docker根目录是否正确再开始使用。" fi fi