环境说明
Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-26-generic x86_64)
获取镜像
https://pan.yuos.top/s/oRhO?path=%2Fopenwrt%2F20250611
我这里以X86为例,下载后解压
上传镜像
安装插件
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
创建容器
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 这几个端口