ImmortalWrt自定义固件编译方法之一:ImageBuilder

Image Builder是一个预编译环境,适用于创建自定义映像,无需从源代码编译,支持下载预编译软件包并将其集成进固件中。

  • Image Builder仅在64位Linux中运行
  • 测试环境为Ubuntu 24.04,设备为x86/64
  • 以非root用户运行

安装依赖

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
sudo apt update
sudo apt install build-essential clang flex bison g++ gawk \
gcc-multilib g++-multilib gettext git libncurses-dev libssl-dev \
python3-distutils python3-setuptools rsync swig unzip zlib1g-dev file wget

其余系统参阅Build system setup

获取Image Builder

进入ImmortalWrt Download页面

选择需要编译的版本

建议选择最新的Release版本

选择设备型号

获取Immage Builder并解压缩

Supplementary Files下找到immortalwrt-imagebuilder-23.05.4-x86-64.Linux-x86_64.tar.xz,鼠标右键复制链接地址,在Ubuntu中输入以下命令:

wget https://downloads.immortalwrt.org/releases/24.10.1/targets/x86/64/immortalwrt-imagebuilder-24.10.1-x86-64.Linux-x86_64.tar.zst  # 链接地址为刚鼠标右键复制所得

# 解压缩
tar -I zstd -xv immortalwrt-imagebuilder-24.10.1-x86-64.Linux-x86_64.tar.zst

# 进入解压缩后的文件夹
cd immortalwrt-imagebuilder-24.10.1-x86-64.Linux-x86_64

Image Builder 统一命名为 immortalwrt-imagebuilder[-<version>]-<platform>.Linux-<ib_arch>.tar.xz

使用Immage Builder编译固件

Immage Builder可使用的变量:

变量 描述
PROFILE 指定需要构建的设备
PACKAGES 需要集成进固件的软件包列表
FILES 要集成的自定义文件的目录
BIN_DIR 固件输出文件夹(默认 bin)
EXTRA_IMAGE_NAME 自定义附加固件文件名
DISABLED_SERVICES /etc/init.d 中要禁用的服务名称,如 dnsmasq 的 dhcp

确定设备

PROFILE 变量指定要构建的目标固件,运行 make info可以获取可用的设备列表以及默认软件包配置。

PROFILE="generic"

增加或删除软件包

PACKAGES="pkg1 pkg2 pkg3 -pkg4 -pkg5 -pkg6"
  • 示例为增加pkg1、pkg2、pkg3,并去除 pkg4、pkg5、pkg6
  • 可通过以下地址获取ImmortalWrt所有可用软件包
    • https://downloads.immortalwrt.org/releases/23.05.4/packages/x86_64/packages/
    • https://downloads.immortalwrt.org/releases/23.05.4/packages/x86_64/luci/
  • 在Image Builder中,opkg不会自动安装翻译文件,如需安装LuCI插件和翻译包,要优先写翻译包的名称。如luci-i18n-zerotier-zh-cn

自定义软件包

如果想要把ImmortalWrt没有的软件包集成到固件中,可将ipk文件放到根目录下的packages文件夹中,并将其添加到PACKAGES变量中。

自定义文件夹

FILES变量允许将自定义配置文件包含在构建的固件中,比如修改默认的LAN IP地址,在files/etc/uci-defaults目录下(如不存在请新建)新建99-custom文件

#!/bin/sh

#修改lan IP
uci -q batch << EOI
set network.lan.ipaddr='192.168.31.1'

EOI
exit 0

自定义配置

有一些配置无法通过变量来指定,需要通过手动修改.config文件,
Root filesystem images中的

CONFIG_ISO_IMAGES=y
修改为:
# CONFIG_ISO_IMAGES is not set
可取消构建ISO固件
还可以修改kernel和rootfs的大小:

CONFIG_TARGET_KERNEL_PARTSIZE=64
CONFIG_TARGET_ROOTFS_PARTSIZE=1024

添加自定义软件源

编辑根目录的repositories.conf文件,注释掉option check_signature并加入自己软件源即可

## Place your custom repositories here, they must match the architecture and version.
# src/gz %n https://downloads.openwrt.org/releases/23.05.5
# src custom file:///usr/src/openwrt/bin/x86/packages

## Remote package repositories
src/gz openwrt_core https://downloads.openwrt.org/releases/23.05.5/targets/x86/64/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/23.05.5/packages/x86_64/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/23.05.5/packages/x86_64/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/23.05.5/packages/x86_64/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/23.05.5/packages/x86_64/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/23.05.5/packages/x86_64/telephony
src/gz openwrt_kenzok8_ackage https://op.dllkids.xyz/packages/x86_64/

## This is the local package repository, do not remove!
src imagebuilder file:packages

# option check_signature

kenzok8这个软件源更新比较快,尴尬的是因为下载量大服务器的流量不够用,二是https证书经常过期

构建固件

选择好配置文件、插件和自定义文件夹后,使用make image命令构建固件:

make image PROFILE="profile-name" PACKAGES="pkg1 pkg2 pkg3 -pkg4 -pkg5 -pkg6" FILES="files"

编译好的固件存放于bin目录下

清理编译

要清理临时构建文件和生成的固件,使用make clean命令

例子

make image \
PROFILE="generic" \
PACKAGES="-automount -block-mount -kmod-r8101 -kmod-r8125 -kmod-r8126 -kmod-r8168 -kmod-usb-hid -kmod-usb-net -kmod-usb-net-asix -kmod-usb-net-asix-ax88179 -kmod-usb-net-rtl8150 -kmod-usb-net-rtl8152-vendor open-vm-tools open-vm-tools-fuse luci-i18n-ttyd-zh-cn luci-i18n-nikki-zh-cn luci-i18n-vlmcsd-zh-cn luci luci-i18n-base-zh-cn luci-i18n-package-manager-zh-cn" ROOTFS_PARTSIZE="1024" \
FILES="files" \
EXTRA_IMAGE_NAME="Release"

如骗译过程中报qcow2 error错误,可使用以下命令修复:

sudo apt install qemu-utils