一直以来,路由器就是大家印象中的路由器,就是那个样子,那个功能,不过最近几年随着科技的发展,软路由开始走进大众的视线,什么是软路由呢,说的直白一些就是电脑上装上路由系统就是软路由了,是不是非常的简单粗暴,确实软路由就是这么的给力,相比于那普通路由器的长年8M内存,电脑的配置就高多了,2G内存都是起步价,配置高的更是上不封顶了,更有着系统随便装等优点,一些路由系统开始露出狰狞的面目,颠覆了路由器的固有概念,其中更有ROS、爱快、Openwrt等各种非常优秀的路由系统,这三种只是常见的三种,还有几个非常不错的,不过用的玩家比较少就是了,最早使用软路由的行业其实是网吧,还记得网吧打出的双线接入,或者三线接入吗,那就是软路由的功能了,虽然有些企业路由也有多WAN口的,但动辄大几百几千的投入来说,那就有些得不偿失了,而且性能还弱的够爆。上面我们说了三种常见的路由系统,其中ROS也是最接近原生路由系统的,界面简陋,配置复杂,上手难度有些高,功能就是纯粹的上网等功能,但是真的很稳,说不定你的小区就是用的这个系统,爱快是我们国人开发的,界面更简单,符合国人的习惯,功能也是围绕上网为主,主打的就是七级智能流控,当然因为是公司行为,都是合规合法的功能,最早只有路由系统,后来也做硬件网络设备了,名字也叫爱快,各大平台也都有卖,配置可以,就是价格略高,总体而言实力还是很强大的,Openwrt路由系统是开源的,几乎是每个玩家必备,也是网虫最大的聚集地,因为openwrt有着无限可能,比如我们常用的kms、小型nas、网盘管理工具小雅alist、广告过滤、魔法上网等,无数大神为此奉献着,如果我们用的是常见的设备,那么我们在网上可以找到很多合适我们设备的最新固件,如果是比较冷门的设备,就需要我们自己动手去编译了,所以这篇文章适合想动手为自己编译合适自己固件的网友,好了,教程开始…
作为技术爱好者,对定制镜像的需求是一直存在的,毕竟从安全上考虑,我们的网络数据都是要通过路由的,如果有人动了手脚,在系统里面放了后门,那么我们的隐私就没有保障了,这点用过爱快的应该深有体会,爱快的流控可以清晰的分辨出你正在浏览什么,在看什么电视,有什么网络行为,还有就是从稳定性上来说,别人分享的固件,是用来适配他自己的设备,就算你的设备和他的型号一样,不同批次的设备,硬件都很有可能不一样,特别是像外贸电视盒子,这种问题很常见。我们使用opengwrt,就是为了实现一些想要的功能,自己编译,能很好的使插件和系统更好的兼容,同时想要什么功能就集成什么插件,不过度的集成插件,确保系统的稳定。尤其是passwall等更新频率比较高的应用,因为大家下载的镜像内核版本不一,导致这些应用更新成功率较低,自己编译一个openwrt镜像成了一个不错的选择。
因为openwrt是开源的,所以有很多大神都在开发,我们这里推荐四位大神的源码,各有各的特点,大家可以自由选择,这里我们用LEDE大神的为例,其他的都一样
-
lienol源码: https://github.com/Lienol/openwrt
-
immortalwrt源码: https://github.com/immortalwrt/immortalwrt
恩山论坛大佬Lean的LEDE定制灵活性很强,也是用的最多的。
ImmortalWrt是OpenWrt的一个分支,移植了更多的软件包,支持了更多的设备,更好的性能,并为中国大陆用户进行了特殊的优化。
lienol 集成的软件少,源码改动少,使用起来稳定性更强!紧跟官方版本进行更新,安装了差不多的插件lienol编译出来的固件体积比其它他人的的要小好多!有动手能力的推荐自己编译这个固件使用
iStoreOS純小白推荐使用,看名字就知道这个openwrt想做成成熟的OS,无脑操作,界面是openwrt中最漂亮的,下载使用即可,最大的亮点还提供了软件中心:iStore,尽可能解决插件之间的依赖关系,可以一键安装插件。
准备环境
首先,确保你的计算机满足以下要求(这里推荐使用虚拟机软件VMware或Virtualbox):
- 最重要的是你的心态,编译过程复杂且枯燥,失败的几率很高,遇到的报错千奇百怪,一定要平常心,不要心急,遇到什么问题解决什么问题,一步一步的走
- 操作系统:Linux(建议使用Ubuntu 22.04.2或Debian11)
- 至少30GB的硬盘空间(推荐50GB甚至更大)
- 至少4GB的RAM
- 全局科学上网(中国大陆)不具备条件的朋友,可以选择购买海外云服务器,进行云端编译。
步骤1:安装依赖
sudo 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-pyelftools libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
步骤2:获取OpenWrt源代码
我这里使用的是Lede的源码仓库。
使用以下命令,将lede源码库克隆到本地,并进入源码目录。(不要使用root用户!!!不要使用root用户!!!不要使用root用户!!!)
git clone https://github.com/coolsnowwolf/lede cd lede
因为原仓库里的插件太少,不够使用。在这里,我们再添加一个仓库。
sed -i '1i src-git kenzo https://github.com/kenzok8/openwrt-packages' feeds.conf.default sed -i '2i src-git small https://github.com/kenzok8/small' feeds.conf.default ./scripts/feeds update -a && rm -rf feeds/luci/applications/luci-app-mosdns rm -rf feeds/packages/net/{alist,adguardhome,mosdns,xray*,v2ray*,v2ray*,sing*,smartdns} rm -rf feeds/packages/utils/v2dat rm -rf feeds/packages/lang/golang git clone https://github.com/kenzok8/golang feeds/packages/lang/golang ./scripts/feeds install -a make menuconfig
通常我们添加这两条就够了,如果需要再根据需要添加其他的软件包,上面的是一键命令(防止插件冲突,删除重复),根据自己的需要进行操作
获取并更新最新源码
git pull ./scripts/feeds update -a ./scripts/feeds install -a
如果遇到报错,可尝试使用下面命令修复
./scripts/feeds update -i -f ./scripts/feeds install -a -f
步骤3:配置编译选项
make menuconfig
以下是menuconfig
页面中各选项的说明:
- Target System:选择你的设备所使用的处理器架构。
- Subtarget:根据设备的详细型号,选择相应的子目标。
- :选择你的设备型号。这会自动设置与设备兼容的预设选项。
- Target Images:选择生成的固件类型,例如:
squashfs
、ext4
等。 - Global build settings:配置全局编译设置,例如:启用/禁用软件包的签名检查、IPv6支持等。
- Advanced configuration options (for developers):高级配置选项(适用于开发人员)
- Build the OpenWrt Image Builder :构建OpenWrt图像生成器
- Build the OpenWrt SDK :构建OpenWrt SDK
- Package the OpenWrt-based Toolchain: 打包基于OpenWrt的工具链
- Image configuration:图像配置
- Base system:选择基本系统组件,例如:网络配置、系统日志、防火墙等。
- Administration :管理
- Boot Loaders —> 引导加载程序
- Development —> 开发
- Extra packages:选择额外的软件包,如:文件系统支持、VPN、代理等。
- Firmware —>固件
- Fonts —>字体
- Kernel modules:选择内核模块,如:支持的硬件设备、文件系统、网络协议等。
- Libraries —> 图书馆
- LuCI:选择Web界面组件,包括主题、应用、协议支持等。
- Languages:选择系统支持的语言包。
- Libraries:选择编译时需要的库文件,如:加密库、数据库库等。
- Utilities:选择实用工具,如:文件管理器、终端模拟器、脚本语言支持等。
- Mail —> 邮件
- Multimedia —>多媒体
- Network —>网络
- Sound —> 声音
- Utilities —>实用程序
- Xorg —>Xorg
根据你的设备型号和需求进行配置,在配置过程中要注意不要选择有冲突的软件包。配置完成后,保存并退出。我们常用的就这么几个Target System选择我们的设备类型,Target System选择我们的设备型号,然后就是openwrt的灵魂LuCI了,我们需要的大部分功能都在这里面设置,这里我们可以参考我之前的文章openwrt常用插件列表中英文对照表进行设置
- 菜单选项
- [] 空的,不安装
- [M] 仅编译,不安装项(可以在部署完成后手动安装以降低固件大小)
- [*] 即为编译并安装
步骤4:下载 dl 库,编译固件 (-j 后面是线程数,第一次编译推荐用单线程)
make download -j8
这一步非常关键。如果您在执行这个命令的过程中出现报错,请多次执行命令。如还是报错,请检查您的网络。如果你忽略了这一步中的错误,那么在编译过程中很可能因缺失依赖而报错。
开始编译
make V=s -j1
PS:
+ -j8: 为线程数,推荐第一次使用单线程编译,否则你编译错误,连调试信息都没有,根本不知道哪里错的。
+ V=s: 为故障排除目的提供更详细的信息
步骤5:获取编译好的固件
编译完成后输出路径:bin/targets(lede目录下)
二次编译:
cd lede git pull ./scripts/feeds update -a ./scripts/feeds install -a make defconfig make download -j8 make V=s -j$(nproc)
如果需要重新配置:
rm -rf ./tmp && rm -rf .config make menuconfig make V=s -j$(nproc)
PS:
- 如果源码没有变化的情况下,可以使用以下命令清除缓存
- make clean 仅清理编译结果(bin目录)
- make dirclean 清理所有编译文件(除了.config、dl文件夹和feeds以外都清理)
- make distclean 清理所有编译文件以及相关依赖(完全清理干净,一键回到刚git clone下来的时候)
总结
本教程介绍了使用LEDE源代码库编译OpenWrt固件的方法,以及menuconfig
页面中各选项的说明。通过这些步骤,你可以为你的设备定制固件,添加新功能或优化性能。请注意,编译过程可能需要较长时间,动辄几个小时,六七个小时都是常事,确保在开始编译前已充分了解你的设备型号和需求。
其他第三方仓库
添加下面代码到 openwrt 或 lede 源码根目录下的 feeds.conf.default
文件:
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small
src-git nas https://github.com/linkease/nas-packages.git
src-git passwall https://github.com/xiaorouji/openwrt-passwall.git;main
src-git passwall_packages https://github.com/xiaorouji/openwrt-passwall-packages.git;main
src-git helloworld https://github.com/fw876/helloworld.git
src-git haibo https://github.com/haiibo/openwrt-packages
src-git lienol https://github.com/Lienol/openwrt-package
src-git openclash https://github.com/vernesong/OpenClash.git
src-git amlogic https://github.com/ophub/luci-app-amlogic
src-git packages https://git.openwrt.org/feed/packages.git
src-git luci https://git.openwrt.org/project/luci.git
src-git routing https://git.openwrt.org/feed/routing.git
src-git telephony https://git.openwrt.org/feed/telephony.git
src-git small8 https://github.com/kenzok8/small-package
# 添加 OpenAppFilter 应用过滤插件 git clone https://github.com/destan19/OpenAppFilter package/OpenAppFilter # 添加 OpenClash git clone https://github.com/vernesong/OpenClash.git mv OpenClash/luci-app-openclash package/ # 添加 eqos git clone https://github.com/zhaojh329/eqos.git package/ # 在 make menuconfig 选择以下项目 # LuCI > Applications > luci-app-eqos # Network > eqos
PS:仓库不是越多越好,插件越多越容易冲突,反而编译出错,所以慎重选择,合适自己的才是最好的
Tips
固件空间
插件比较多的时候,下x86/64下调整一下设置,留下空间
Target Images ---> (16) Kernel partition size (in MB) #默认是 (16) 建议修改 (256)
Target Images ---> (160) Root filesystem partition size (in MB) #默认是 (160) 建议修改 (512)
使用WSL/WSL2进行编译
由于 WSL 的 PATH 中包含带有空格的 Windows 路径,有可能会导致编译失败,请在 make 前面加上:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin