使用 imagebuild 在 docker 中编译红米 AX6S 的 OpenWrt 固件

下载安装时所需的镜像,这里使用的是 ubuntu

1
$ sudo docker pull ubuntu:22.04

接下来创建一个容器,并挂把当前目录下的 /imagebuilder 目录挂在到容器中。

1
2
3
4
5
6
$ sudo docker run -d -it \
--name openwrt_imagebuilder \
-v `pwd`/imagebuilder:/root/imagebuilder \
-w /root/imagebuilder \
ubuntu:22.04 \
bash

在容器中安装编译 openwrt 固件所需要的依赖。

1
$ sudo docker exec openwrt_imagebuilder apt-get update && sudo docker exec openwrt_imagebuilder apt-get install -y build-essential libncurses5-dev zlib1g-dev gawk git gettext libssl-dev xsltproc wget unzip python3 curl rsync file

在容器中下载红米AX6S的openwrt imagebuilder 文件。

1
$ sudo docker exec openwrt_imagebuilder bash -c "curl https://downloads.openwrt.org/releases/22.03.3/targets/mediatek/mt7622/openwrt-imagebuilder-22.03.3-mediatek-mt7622.Linux-x86_64.tar.xz | tar Jxv -C /root/imagebuilder"

进入到容器中。

1
$ sudo docker exec -it openwrt_imagebuilder bash

这时默认登录进入的目录为/root/imagebuilder,接下来进入到刚才下载 imagebuilder 的目录中。

1
$ cd ./openwrt-imagebuilder-22.03.3-mediatek-mt7622.Linux-x86_64

首先运行 make info 查看该 imagebuilder 都支持了哪些硬件。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ make info
Current Target: "mediatek/mt7622"
Current Architecture: "aarch64"
Current Revision: "r20028-43d71ad93e"
Default Packages: base-files ca-bundle dropbear fstools libc libgcc libustream-wolfssl logd mtd netifd opkg uci uclient-fetch urandom-seed urngd busybox procd procd-ujail procd-seccomp kmod-leds-gpio kmod-gpio-button-hotplug kmod-mt7615e kmod-mt7615-firmware wpad-basic-wolfssl uboot-envtools dnsmasq firewall4 nftables kmod-nft-offload odhcp6c odhcpd-ipv6only ppp ppp-mod-pppoe
Available Profiles:

# 省略部分输出内容
xiaomi_redmi-router-ax6s:
Xiaomi Redmi Router AX6S
Packages: kmod-mt7915e
hasImageMetadata: 1
SupportedDevices: xiaomi,redmi-router-ax6s

这时会看到这里有一个名为 xiaomi_redmi-router-ax6s 的可用配置,说明官方固件已经支持红米 AX6S。

接下来就开始进行编译固件。

1
2
3
$ make image \
PROFILE="xiaomi_redmi-router-ax6s" \
PACKAGES="luci luci-i18n-base-zh-cn"

简单说明一下该命令参数的意思。

  • PROFILE : 需要编译的配置,不填写的话它会编译默认的配置,比如这个 imagebuilder 中默认的为 bananapi_bpi-r64(貌似就是 make info 出来的第一个配置)。
  • PACKAGES : 编译时需要添加或删除的插件名字,用空格分割。在 imagebuilder 中默认是不带后台管理的插件,因此加上 luci 以及所需语言包。

等待编译结束后,在 ./bin/targets/mediatek/mt7622 目录中就可以看到已经编译好的openwrt的固件了。

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s.manifest
    记录该固件中编译了的插件以及版本

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin
    用于从头开始安装OpenWrt的bin文件

  • openwrt-22.03.3-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-sysupgrade.bin
    用于系统升级的bin文件

请自行解决网络问题。

Optional: 一些额外的小知识

  • 使用 imagebuilder 编译 x86 的固件的时候,在生成固件时会出现以下消息。

    1
    /root/imagebuilder/openwrt-imagebuilder-22.03.3-x86-64.Linux-x86_64/staging_dir/host/bin/grub-bios-setup: warning: Your BIOS Boot Partition is under 1 MiB, please increase its size..

    解决方法是修改 imagebuilder 目录下的 ./target/linux/x86/image/Makefile 文件,在文件中的56行处的 256 改成 1024 后,再次编译即可。
    也可用如下命令直接修改文件内容。

    1
    sed -i 's/256/1024/g' ./target/linux/x86/image/Makefile
  • 如果编译出来的固件只当作AC用,不需要AP的功能的话,可以把 wifi 相关的插件都给去掉后编译,相关的插件如下。

    1
    2
    3
    4
    5
    6
    7
    iw
    iwinfo
    libiwinfo-data
    libiwinfo-lua
    libiwinfo*
    rpcd-mod-iwinfo
    wireless-regdb

    去除插件的方法是在 PACKAGES 中插件名前添加 - 字符标识删除该插件即可。

    1
    PACKAGES="-iw -iwinfo"
  • 编译 OpenWrt 需要在大小写敏感的文件系统中才能运行。

via form Image Builderでカスタムimage作成