- https://github.com/immortalwrt/immortalwrt
- https://openwrt.org/docs/guide-developer/toolchain/use-buildsystem
- 生产环境不推荐使用snapshot代码,可以直接使用官方正式版本。
源码编译
安装依赖环境
https://openwrt.org/docs/guide-developer/toolchain/install-buildsystem
debian系使用apt安装。ImmortalWRT也可使用脚本,推荐debian 11。
# >=Ubuntu 24.04, python 3.12
sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses5-dev libssl-dev \
python3-setuptools rsync swig unzip zlib1g-dev file wget
# ImmortalWRT脚本
sudo bash -c 'bash <(curl -s https://build-scripts.immortalwrt.org/init_build_environment.sh)'
拉取代码
由于我用的是ImmortalWRT,相对更加符合国情,所以后续按ImmortalWRT来,OpenWRT应该也差不多,很多步骤都是参考的OpenWRT docs。
git clone -b master --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt
# 授权
chmod 777 immortalwrt
# 解析并更新软件包源,生成索引
./scripts/feeds update -a
# 解析索引文件,创建符号链接指向实际软件包目录,安装依赖
./scripts/feeds install -a
配置菜单
https://www.youtube.com/watch?v=jEE_J6-4E3Y
5. menuconfig 功能简述 — [野火]OpenWrt用户手册—基于LubanCat-RK系列板卡 文档
https://www.bilibili.com/video/BV1LWDoYHEfE
一看就会!ImmortalWrt编译教程,定制自己的路由器固件-小陈折腾日记
make menuconfig进入。



-
回车进入子项,双击Esc返回上级,Y勾选,N取消勾选。
-
Target System: 可以通过固件查找器查看自己的硬件要用什么固件。
-
160 MB 根分区大小对于 squashfs 足够;ext4 建议 256+。如果不带什么额外应用,原始就40MB左右。当然也可以有多大装多大,个人经测试300不够。
-
即便有虚拟机安装的需求,虚拟机格式打包也不是必须的。
-
大坑!!!:OpenWrt包管理器已从 opkg 更改为 apk,因此找不到luci-app-opkg是正常的,目前勾选的包管理器为
apk-openssl,有些问题,可以在Base system中勾选上opkg。
个人安装luci app
不认识的参考恩山
luci-app-attendedsysupgrade 在线升级luci-app-ddns-go DDNSluci-app-snmpd 旁路由需要安装luci-app-passwallluci-app-vnstat2 流量统计luci-app-zerotier 内网穿透
安装软件可以系统装完后再弄。
编译
# 8线程预下载,打印日志
make download -j8 V=s
# 调用所有线程编译
make -j$(nproc) V=s
编译时发生错误,使用{bash}make -j1 V=sc 2>&1 | tee build.log单线程输出日志,查看显示
configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
表示不能用sudo,将代码目录权限移交。
sudo chown -R admin000:admin000 ../immortalwrt/
最后生成的镜像在./bin/targets下面。
# 纯内核镜像(bzImage)
immortalwrt-x86-64-generic-kernel.bin
# 根文件系统打包(不含内核、不含引导)
immortalwrt-x86-64-generic-rootfs.tar.gz
# 只读 squashfs 根文件系统镜像(不含内核、不含引导)
immortalwrt-x86-64-generic-squashfs-combined-efi.img.gz
# BIOS/MBR 完整启动盘:内核 + rootfs + GRUB(传统 BIOS 启动)
immortalwrt-x86-64-generic-squashfs-combined.img.gz
# UEFI/EFI 完整启动盘:内核 + rootfs + GRUB-EFI。
immortalwrt-x86-64-generic-squashfs-rootfs.img.gz
解压获得完整镜像
gzip -d ./bin/targets/x86/64/immortalwrt-x86-64-generic-squashfs-combined.img.gz
| 方面 | ext4 (immortalwrt-x86-64-generic-ext4-combined-efi.img.gz) | squashfs (immortalwrt-x86-64-generic-squashfs-combined-efi.img.gz) |
|---|---|---|
| 文件系统类型 | ext4(可写、日志文件系统) | squashfs(只读、压缩文件系统) |
| 根分区大小 | 通常较大(默认 ~500MB+,可直接扩展) | 较小(默认 ~100-200MB,压缩节省空间) |
| 存储使用 | 占用更多磁盘空间,但易于直接修改和扩展 | 占用更少空间(20-30% 节省),但需 overlay(覆盖层)存储变更 |
| 可写性 | 根分区直接可写,便于安装包、修改配置,无需额外分区 | 根分区只读,使用 overlayfs(upper 层)记录变更;修改文件时会复制到 RAM 或额外分区 |
| 稳定性与恢复 | 易受意外断电影响(可能文件系统损坏),恢复需备份或 sysupgrade | 更高稳定性(只读核心不易损坏),易恢复到出厂状态(擦除 overlay 即可) |
| 性能 | 读写速度快,适合 x86 高性能场景(如大流量路由) | 解压开销稍高,但 x86 上影响小;适合嵌入式或低资源设备 |
| 适用场景 | 推荐用于 PC/VM,需要频繁安装软件包或大存储的场景 | 推荐用于稳定性优先、空间有限或易恢复的场景(如测试环境) |
| 文件大小 | 较大(~200-300MB 压缩后) | 较小(~100-200MB 压缩后) |
| 升级方式 | sysupgrade 支持,但需 -f 选项跳过校验 | sysupgrade 标准支持,易回滚 |
测试&配置
squashfs是只读格式,进行的改动会被写进overlay层,因此可以启动一个虚拟机进行一些调试和配置,完成后再将img文件烧录进路由的内置硬盘中直接使用。
进来后看到一堆有的没的,理论上应该会显示immortalwrt的logo,可能被滚掉了。

先passwd设置root密码,然后vi /etc/config/network或者if config查看是否自动分配了ip,如果没有,可以使用
# 旧式option语法
uci set network.lan.ipaddr='192.168.1.2'
uci set network.lan.gateway='192.168.1.1'
uci set network.lan.netmask='255.255.255.0'
uci set network.lan.dns='192.168.1.1 8.8.8.8'
# uci list语法
uci del_list network.lan.ipaddr='192.168.1.15/24'
uci add_list network.lan.ipaddr='192.168.2.15/24'
uci set network.lan.gateway='192.168.1.1'
uci set network.lan.dns='192.168.1.1 8.8.8.8'
uci commit
/etc/init.d/network restart
来更改network文件,和直接修改效果是一样的。
config interface 'lan'
option device 'br-lan'
option proto 'static'
list ipaddr '192.168.2.15/24'
option gateway '192.168.1.1'
option dns '192.168.1.1 8.8.8.8'
问题
luci/getFeatures failed with error -32000: Object not found
Luci错误 · Issue #862 · immortalwrt/immortalwrt
https://github.com/immortalwrt/immortalwrt/discussions/1359
cd /usr/share/rpcd/ucode
chmod 644 luci
service rpcd restart
使用容器预构建环境
https://openwrt.org/docs/guide-user/additional-software/imagebuilder
docker pull openwrt/imagebuilder
未完工
直接使用image builder
去对应版本的下载页面找到image builder下载
# 安装 zstd 解压工具(如未安装)
sudo apt install zstd
# 解压
tar --zstd -xvf immortalwrt-imagebuilder-24.10.5-x86-64.Linux-x86_64.tar.zst
cd immortalwrt-imagebuilder-24.10.5-x86-64.Linux-x86_64
# 查看可用配置
make info
# 基础构建(默认配置)
make image
# 指定特定profile(如x86-64通用)
make image PROFILE="generic"
# 添加额外软件包
make image PACKAGES="luci luci-i18n-base-zh-cn openssh-sftp-server"
# 移除默认软件包(加-前缀)
make image PACKAGES="-dnsmasq dnsmasq-full"
mkdir -p files/etc/config
文件夹下写入想要配置的文件
最后执行的命令
make image \
CONFIG_TARGET_KERNEL_PARTSIZE=32 \
CONFIG_TARGET_ROOTFS_PARTSIZE=8192 \
PACKAGES="luci-i18n-argon-config-zh-cn luci-i18n-firewall-zh-cn \
luci-app-zerotier openssh-sftp-server pciutils \
luci-i18n-ddns-go-zh-cn e2fsprogs fdisk lsblk" \
FILES="files/" \
EXTRA_IMAGE_NAME="blueop"