
OpenWrt 简介
OpenWrt是适合于嵌入式设备的一个Linux发行版。 相对原厂固件而言,OpenWrt不是一个单一、静态的固件,而是提供了一个可添加软件包的可写的文件系统。这使用户可以自由的选择应用程序和配置,而不必受设备提供商的限制,并且可以使用一些适合某方面应用的软件包来定制你的设备。
OpenWrt 系统编译
选择自己编译 OpenWrt 系统的最大好处,一方面就是可以最大程度的个性化 OpenWrt 系统,直接使用别人编译好的固件难免会缺少或者冗余功能。另一方面自己编译 OpenWrt 系统可以极大的提升自己的动手能力,同时还能对 linux 系统的编译有个简单的了解。
我自己有一台 Ubuntu 系统(CentOS 应该可以)的服务器,并且有自己的科学上网梯子(编译 OpenWrt 的过程需要下载众多依赖包,如果没有科学上网,编译过程大概率失败),因此编译过程比较顺利。如果缺少这两项必要条件,那就可以借助于 Github 的 Action 在线编译功能来编译自己的 OpenWrt 系统,该方式也是我最近才了解到的。
本文会对本地编译和云编译两种方式都进行介绍,原理都是一样,最终编译出来的固件没有任何区别。
本地编译 OpenWrt 系统
就像上文说的,本地编译需要一台 Ubuntu 系统的服务器以及科学上网,服务器选择物理的机器或者是虚拟机都是可以的,只是编译速度有区别,科学上网那就自行想办法吧~~都 2022 年了不会还有人不会科学上网吧【狗头保命】??实在没有那就选择方式二吧,最终结果都是一样的,并且成功率高很多。OpenWrt 的源码选择的是 L 大大的,感谢大佬提供的如此优秀的源码 ,Salute ~~
好吧,说了很多废话,还是进入正题,开始编译 OpenWrt 系统。
编译环境准备
输入如下命令,该命令主要是安装了一堆 linux 环境下的命令以及编译过程中需要依赖的库。
1
2
3
4
5
6
7
8sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \
git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \
libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \
mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip qemu-utils \
rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev下载 OpenWrt 源码
使用如下命令下载源码,需要服务器已安装 git,如果服务器没有安装 git 那就自行百度安装一个。
1
2下载 OpenWrt 源码
git clone https://github.com/coolsnowwolf/lede下载默认的插件
使用如下命令下载 L 大大默认整理好的一些 OpenWrt 插件,看 feeds 这个脚本中
parse_config
函数的实现就知道它默认就是去下载了feeds.conf.default
这个文件中定义的一些仓库地址的源码。1
2
3cd lede
./scripts/feeds update -a
./scripts/feeds install -a添加需要的插件(可选)
下载的源码中没有”酸酸乳”(全局科学上网)插件,并且默认提供的 Argon 主题有点小丑,所以这里就需要自行添加或者替换一下,如果没有这种需求的那就跳过这步吧。
- 添加”酸酸乳”插件
修改 OpenWrt 源码目录下的
feeds.conf.default
文件,在其中添加 [酸酸乳](src-git helloworld https://github.com/fw876/helloworld) 的仓库地址。注:修改完成后需要重新执行一下步骤 3 的命令。如果不想修改
feeds.conf.default
文件,并执行第 3 步,那就直接使用下边的命令搞定吧,跟上边的效果是一样的。1
2下载"酸酸乳"到 OpenWrt 源码的 package/feeds/ 路径下
git clone https://github.com/fw876/helloworld/ package/feeds/helloworld- 替换原始的 Argon 主题
一条命令搞定,使用的效果见下图(真心好看)~~
1
2
3
4
5
6删除原始的 Argon 主题
rm feeds/luci/themes/luci-theme-argon/
下载下图的 Argon 主题
git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git feeds/luci/themes/luci-theme-argon
tips:写这个文章的时候突然想到的,是不是可以通过进入 feeds/luci/themes/luci-theme-argon/ 这个路径下,然后切换 18.06 分支得到同样的效果??OpenWrt 编译插件配置
这个步骤就是去客制化你的 OpenWrt 系统,涉及的内容非常多,除了定制 OpenWrt 固件的插件以外,还能对 OpenWrt 的 linux 内核进行配置,还能修改编译结果的目标平台(ARM 还是 x86 还是其它),还能定制化一些需要的驱动模块。它决定了你的固件能在什么硬件平台运行,能够支持哪些外围的硬件设备(网卡、键盘、声卡)等。
好吧,恕我才疏学浅,对于 linux 内核的客制化不太了解,只能这样简单肤浅的解释一下了,好在 L 大大源码默认的 linux 内核配置部分已经能够满足编译出来的固件在 x86 平台跑起来,我们就只需要重点关注下 OpenWrt 直接相关的一些配置。
输入如下命令可以进入编译的配置界面,界面如下图:
1
2OpenWrt 编译配置
make menuconfig- 修改目标固件大小
默认情况下,OpenWrt 编译出来的固件大小应该是在180MB 左右,除去 linux 内核本身占用的空间以及根文件系统中的一些系统文件外,实际可供用户使用的空间是非常小的,因此需要在编译之前修改一下固件大小(虽然可以通过后期调整磁盘分区大小的方式来扩容,但是需要我们准备 U 盘启动的 linux 系统,过程稍微麻烦,如果感兴趣可以尝试下)。
固件大小的修改在
Target Images
菜单下,Kernel partition size
用于指定内核大小,通常只要不是把一些驱动模块编译进内核中,linux 内核本身是非常小的,32MB 应该是足以。Root filesystem partition size
用于指定根文件系统大小,这个大小减去系统默认使用的那部分空间后,剩余的就是你能使用的大小,这个值自己考虑,但是也别填太大了,通常 2GB 足以。- 添加 IPv6 支持
使用 OpenWrt 软路由的一个典型场景就是通过公网 IP 地址随时”回家”,由于公网 IPv4 地址的数量有限,因此家庭在办理宽带时通常是不给分配公网 IPv4 地址的,或者是需要拨打运营商电话,要求开通公网 IPv4 地址的业务(不一定能申请到)。当前各大运营商基本都已经支持 IPv6,只要你的设备支持就能获取到公网的 IPv6 地址。OpenWrt 的 IPv6 特性开关位于
Extra packages ---> ipv6helper
,勾选该项就能启用 IPv6 的支持。- 个性化插件配置
OpenWrt 的插件配置位于
LuCI ---> Applications
目录下,可以看到里边有超级多插件,关于这些插件的功能可以参考这个链接 。默认情况下添加的插件就已经满足我们大多数人的使用场景了,但是我这里还是强烈推荐大家添加如下几个插件,至于其它那就根据个人需求来添加吧。插件名 插件作用 luci-app-docker 通过下载各种开源的 docker 镜像,强化 OpenWrt 的功能 luci-app-socat 配合公网 IPv6 地址进行到内网 IPv4 地址的转发 luci-app-ssr-plus “酸酸乳”科学上网 luci-app-ttyd OpenWrt 系统的终端登录服务 luci-app-watchcat 监控 OpenWrt 的网络状态,自动重启 luci-app-wol 网络唤醒,实现远程开机 对了,我们自行添加的 Argon 主题需要确保 luci-theme-argon 被勾选,它位于
LuCI ---> Themes
下。以上就是我根据自己的需求对 OpenWrt 系统进行的客制化配置,其它的配置可以再自行探索,完成配置后记得左右方向键选中配置界面底部的 Save 按钮对配置项进行保存,然后再 Exit 退出配置界面,此时就会在源码目录下生成
.config
文件,这个文件就是我们对 OpenWrt 系统进行客制化修改后的编译配置文件,它决定了我们最终生成的固件是怎样的。启动编译固件
输入如下命令就好,第一个命令用于下载 OpenWrt 系统的一些依赖包,比如 busybox(一些常用的命令就包含在里边),第二个命令正式编译 OpenWrt 系统。
1
2
3
4下载 OpenWrt 系统软件包,比如 busybox
make download -j8
编译 OpenWrt 系统
make -j$(($(nproc) + 1)) V=s整个的编译过程非常的耗时,当然也取决于你的机器性能,编译完成后生成的固件位于
bin/targets/x86/64
路径下,openwrt-x86-64-generic-kernel.bin
是 linux 内核,openwrt-x86-64-generic-squashfs-combined-efi.img
是我们期望得到的固件文件,openwrt-x86-64-generic-squashfs-combined-efi.vmdk
虚拟机镜像,我们可以直接在 vmware 上运行这个镜像,openwrt-x86-64-generic-squashfs-rootfs.img
根文件系统。
在线编译 OpenWrt 系统
在线编译 OpenWrt 系统借助的是 Github 的 Action 特性,它本质就是一个流水线,当我们把需要做的工作定义好后,Github 就会按照我们定义的流程来完成一系列工作,编译的服务器就是 Github 的服务器集群,所以性能是杠杠滴,另外编译过程不会受 GFW 的影响导致部分依赖包下载失败,因此编译成功率高高滴。
基于 Action 的编译流程现在已经有人开源到了 Github,并且具体的使用方式也已经写的很详细了,参见这个链接 ,我这里就不再赘述了,只是简单提醒一下如果对于编译配置的 .config 文件的生成不太了解,可以参考本文 本地编译 OpenWrt 系统
小节的 1-5 步。我本人基于这个流水线工程个性化修改后的 仓库 也贴出来,各位可以进行参考。
OpenWrt 系统安装
安装 OpenWrt 系统需要用到一些重装系统的知识,如果你会使用 U 盘重装电脑系统,那剩下的工作就很简单了,如果你不会(能看到这篇文章的人没有不会重装系统的吧,狗头保命~~),那就请自行在 B 站找一些相关的视频看看,我这里就默认你能够制作 U 盘启动盘,并且能够从 U 盘启动进入到 PE 系统。
安装 OpenWrt 系统需要使用到一个磁盘写盘工具,用于将我们的固件写到磁盘上,请提前 下载 好写盘工具,并将其与我们的固件 openwrt-x86-64-generic-squashfs-combined-efi.img
一同放到 U 盘启动盘中,然后进入 PE 系统。
写盘之前先对软路由的硬盘进行清理,即删除所有分区,这个过程会删除目标硬盘的所有文件,请自行提前备份数据,参考下图:
- 选择需要安装 OpenWrt 的硬盘,切记操作的过程中不要选错硬盘了!!
- 选中需要删除的分区,点击右键
- 弹出的选项框中,点击删除当前分区
确保目标硬盘的所有分区都删除后,点击菜单栏 分区 -> 保存分区表
,此时硬盘就算清理完成。
刷固件请打开我们提前准备好的磁盘写盘工具,按照下图的步骤进行操作:
- 选择映像写入
- 选择目标硬盘,即我们刚刚清理完成的硬盘
- 浏览,选择我们自行编译的固件
openwrt-x86-64-generic-squashfs-combined-efi.img
- 确认信息无误后,点击开始
这个过程非常迅速,待固件写入完成后,即可关闭写盘工具,然后拔掉 U 盘重启系统了,不出意外此时设备就会进入 OpenWrt 系统了。
结尾
以上就是本文的所有内容了,我们从源码编译得到了自己定制化的 OpenWrt 固件,并将其安装到软路由设备上运行,整个过程是不是小有成就感呢??当然 OpenWrt 系统运行起来还只是第一步,对 OpenWrt 系统进行配置,以满足自己的需求是我们后续要做的事情,有空之后我会写篇关于 OpenWrt 配置的文章,敬请期待喽。