环境说明

Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-26-generic x86_64)

获取镜像

https://pan.yuos.top/s/oRhO?path=%2Fopenwrt%2F20250611

  • 我这里以X86为例,下载后解压
    1749712362-329318-image.png

    上传镜像

    1749712362-329318-image.png

    安装插件

    sudo apt-get install -y \
      util-linux \
      multipath-tools \
      rsync \
      tar

    编写脚本

    例如:1.sh

    #!/bin/bash
    
    # 脚本用于在Docker中构建ImmortalWrt本地镜像
    
    # 检查是否有root权限
    if [ "$(id -u)" != "0" ]; then
     echo "此脚本需要root权限运行" 1>&2
     exit 1
    fi
    
    # 检查是否安装了必要的工具
    for tool in losetup kpartx tar docker; do
      if ! command -v $tool &> /dev/null; then
          echo "错误: 请安装 $tool"
          exit 1
      fi
    done
    
    # 检查是否提供了镜像文件
    if [ $# -eq 0 ]; then
      echo "用法: $0 <immortalwrt镜像文件>"
      exit 1
    fi
    
    IMMORTALWRT_IMG=$1
    WORK_DIR=$(mktemp -d)
    OUTPUT_DIR="$WORK_DIR/output"
    CONTAINER_NAME="immortalwrt-container"
    
    echo "开始处理镜像: $IMMORTALWRT_IMG"
    echo "工作目录: $WORK_DIR"
    
    # 创建输出目录
    mkdir -p $OUTPUT_DIR
    
    # 挂载ImmortalWrt镜像
    echo "挂载ImmortalWrt镜像..."
    LOOP_DEV=$(losetup --find --show $IMMORTALWRT_IMG)
    PARTITIONS=$(kpartx -av $LOOP_DEV)
    
    # 解析分区设备路径
    ROOT_PART=$(echo "$PARTITIONS" | grep "p2" | awk '{print $3}')
    if [ -z "$ROOT_PART" ]; then
      ROOT_PART=$(echo "$PARTITIONS" | grep "p1" | awk '{print $3}')
    fi
    
    ROOT_DEV="/dev/mapper/$ROOT_PART"
    
    # 等待设备可用
    sleep 2
    
    # 创建挂载点并挂载根分区
    mkdir -p $WORK_DIR/mnt
    mount $ROOT_DEV $WORK_DIR/mnt
    
    # 复制文件系统内容
    echo "复制文件系统内容..."
    mkdir -p $OUTPUT_DIR/rootfs
    rsync -aHAX $WORK_DIR/mnt/ $OUTPUT_DIR/rootfs/
    
    # 卸载并清理
    echo "清理挂载点..."
    umount $WORK_DIR/mnt
    kpartx -d $LOOP_DEV
    losetup -d $LOOP_DEV
    
    # 创建Dockerfile
    cat > $OUTPUT_DIR/Dockerfile << EOF
    FROM scratch
    ADD rootfs/ /
    CMD ["/sbin/init"]
    EOF
    
    # 构建Docker镜像
    echo "构建Docker镜像..."
    docker build -t immortalwrt:yuos $OUTPUT_DIR
    
    # 清理临时文件
    echo "清理临时文件..."
    rm -rf $WORK_DIR
    
    echo "完成! 已创建Docker镜像: immortalwrt:yuos"
    echo "使用以下命令运行容器:"
    echo "docker run -d --name immortalwrt -p 4080:80 -p 4043:443 -p 4053:53/udp -p 4022:22 immortalwrt:yuos"

    执行构建

    sudo ./1.sh immortalwrt-x86-64-generic-ext4-combined-efi.img 

    1749713624-799662-image.png

创建容器

docker run -d --name immortalwrt \
  -p 4080:80 -p 4443:443 -p 4053:53/udp -p 4022:22 \
  --cap-add=NET_ADMIN \
  --device /dev/net/tun \
  immortalwrt:yuos
  • 记得防火墙放行4080、4443、4053、4022 这几个端口

1749713879-738659-image.png

最后修改:2025 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏