前言

有些时候,我们可能需要自己编译openwrt系统,比如有些特殊上网需求的朋友。

再比如经常重装系统的朋友,每次重装都要再次安装上自己要用的插件,比较麻烦。

自己编译系统会是个很好的选择,因为可以将插件直接编译进系统,重装系统时插件、中文包就都自带了。

编译openwrt之前,首先要准备一个操作系统,根据官方文档,openwrt编译支持GNU/Linux、BSD 或 MacOSX 系统(需要区分大小写的文件系统)。

以下操作以linux系统为例。

查看稳定系统版本

因为是路由系统,关乎到网络稳定,所以建议还是选用稳定版系统,而非最新的测试版系统。

在openwrt官网(https://openwrt.org/)我们可以看到稳定版系统版本号。
image.png

获取系统源码

在openwrt项目的tags目录,能看到所有openwrt版本,虽然有些版本并不是官网公布的稳定版,但通常这个目录下的版本稳定性都还不错。

https://github.com/openwrt/openwrt/tags

选择版本之前需要关注自己需要的插件支持的系统版本,比如有些插件可能只兼容openwrt18,有些可能只兼容openwrt19,而并没有支持最新的21系统。

我选择的是编译最新的稳定版本:v21.02.1,因为我确定我需要的插件支持21系统。

imageb526ace3bda6e322.png

源码我们可以直接下载,上传到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
image8bcf7aef672e393f.png

2、package目录
此目录直接存放了可以编译的包,如果不使用feeds.conf.default添加自定义源,那么我们直接将插件包放在这个目录即可。

更新所有需要编译的包

./scripts/feeds update -a

安装所有需要编译的包

./scripts/feeds install -a

配置编译选项

make menuconfig

image.png

此时界面会出现可视化界面,操作方法如下:
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

默认即可
image43cb5aeb0ac643a8.png

4、Target Images

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

Base System选项

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

Luci选项

插件配置基本上都在此,少数插件除外。

Luci->Collections

  1. 选上luci
  2. 如果路由器配置足够建议选上luci-ssl-openssl,如果是路由器性能较差,选luci-ssl即可。
    imagec5ab14d23b7af44b.png

Luci->Modules

在translations选上,可以选择页面语言,选择中文。
imagecdd33f511c6df621.png

Luci->Applications

插件选项,通常我们添加的插件都在此目录,选择自己需要的插件即可。

配置好后,一定要选择Save保存再退出。

一般来说我们配置上面选项就能编译出一个简洁的中文系统了,至于里面有多少插件,就看自己情况了。

开始编译

下载编译需要的依赖库

make -j8 download V=s

(国内请尽量全局科学上网,否则可能很慢)

编译

make -j1 V=s

等待编辑完成即可,第一次单线程编译时间会比较长,耐心等待。

编译后在bin/targets目录即可看到编译完成的img固件包。
imagedbb75547cbff8e64.png

二次编译

第一次编译时间较长,后面编译可以用多线程,速度就快很多了。

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

我们只需要把该文件备份一下,下次下载了源码,编译时直接将此文件放进去便可以了。