181 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/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"
 | ||
| }
 | ||
| 
 | ||
| # 查找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,正在尝试卸载..."
 | ||
|         # 停止docker服务 避免u盘占用
 | ||
|         /etc/init.d/docker stop
 | ||
|         sleep 2
 | ||
|         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 |