前言
有些时候,我们可能需要自己编译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上下载
#下载
wget https://github.com/openwrt/openwrt/archive/refs/tags/v21.02.1.zip
#解压
unzip v21.02.1.zip
安装编译所需要的依赖
官方文档直接给出了各系统安装依赖的命令,直接安装即可。
CentOS / Fedora
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
sudo apt update
sudo apt install build-essential ccache ecj fastjar file g++ gawk gettext git java-propose-classpath libelf-dev libncurses5-dev libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget python3-distutils python3-setuptools python3-dev rsync subversion swig time xsltproc zlib1g-dev
openSUSE
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
进入源码目录
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添加自定义源,那么我们直接将插件包放在这个目录即可。
更新所有需要编译的包
./scripts/feeds update -a
安装所有需要编译的包
./scripts/feeds install -a
配置编译选项
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保存再退出。
一般来说我们配置上面选项就能编译出一个简洁的中文系统了,至于里面有多少插件,就看自己情况了。
开始编译
下载编译需要的依赖库
make -j8 download V=s
(国内请尽量全局科学上网,否则可能很慢)
编译
make -j1 V=s
等待编辑完成即可,第一次单线程编译时间会比较长,耐心等待。
编译后在bin/targets目录即可看到编译完成的img固件包。
二次编译
第一次编译时间较长,后面编译可以用多线程,速度就快很多了。
cd openwrt-21.02.1
./scripts/feeds update
./scripts/feeds install -a
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s
可以写成一个shell脚本,直接一键运行:
vi bianyi.sh
注意更改一下版本号
#!/bin/sh
openwrt="openwrt-21.02.1"
cd ~/$openwrt
./scripts/feeds update
./scripts/feeds install -a
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s
备份编译配置
固件编译由于不是场景做的事情,如果编译目录被删除,时间长了在make menuconfig环节很容易忘记应该勾选哪些内容,其实这些配置全部写在【.config】文件。
cd openwrt-21.02.1
cat .config
我们只需要把该文件备份一下,下次下载了源码,编译时直接将此文件放进去便可以了。