源码编译

安装依赖环境

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进入。

config主菜单.png

target_images.png

LuCI.png

个人安装luci app

不认识的参考恩山

  1. luci-app-attendedsysupgrade 在线升级
  2. luci-app-ddns-go DDNS
  3. luci-app-snmpd 旁路由需要安装
  4. luci-app-passwall
  5. luci-app-vnstat2 流量统计
  6. 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文件烧录进路由的内置硬盘中直接使用。

Unraid虚拟机安装OpenWrt_软件应用_什么值得买

进来后看到一堆有的没的,理论上应该会显示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"