你是否想过编译自己的 OpenWrt 镜像以精简官方或第三方镜像中的不必要功能或增加自己需要的功能?
由于 OpenWrt 的编译涉及几乎所有软件包的从头编译与 Linux 内核的编译, 曾经想自己编译镜像的我怕麻烦而放弃. 不过当真正开始了解编译步骤后却发现其实并没有想象中那么难.
准备
编译 OpenWrt 需要 Linux 系统, 我选择 Ubuntu 24.04.
路由器我以 Cudy TR3000 为例. (此文章只提供镜像编译教程, 具体的 Cudy TR3000 刷机教程应当参考其他文章.)
克隆 OpenWrt 的仓库并切换到最新稳定版:
git clone https://github.com/openwrt/openwrt.gitcd openwrtgit checkout v25.12.4 # 替换为最新正式版安装编译所需依赖包:
sudo apt install make gcc g++ # 编译工具sudo apt install unzip bzip2 # 压缩工具sudo apt install libncurses-dev # 所需依赖库配置软件包源
如果需要官方软件源以外的第三方源, 需要创建 feeds.conf 覆盖默认 feed 配置并添加自定义软件源配置.
首先在 openwrt 创建一个新文件 feeds.conf 并将 feed.conf.default 的所有内容复制粘贴到 feeds.conf.
之后回车添加空行并在新行添加自定义软件源. feeds.conf 支持使用 “#” 添加注释.
文件源使用以下格式:
src-link <软件源名称> /path/to/feed仓库源使用以下格式:
src-git <软件源名称> <git 仓库 http 克隆链接> # 默认分支src-git <软件源名称> <git 仓库 http 克隆链接>;<分支名> # 指定分支src-git <软件源名称> <git 仓库 http 克隆链接>^<提交哈希> # 指定提交软件源应当满足拥有任意层级的子目录, 子目录下存放软件源码.
例如, 我的自定义本地源结构如下:
openwrt-local-feed/ (配置中指定的软件源目录)├── luci-theme-argon/ (在上层目录中克隆该项目)└── ...我的 feeds.conf 内容如下:
src-git packages https://git.openwrt.org/feed/packages.git^f91b06b3faff7ad3c8cbeb1ab39cef680d2f28edsrc-git luci https://git.openwrt.org/project/luci.git^e9ebca7598ce2f754b76267fd66bf2b85e6e4347src-git routing https://git.openwrt.org/feed/routing.git^b2097c85bef85251364f59a6b2a3ed1f9f5c0c21src-git telephony https://git.openwrt.org/feed/telephony.git^2618106d5846a4a542fdf5809f0d3ed228ce439bsrc-git video https://github.com/openwrt/video.git^094bf58da6682f895255a35a84349a79dab4bf95
src-link local /home/hanataka2137/workspace/openwrt-local-feed配置完成后执行:
./scripts/feeds update -a./scripts/feeds install -a更新所有软件源并使其可用.
配置编译目标
执行:
make menuconfig打开配置 TUI.

选择第一个选项并按 Enter 进入目标选择界面, 选择符合你的路由器 CPU 架构的选项并按 Enter 确认.
我的 Cudy TR3000 的 CPU 为 Mediatek MT7981,为默认 MeduaTek ARM 架构, 所以我直接回车.

选择后会返回配置 TUI 主页, 选择第二项并回车进入子目标选择界面, 选择符合你的路由器 CPU 型号的选项并按 Enter 确认.
由于我需要的配置与默认值相同, 我再次直接回车.

选择后再次返回配置 TUI 主页, 选择第三项并回车进入后选择路由器的详细型号并回车确认.
我这里切换到 Cudy TR3000 v1 并回车.

完成后先不要退出 menuconfig, 接下来配置软件包.
配置软件包
按下箭头切换到 menuconfig 下面的选项, 注意到有几个类别, 代表了软件包的类别, 切换到对应类别并按 Enter 进入后会出现软件包与更细致的子类别列表.
切换到需要配置的软件包, 按空格切换安装状态, 尖括号内为空格是未安装, “M” 为只编译, “*” 为编译后内置到镜像中.
例如:
我需要添加 LuCI 作为管理界面(默认不包含), 所以我依次选择 LuCI, Collections, luci, 按空格将状态切换为内置安装.

我需要 LuCI 的中文翻译包, 所以我依次选择 LuCI, Modules, translations, Simplified Chinese (zh_Hans), 按空格将状态切换为内置安装.

我需要添加 Argon 主题, 所以我依次选择 LuCI, Themes, luci-theme-argon, 按空格将状态切换为内置安装.

我还需要全功能的 wpad, 所以我依次次选择 Network, Wireless APD. 选择 wpad-mbedtls 并切换到内置安装状态, 选择 wpad-basic-mbedtls 并切换到未安装状态.

编译
选择到 Exit 按钮并按 Enter 退出 menuconfig, 在确认界面选择 YES 保存配置.
一般情况下使用:
make -j1 V=s即可编译镜像.
不过首次编译只能使用单线程避免竞态条件编译失败, 编译需要很长时间. 直接执行上面的命令会将任务绑定到终端, 退出终端后任务停止. 编译时只能将终端一直开着, 很不方便.
这里推荐用 tmux 将任务挂到后台执行, 编译时可以退出终端干别的事.
输入:
tmux new -s openwrt-compile创建一个名为 openwrt-compile 的会话并进入.
此时再运行:
make -j1 V=s开始编译.
在 tmux 的会话中按 “Ctrl+B” 后再按一下 “D” 可以退出此会话, 但任务会在后台运行不会停止.
如果想返回会话查看编译进度可以执行:
tmux attach进入上一次进入的会话, 或执行:
tmux attach -t openwrt-compile指定进入的会话名称.
编译完成后镜像存放在 bin/targets/<编译目标名>/<编译子目标名>/ 中.