如何编译属于自己的软路由OpenWrt固件

技巧 Feb 27, 2020

从去年买了J1900软路由后一直使用其他人编译好的固件,没有想过自己编译,觉得这方面对自己很遥远。但最近新冠病毒疫情爆发一直在家,无聊看了很多视频教程感觉编译属于自己的软路由系统可以做到。说干就干,现在写这篇文章同时编译正在进行中。

关于如何编译 OpenWrt 固件,网上已有很多教程,我根据实操情况做适当的教程汇总,一是方便自已往后使用,二是提供想折腾编译 OpenWRT 的朋友一个思路。

关于为什么自已编译软路由固件?原因与以前的折腾Android精简手机ROM一样:追求极致的简洁与稳定。现在市面上很多网友提供的固件都是根据他们自身需求而做的编译,里面有很多插件对于我来说根本没什么用处,不好意思,强迫症又犯了。开始正题吧。

注意:

  1. 不要用 root 用户 git 和编译!!!安装好操作系统后先新建一个用户。
  2. 国内用户编译前最好准备好全局模式上网
  3. 默认登陆IP 192.168.1.1, 密码 password

如果是电脑或者虚拟机的,在桌面右键“打开终端”,如果是VPS服务器的,使用 SSH 连接服务器后进入非Root用户帐号进行代码操作。我的教程是基于下面YouTuber视频加上我自己在固件增加不自带的插件教程。

升级及安装必要组件

更新系统

sudo apt-get update

然后安装编译环境

sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 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

克隆lean的源代码到本地

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

开始定制与编译

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

敲下回车键后稍等片刻进入如下菜单

进入Target System和Subtarget勾选你需要编译的平台,默认的是X86,并且是64位的,所以你需要选择自助选择。进入Target Images勾选你需要的固件格式等

接下来是最重要也是最核心部份,选择编译的插件。进入LuCI–>Applications内选中你需要的插件。

这里按Y键勾选,空格键取消勾选,M键编译而不安装。连按两次Esc键返回上一界面。( ‘*’ 代表编入固件,‘M’ 表示编译成模块或者IPK包, ‘空’不编译 )。

勾选完需要的插件后就可以退回第一个界面按方向键选择Exit保存退出,保存按默认的文件名称(.config)保存即可,不需要修改。编译会根据.config的内容编译,想要恢复到初始配置删掉.config文件即可。

make V=s
注意:make -j1 V=s -j1 后面是线程数。第一次编译推荐用单线程,国内请尽量用全局模式上网。

即可开始编译你要的固件了。首次编译大概需要两三个小时,之后基本上只需要十多分钟既可。编译过程中不要断开SSH。若断开,请清除整个lede 文件夹重新开始。

编译完成后,前往:/home/lede/bin/targets/x86/64这个目录获取编译成功的固件。

IPK路径:/lede/bin/targets/x86/64/packages

如果是物理机软路由的话,建议选择输出UEFI,这样能挂载2TB以上的磁盘,虚拟机就没这个必要了 Target Images[*] Build EFI GRUB images (Linux x86 or x86_64 host only)

进阶:OpenWrt固件增加第三方插件

有人喜欢Lienol的插件包,但是如果只知道软件包的github地址怎么编译到固件里面呢?那以下是添加第三方插件的方法。


克隆lean的源代码到本地

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

添加 src-git lienol https://github.com/Lienol/openwrt-package 到 OpenWRT源码根目录feeds.conf.default文件里。
feeds.conf.default 文件在lede根目录中,使用文本编辑器打开既可。

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

然后进入编译菜单,退出编译菜单进行编译

make menuconfig
make V=s

    #源码根目录,进入package文件夹
    cd package/
    #创建一个openwrt-packages
    mkdir openwrt-packages
    #进入新建的文件夹
    cd openwrt-packages
    #下载源码
    git clone https://github.com/jerrykuku/luci-theme-argon.git
    #回到源码根目录
    cd ../..
    #拉取源码
    git pull
   #源码根目录,编辑.gitignore文件
   vi .gitignore
   #在文件最后一行,加入
   git rm --cached package/lean/luci-theme-argon -r
   #保存后,进入lean源码目录
   cd package/lean/
   #下载源码
   git clone https://github.com/jerrykuku/luci-theme-argon.git
   #回到源码根目录
   cd ../..
   #拉取源码
   git pull

固件添加第三方插件的方法结束。

再次编译

完成首次编译 再编译可大大缩短时间,只输入以下代码,十几分钟的事情。

cd lede      #进入LEDE目录
git pull      #同步更新大雕源码
./scripts/feeds update -a && ./scripts/feeds install -a       #更新FEEDS
rm -rf ./tmp && rm -rf .config        #清除编译配置和缓存
make menuconfig     #进入编译配置菜单
make V=s      #开始编译
以上代码一行一行操作。

刷写 OpenWrt 软件由固件方法

好吧,最后如何刷机都告诉大家吧。如何把固件刷到软路由上面,建议使用以下两个方案。

  • DiskImage直接刷写(最直接方便)

刷写方法:制作一个PE盘,把DiskImage和LEDE固件拷贝到PE盘,插到软路由上,启动PE,打开DiskImage,选择软路由上的那块硬盘,选择OpenWrt.img,点开始,等进度条结束,然后关机,拔掉U盘,再开机就可以了

  • 用physdiskwrite刷写

刷写方法:制作一个PE盘,把physdiskwrite和LEDE固件拷贝到PE盘(同一个目录下,建议放在根目录,就是打开U盘就能看到的那个目录),插到软路由上,启动PE,然后查看下存放固件的盘符(这里举例为U:盘符),打开cmd(不懂的就按Win建+r键,输入cmd回车,Win键就是键盘左下方是Windows图标的那个按键)

输入U:   #回车确定,切换到U盘的目录
输入physdiskwrite -u OpenWrt.img    #回车确定

然后会显示目前检测到的硬盘,输入0或者1选择要刷写到哪个盘(看容量,选择硬盘的那个编号),按Y确定,之后等待刷写结束就可以了,然后关机,拔掉U盘,再开机就可以了.

用SSH改OpenWrt的主题

vi /etc/config/luci
config core 'main'
        option resourcebase '/luci-static/resources'
        option mediaurlbase '/luci-static/bootstrap'
        option lang 'zh_cn'

本文到此结束,是不是挺简单的,有轮子了造飞机还难吗?也希望你成功。

题外话:最近SmartDNS和AdGuardHome很火,我最近一段时间也在跟随一些UP主用AdGuardHome,但当看到lean大神一些话,仔细想想的确如此。只能说明这个社会太浮躁,大部分人不经过大脑思考就做出行为。

固件 DNS 的逻辑是, 国外域名会通过内部的 PDNSD 会走代理的转发工具建立的隧道到 VPS 节点,然后由 VPS 通过 TCP DNS 查询 8.8.8.8 等 BGP 服务器,获得离 VPS 节点最优的 CDN DNS 查询记录,这样你的梯子才是速度最快的

国内域名直接缓存 ISP 或者 114 的结果,过滤掉错误的和被污染的IP记录,并缓存在内存中。

你本地路由器通过 SmartDNS 查询国外域名,肯定返回的是“你本地路由器的最优CDN节点DNS记录”, 而不是 “VPS节点的最优DNS记录”。 这样你访问国外域名的记录肯定是几乎最慢的

那些 Up 主(例如 Mike 之类的傻逼),为了流量和点击率,DNS 的原理都没搞清楚,带节奏骗小白们。

工具本身没问题(SmartDNS 通过设置也能走隧道),是某些人的脑子问题而已。

来自:https://github.com/coolsnowwolf/lede/issues/2551

常用插件列表
一般来说只要选对你的机器型号其他按默认就行了,有特殊需要可以勾选需要的插件即可
luci-app-accesscontrol 上网时间控制
luci-app-adbyby-plus 广告屏蔽大师Plus +
luci-app-amule 电驴下载–我一般精简掉
luci-app-aria2 Aria2下载–我一般精简掉
luci-app-arpbind IP/MAC绑定
luci-app-ddns 动态域名解析
luci-app-flowoffload Turbo ACC FLOW转发加速
luci-app-frpc 内网穿透 Frp–我一般精简掉,因为我的是公网IP
luci-app-hd-idle 硬盘休眠
luci-app-ipsec-vpnd IPSec服务端
luci-app-mwan3 MWAN负载均衡
luci-app-nlbwmon 网络带宽监视器
luci-app-openvpn OpenVPN客户端
luci-app-openvpn-server OpenVPN服务端
luci-app-pptp-server PPTP服务端
luci-app-ramfree 释放内存
luci-app-samba 网络共享(samba)
luci-app-sfe Turbo ACC网络加速(开启Fast Path转发加速)
luci-app-sqm 流量智能队列管理(QOS)
luci-app-transmission BT下载–我一般精简掉
luci-app-upnp 通用即插即用UPnP(端口自动转发)
luci-app-usb-printer USB 打印服务器–我一般精简掉
luci-app-vlmcsd KMS服务器(WIN激活工具)–我一般精简掉
luci-app-vsftpd FTP服务器–我一般精简掉
luci-app-webadmin Web管理
luci-app-wireguard VPN服务器 WireGuard状态
luci-app-wol 网络唤醒
luci-app-wrtbwmon 实时流量监测

支持 iPv6:
Extra packages —> ipv6helper (选定这个后下面几项自动选择了)
Network —> odhcp6c
Network —> odhcpd-ipv6only
LuCI —> Protocols —> luci-proto-ipv6
LuCI —> Protocols —> luci-proto-ppp

如果你实在是很懒或者不会,那可以试试我编译的固件。本链接固件会不定期更新。

注:

编译源码来自(致谢):
Lean's git source of OpenWrt and packages
https://github.com/coolsnowwolf/lede

主题及插件
https://github.com/Lienol/openwrt-package

Adguard Home​插件
https://github.com/rufengsuixing/luci-app-adguardhome

Tags

Hansen

闷骚的完美主义的老青年。草根站长、自由撰稿人、资深网民、网络、文学以及娱乐八卦控。外贸人,SOLO族。石家庄婵然贸易有限公司、中邦智盛(深圳)贸易有限公司创始人

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.