环境说明
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 这几个端口
