前言
有些时候,我们可能需要自己编译openwrt系统,比如有些特殊上网需求的朋友。
再比如经常重装系统的朋友,每次重装都要再次安装上自己要用的插件,比较麻烦。
自己编译系统会是个很好的选择,因为可以将插件直接编译进系统,重装系统时插件、中文包就都自带了。
编译openwrt之前,首先要准备一个操作系统,根据官方文档,openwrt编译支持GNU/Linux、BSD 或 MacOSX 系统(需要区分大小写的文件系统)。
以下操作以linux系统为例。
查看稳定系统版本
因为是路由系统,关乎到网络稳定,所以建议还是选用稳定版系统,而非最新的测试版系统。
在openwrt官网(https://openwrt.org/)我们可以看到稳定版系统版本号。

获取系统源码
在openwrt项目的tags目录,能看到所有openwrt版本,虽然有些版本并不是官网公布的稳定版,但通常这个目录下的版本稳定性都还不错。
https://github.com/openwrt/openwrt/tags
选择版本之前需要关注自己需要的插件支持的系统版本,比如有些插件可能只兼容openwrt18,有些可能只兼容openwrt19,而并没有支持最新的21系统。
我选择的是编译最新的稳定版本:v21.02.1,因为我确定我需要的插件支持21系统。

源码我们可以直接下载,上传到linux。
也可以直接在linux上下载
1 | #下载 |
安装编译所需要的依赖
官方文档直接给出了各系统安装依赖的命令,直接安装即可。
CentOS / Fedora
1 | sudo dnf --setopt install_weak_deps=False --skip-broken install bash-completion bzip2 gcc gcc-c++ git make ncurses-devel patch rsync tar unzip wget which diffutils python2 python3 perl-base perl-Data-Dumper perl-File-Compare perl-File-Copy perl-FindBin perl-Thread-Queue |
Debian / Ubuntu
1 | sudo apt update |
openSUSE
1 | sudo zypper install --no-recommends asciidoc bash bc binutils bzip2 fastjar flex gawk gcc gcc-c++ gettext-tools git git-core intltool libopenssl-devel libxslt-tools make mercurial ncurses-devel patch perl-ExtUtils-MakeMaker python-devel rsync sdcc unzip util-linux wget zlib-devel |
进入源码目录
1 | cd openwrt-21.02.1 |
此处有两个文件需要注意:
1、feeds.conf.default文件
此文件记录了插件包所在的源,我们可以在里面加入自己的源。
网上有很多朋友整理了一些常用插件包,可以在此处直接添加,也可以根据自己的需求,自己建立一下git仓库,里面存放自己用到的插件包。
如图,红色标记为我自己建立的源,里面有少数几个我使用的插件。
src-git ashin https://github.com/AshinLin/ashin-packages.git

2、package目录
此目录直接存放了可以编译的包,如果不使用feeds.conf.default添加自定义源,那么我们直接将插件包放在这个目录即可。
更新所有需要编译的包
1 | ./scripts/feeds update -a |
安装所有需要编译的包
1 | ./scripts/feeds install -a |
配置编译选项
1 | make menuconfig |

此时界面会出现可视化界面,操作方法如下:
1、空格键用于确定是否编译插件。
2、回车键用于底部的EXIT、SAVE等按钮确认。
3、上下左右箭头移动光标。
4、
- < > 该代码将不会被编译
- < M >该代码将被交叉编译,生成的ipk软件包将被放在/buildsystem/bla/bla/bla, 但该软件包不会放入固件中
- <*> 该代码将被放入固件中 (on the SqashFS partition)
常用配置说明
1、Target System(必选)
表示编译的处理器平台,根据自己实际情况选择,X86软路由请选择X86。
2、Subtarget
平台子选项,X86通常是X86_64,其他根据实际情况选择。
3、Target Profile
默认即可

4、Target Images
表示固件包打包格式,如果你看不懂里面的格式表示什么,那么只需要选择squashfs即可。
另外Root filesystem partition size 表示固件包的大小,如果插件不过通常默认即可,如果插件太多,可能改大,通常不会超过150M,由于我是在电脑安装,不缺这点空间,所以直接设置为256M。

Base System选项
- blockd通常选上,挂载磁盘用。
- dnsmasq建议选择完整功能版dnsmasq-full,因为有些插件可能会依赖这个组件。

Luci选项
插件配置基本上都在此,少数插件除外。
Luci->Collections
- 选上luci
- 如果路由器配置足够建议选上luci-ssl-openssl,如果是路由器性能较差,选luci-ssl即可。

Luci->Modules
在translations选上,可以选择页面语言,选择中文。

Luci->Applications
插件选项,通常我们添加的插件都在此目录,选择自己需要的插件即可。
配置好后,一定要选择Save保存再退出。
一般来说我们配置上面选项就能编译出一个简洁的中文系统了,至于里面有多少插件,就看自己情况了。
开始编译
下载编译需要的依赖库
1 | make -j8 download V=s |
(国内请尽量全局科学上网,否则可能很慢)
编译
1 | make -j1 V=s |
等待编辑完成即可,第一次单线程编译时间会比较长,耐心等待。
编译后在bin/targets目录即可看到编译完成的img固件包。

二次编译
第一次编译时间较长,后面编译可以用多线程,速度就快很多了。
1 | cd openwrt-21.02.1 |
可以写成一个shell脚本,直接一键运行:
1 | vi bianyi.sh |
注意更改一下版本号
1 | #!/bin/sh |
备份编译配置
固件编译由于不是场景做的事情,如果编译目录被删除,时间长了在make menuconfig环节很容易忘记应该勾选哪些内容,其实这些配置全部写在【.config】文件。
1 | cd openwrt-21.02.1 |
我们只需要把该文件备份一下,下次下载了源码,编译时直接将此文件放进去便可以了。