基于KVM的软路由DIY(一):编译OpenWrt

什么是软路由

软路由,是相对于一个硬路由的概念,硬路由就是硬件路由器,直接就是一个路由器产品,而软路由则是在其他通用平台(如通用计算x86平台,树莓派,虚拟化系统等)上通过软件的方式实现路由功能

为什么要使用软路由

软路由往往拥有比硬路由更强大的计算能力(如果有高强度的加解密运算需求,这个就很关键了),内存和存储空间,可拓展性更强,耗电更快,这就赋予了软路由能比同价位的硬路由拥有更高的可玩性和更少的瓶颈。

为什么要自己编译固件

路由器固件多种多样,网上也有大量整合和分享的固件镜像,如果你有以下需求,那么选择自己编译固件就是一个不错的方案:

  1. 担心固件“不干净”
  2. 想体验新版本的固件系统,体验新功能
  3. 自己想要定制路由器的功能
  4. 就是单纯想折腾

为什么是Openwrt,而不是老毛子/潘多拉等其他固件

Openwrt是所有固件中可拓展性最强的,甚至可以完全当作一个GNU/Linux操作系统来使用,拥有最大的可控制程度。
(其实就是博主太菜了,找不到他们的源代码)

起步

以下步骤参考自LEDE仓库README.md,顺便一提LEDE和OpenWrt同源,随后LEDE和OpenWrt以OpenWrt的名义合并了,LEDE就是OpenWrt
这里给出OpenWrt官方仓库在GitHub的镜像和Lean的OepnWrt包(附带更多的服务组件)

注意事项

由于编译过程中需要下载其他依赖的库,往往需要访问国外的源(如GitHub),因此最好准备一个加速器,使用方法我这里就不提供了

克隆源

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

安装依赖

通过apt或yum安装依赖(取决于你的Linux操作系统的软件包管理器)
安装之前记得更新一下源信息。
文章编辑自2021/9/13,请注意时效性,建议翻阅仓库文档
apt -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

添加额外的第三方服务组件编译源

编辑feeds.conf.default即可,这里我也不提供具体的源了,有需要的自行Google

下载和安装拓展组件包

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

编辑编译选项

make menuconfig

等待一段时间后,可进入命令行交互界面。

由于我采用KVM虚拟化软路由,所以平台使用x86,当然如果你要给你的硬路由编译固件,也可以选择对应的平台和芯片类型,不过要注意不要太贪心选太多功能,固件容易太大,路由器忍不下(路由器的Flash芯片往往很小,只有十几二十来MB,甚至更小,要刷固件的话就得自己更换更大的Flash芯片了)
以下是我选择的编译选项,可以参考下:

  • Target System -> x86
  • Subtarget -> x86_64
  • Target Profile -> Generic x86/64
  • LuCI.Collections -> [luci-nginx, luci-ssl-nginx]
  • LuCI.Applications -> 这个自行按需选择,这里选择后的组件服务可以直接在路由器Web管理界面中操作和查看
  • LuCI.Themes -> [luci-theme-edge, luci-theme-material, ] 个人推荐的主题,前者视觉效果更好但较大,后者更轻量和简洁

其他选项全默认

注意:选择选项的时候请使用两次空格或按Y使选择框变成*,否则组件不会集成到编译后的固件中

设定完成后,选择“Save”,保存位置和文件名默认

下载编译需要的包

make -j8 download

-j8的意思是开启8线程下载,当然也可以根据CPU核心数量来决定线程数,命令如下

make -j`nproc` download

开始编译

make -j`nproc`

注意!如果你是使用WSL进行编译,则需要使用以下命令:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin make -jnproc
也就是说,你需要在make命令前面添加PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

命令执行后即可开始漫长的编译,首次编译一般需要1-2小时,取决于CPU性能。如果编译过程中出错且找不到错误日志,可执行make V=s单线程和输出完整日志再执行一次,根据日志自行排错。

编译完成

编译完成后,生成的固件在bin/targets/目标平台/具体平台子系统下,如/bin/targets/ramips/mt7621/bin/targets/x86/x86_64

到这里,编译的步骤就完成了,后续的配置和使用环节在下篇文章中更新。

下一篇:基于KVM虚拟化的软路由DIY(二):系统创建与配置