构建 OpenWrt
OpenWrt 是一个基于 Linux 的路由器操作系统。如果只是想给自己的路由器安装 OpenWrt 的话,使用别人预构建的 OpenWrt 固件就可以了。当然如果你闲得没事干,也可以自己构建固件。下面记录了构建 OpenWrt 固件的过程。
Prerequisites
- CPU:必须为 AMD64 架构
- 操作系统:Ubuntu 22.04
- 非 root 用户
- 15 GB 空闲磁盘空间
Build
-
安装依赖:
sudo apt update -y sudo apt full-upgrade -y sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ bzip2 ccache clang cmake cpio curl device-tree-compiler ecj fastjar flex gawk gettext gcc-multilib \ g++-multilib git gnutls-dev gperf haveged help2man intltool lib32gcc-s1 libc6-dev-i386 libelf-dev \ libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5 \ libncursesw5-dev libpython3-dev libreadline-dev libssl-dev libtool lld llvm lrzsz mkisofs msmtp \ nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip python3-ply \ python3-docutils python3-pyelftools qemu-utils re2c rsync scons squashfs-tools subversion swig \ texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev zstd- 注意,Ubuntu 24.04 有些库会安装失败,需要手动安装。
- 如果使用 WSL 构建,一定要重设
PATH环境变量使其不包含 Windows 带空格的路径。参见:Build system setup WSL | OpenWrt
-
克隆源代码库
OpenWrt 项目有多个子分支。其中:
- ImmportalWrt 是根据国人需求改进的 OpenWrt 分支。
- 本文用到的 ImmportalWrt-MT798X 是 @hanwckf 在 ImmportalWrt v21.02 的基础上为 MediaTek MT798X 系列芯片做的适配。
%%{init: { 'gitGraph': {'mainBranchName': 'OpenWrt', 'showCommitLabel': false }} }%% gitGraph commit commit branch ImmortalWrt commit commit tag: "v21.02" branch ImmortalWrt-MT798X commit commit commit checkout OpenWrt commit checkout ImmortalWrt commit克隆你需要的库:
# OpenWrt git clone -b <branch> --single-branch --filter=blob:none https://github.com/openwrt/openwrt.git cd openwrt # ImmortalWrt git clone -b <branch> --single-branch --filter=blob:none https://github.com/immortalwrt/immortalwrt cd immortalwrt # ImmortalWrt-798X git clone --filter=blob:none https://github.com/hanwckf/immortalwrt-mt798x cd immortalwrt-mt798xbranch:
-
更新 feeds
-
(可跳过)编辑 feeds 配置文件
feeds.conf。在这里可以配置你想要安装的插件。 -
更新并安装 feeds:
# 更新 feeds.conf / feeds.conf.default 中定义的软件包源的索引 ./scripts/feeds update -a # 请确认命令是否执行成功 # 根据更新后的索引从源中下载并安装所有包到 package/feeds 目录 ./scripts/feeds install -a -
-
配置构建选项:
make menuconfig # 为工具链、目标系统和固件包选择首选配置方向键选中条目,回车键应用下方的操作,左右键切换操作。
-
首先配置构建系统的目标平台。需要设置
Target System、Subtarget、Target Profile三个选项。Target System:构建系统的目标架构,指定你要构建的固件的硬件平台类型。常见的目标系统包括Atheros AR7xxx/AR9xxx、Broadcom BCM27xx、MediaTek Ralink MIPS等等。
-
Subtarget:有些目标系统会有不同的子目标,代表更具体的硬件配置或变种。对于某些 SoC,不同的子目标可能代表不同的芯片型号或者不同的硬件功能。 -
Target Profile:目标配置文件,指定具体的设备级别。包括了特定设备的硬件特性和配置,例如内存大小、闪存布局、网卡配置等。
以我的 Redmi AX6000 为例,构建系统的配置如下:
Target System: MediaTek Ralink ARMSubtarget: MT7986Target Profile: Xiaomi Redmi Router AX6000
-
接下来配置目标固件镜像格式(
Target Image)。这里介绍一下常用选项:Root filesystem images
将构建的 OpenWrt 系统的根目录
/打入映像文件。这里我们可以选择磁盘映像内的文件系统:-
ext4:常用的 Linux 文件系统,支持读写操作。如果你的固件要刷入 PC 机或虚拟机,那么可以使用这种文件系统。 -
squashfs:一种只读的压缩文件系统,常用于嵌入式设备以减少存储空间占用。-
Build GRUB EFI images:构建适用于 EFI(UEFI 前身)硬件的 x86 平台的 GRUB 引导镜像。现在的嵌入式设备都是 EFI 了。Build LiveCD image (ISO):构建一个可引导的 ISO 镜像文件,如果你要往 PC 机刷固件的话可以用这种格式Build VMware image files (VMDK):构建适用于 VMware 虚拟机的 VMDK 镜像文件GZip Images:将生成的固件映像文件进行 GZip 压缩
-
-
-
上面的配置都与你的目标平台有关。从现在开始你可以定制自己的 OpenWrt 了。这里我们主要修改
LuCI菜单下的Collections、Applications和Themes配置。*表示将模块包含进固件(按Y)M表示将模块单独编译,不会包含进固件(按M)(空白)表示不编译该模块(按N)
首先将
LuCI -> Collections -> LuCI选中,这将启用 LuCI Web 配置界面。接下来在LuCI -> Applications中选中你喜欢的插件。然后在LuCI -> Themes中选择你喜欢的主题。最后在LuCI -> Modules -> Translations选择语言。 -
配置完成后退出并保存。配置文件将被保存到项目根目录下的
.config文件中。
更多关于插件的解释可以参见:OpenWrt 编译 LuCI -> Applications 添加插件应用说明-L大【2022.11.28】| 恩山无线论坛
-
-
构建固件
make -j$(nproc) # 下载依赖,然后使用多线程构建构建过程需要 2 个小时左右。
该命令会:
- 编译工具链
- 用工具链交叉编译源文件
- 创建
opkg软件包 - 创建镜像
Artifacts
- 构建产物位于
bin/targets/{platform}/{subtarget}/目录中。 - 构建时生成的工具链位于
staging_dir/toolchain-{arch}_gcc-{gcc-version}_musl
一个完整的 OpenWrt 固件由两部分组成:rootfs(根文件系统)和 kernel(内核)。这两部分共同组成了设备启动和运行所需的基本软件环境。
- 内核:
openwrt-{arch}-kernel.bin - 根文件系统:
openwrt-{arch}-squashfs-rootfs.bin
在实践中,OpenWrt 通常会将这两部分结合起来生成一个完整的固件映像文件,例如:
openwrt-{arch}-squashfs-sysupgrade.bin:用于系统升级的固件映像。openwrt-{arch}-squashfs-factory.bin:用于初次刷入设备的固件映像。openwrt-{arch}-combined.bin:一些平台会生成结合了内核和根文件系统的单一镜像文件。
此外,在构建过程中 OpenWrt 还会生成一些元数据文件:
config.buildinfo记录了构建过程中使用的所有配置选项feeds.buildinfo记录了构建过程中使用的所有软件包源openwrt-{arch}.manifest记录了构建过程中所选的所有软件包及其版本信息packages文件夹包含了根据你的配置编译和打包的所有软件包sha256sums包含了所有生成文件的 SHA-256 校验和version.buildinfo记录了当前构建所使用的 OpenWrt 版本信息,包括主版本号、分支名称、Git 提交哈希等。profiles.json包含了构建目标(profiles)的详细信息。这对于了解支持的设备、生成的固件以及配置特性非常有用。
Clean
在开始新的构建前,你可能想要清理上次构建的产物。
-
清理构建产物(删除
/bin和/build_dir中的内容):make clean -
完全清理(删除
/bin、/build_dir、/staging_dir(工具和交叉编译工具链)、/tmp(有关软件包的数据)和/logs中的内容):make dirclean
Appandix
一些名词:
-
Stock firmware:原厂固件
-
Stock layout:原厂分区(容量较小)
-
Uboot layout:U-Boot 大分区(容量较大)
可以在这里找到预构建的固件:
-
U-Boot:OpenWrt 官方开发一个 U-Boot,而恩山论坛大佬们也开发了自己的 U-Boot。OpenWrt 官方的 U-Boot 叫 OpenWrt U-Boot,而恩山大佬们开发的 U-Boot 叫 Custom U-Boot。
-
Breed:另一种 U-Boot
Web 配置界面:
C 标准库:
glibc:GNU C Library,是一个广泛使用的 C 标准库实现,为 Linux 系统上的 C 应用程序提供基本的系统调用接口和标准 C 函数。musl:musl libc,是一个轻量级的标准 C 库实现,旨在提供兼容性和性能优化,特别适用于嵌入式和资源受限的环境。
参见:
- OpenWrt | GitHub
- ImmortalWrt | GitHub
- 固件构建快速入门 | OpenWrt Docs
- Build system usage | OpenWrt Docs
- OpenWrt 固件自编译教程:从入门到酸爽!| 喵斯基部落
Troubleshooting
Ubuntu 24.04 无法安装 Python2.7



浙公网安备 33010602011771号