定制 OpenWrt 软路由系统(一)从源码开始编译第一个系统固件

第一次完全按照视频教程装了爱快和 LEDE 双软路由系统,当时只是为了实现功能而完全没有考虑安全性和整个系统是否过于臃肿的问题,但是在使用了近 2 年之后,看了下 LEDE 页面完全没有点开过的大半菜单选项,于是决定根据需求定制下属于自己的 OpenWrt 系统固件。
对于 OpenWrt 系统我的需求就两个:1、干净整洁;2、可以实现路由器端的科学上网,这里我选用的插件是 Clash。
小提一句,LEDE 是 OpenWrt 在 2016 年 5 月后被新建的一条分支,但是由于之后 OpenWrt 的大量开发人员选择参与 LEDE 项目,经历长时间的两边维护后,于 2018 年 2 月 LEDE 又合并回了 OpenWrt 的主分支内,因此现在编译 OpenWrt 即可,不用再去管 LEDE 了。


本章主要参考教材为:打造一个专属于你的软路由系统,让它好用十倍!

1、安装一个 Ubuntu 系统
截至 2021-10-23 GitHub 项目的 README.md 上已经开始推荐 Ubuntu 20.04 LTS x64 系统,因为升级了 Windows11 的关系,直接使用 WSL2 安装个 Linux 虚拟机即可。

关于 Windows 11 如何开启 WSL2 并安装 Linux 子系统,稍微记录一下。

  1. Win + X 键打开 Windos 终端(管理员)并执行:
# 开启 Linux 子系统功能
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 开启虚拟机功能
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  1. 在微软商店搜索并下载 Ubuntu 20.04 TLS 系统(发行版可根据自己需求更换):
    搜索
  2. 安装、打开,然后设置用户密码:
    打开
  3. 设置磁盘映射,Linux 子系统默认的路径如下(用户和 Linux 发行版自行替换):
    注意:在这个目录下你会看到一个磁盘映射文件,因为涉及到文件编码格式的不同,官方是不推荐跨系统做文件管理的,但单纯的从 Linux 子系统中拷贝编译后的文件出来是没问题的。
C:\Users\$用户\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState

用户目录

2、更新软件源并安装编译所需依赖
需要注意的是部分包境内下载速度缓慢,这一步最好在全局科学情况下执行。
更新软件源:

sudo apt-get update

安装编译所需依赖:

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync

3、克隆代码

git clone https://github.com/coolsnowwolf/lede

4、执行编译前准备工作
也都是官方文档的代码,直接拷贝执行:

cd lede
./scripts/feeds update -a
./scripts/feeds install -a

5、接下来配置软路由系统
这一步是较为关键的,直接决定了编译出来系统的架构和里面所包含的插件,因为是第一章只编译一个最基础的软路由系统固件,因此不会包含插件信息单单只做架构为 x86 的配置。
执行:

make menuconfig

到图形化界面,发现前 3 项已经配置好了 x86_64 的架构设置,那么就不用动了,保存退出即可。

6、下载 dl 库

make -j8 download V=s

7、打包编译
-j1 参数意为单线程编译,官方文档推荐第一次使用单线程,但其实后续编译不再需要下很多包因此速度会提升很多,继续使用单线程也无妨。
执行:

make -j1 V=s

这里需要注意的是,如果你和我一样使用的是 WSL 或者 WSL2 进行编译,由于部分 PATH 中路径包含带空格的 Windows 路径,很可能会导致编译失败,因此请执行下面的命令:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -j1 V=s

我的 CPU 是 3700X,这一步的单线程编译了 6 个小时左右,最后如下图显示就说明编译结束了:
编译结束

8、拷贝编译完的固件
Window11 的 ESL2 会自动生成磁盘映射方便访问,直接进入即可。
磁盘映射
路径如下(用户名请自行替换):

\\wsl.localhost\Ubuntu-20.04\home\$用户\lede\bin\targets\x86\64

选 openwrt-x86-64-generic-squashfs-combined-efi.img 即可:
成果物
因为我的软路由系统是跑在 PVE 平台上的,因此使用 Xftp 上传下即可,因为是 .img 文件,还需要做一次 img2kvm 直接写成可挂载硬盘的操作,直接上传至 /root 目录下即可。

附带说一句,PVE 下用以存储 .iso 文件的路径如下:

/var/lib/vz/template/iso/

这个目录下的操作系统镜像文件可以在 PVE 控制面板新建虚拟机时直接进行选择。

9、测试安装
先在 PVE 端创建个操作系统不使用任何介质、先不配置任何网络设备的空虚拟机:
空虚拟机
再使用 img2kvm 工具将编译后的系统镜像写成可挂载硬盘:

./img2kvm openwrt-x86-64-generic-squashfs-combined-efi.img 103 vm-103-disk-1

写完之后会看见一个新盘被挂载到了虚拟机,直接添加,然后在选项 → 引导顺序中更改为从新盘启动:
引导顺序
接着启动虚拟机并切换至控制台准备更改管理面板 IP(这里可能需要按下回车):
准备更改管理面板 IP
更新配置文件:

vi /etc/config/network

将第 15 行的 192.168.1.1 更改为你需要的 IP 地址即可:
第 15 行
之后重启。
最后看下你之前 LEDE 软路由的网络设备是什么样的配置,抄一份在硬件处添加:
添加网络设备
接着重启并访问配置了的 IP 地址:
访问
这里的密码需要去控制台里更改:

passwd root

接着登录即可:
登录
看到还是有一些插件被默认添加了,下一章对插件的自定义会尝试去除。

本章结束。