OpenWRT 旁路由编译
Table of Contents
1. 编译时的问题
严格按照 Github 主页 README.md 给出的条件进行环境配置。
- 缺少依赖
libelf-dev
: 编译过程中提示缺少依赖 libelf-dev 导致跳过了某些模块的编译,最后得到的固件依然可用,但不知有什么问题。个人推测是用了其他的模块来代替,性能可能有所下降吧。 - root 分区,不要设 128, 256, 512, 1024 这类数值,尽量保持默认。
- 更改了某些 package 的配置,但编译后还用了原先的配置。最方便的办法是
make clean
重新编译。还可以执行make menuconfig
去掉这个 package 编译一次,只需要几分钟,然后重新选上再编译一次就行了。 - 编译过程中不要
Ctrl+C
终止,某个没有编译完成的模块下一次编译时会被认为已完成,可能会造成下面的模块无法编译。这个问题无解。理论上讲,打断后可以在make dir
删除相应的内容,但它往往只报错,并不显示出错的模块。
如果配置搞乱了,不要试图改回来,最方便的方法是重新编译: make clean
清除之前编译的可执行文件及配置文件,比如 bin 路径下面的文件,config 配置文件不会清除。或者用 make distclean
清除所有生成的文件。它连 feeds 也会干掉,只留下 git clone
完成时候的初始状态。
2. 修改内核版本
内核版本一般不用动,用默认的就行。但确实要动的话,首先需要确定到底要给哪个平台的固件改内核版本。
比如要给 x86 平台的固件修改内核版本,只要在 lede/target/linux/x86/Makefile 文件中把 KERNEL_PATCHVER
的值改成对应的内核版本即可。
通常,源代码会包含多个版本的内核: 注意到 lede/target/linux/ 路径下会有名为 config-<kernel_version>
的配置文件,这就是针对版本号为 <kernel_version>
的内核的编译选项。
内核版本号也只能在源码包含的内核版本中选择。
3. 魔法上网插件
因为众所周知的原因,Lean 删除了相关插件的 feed。需要用户自己加回来:
# 进入源代码根目录开始操作 (就是 lean 目录) # 删除 feeds.conf.default 文件中包含 hwlloworld 的行 sed -i "/helloworld/d" "feeds.conf.default" # 添加对应的 feed echo "src-git helloworld https://github.com/fw876/helloworld.git" >> "feeds.conf.default" # 然后从上游拉取代码 ./scripts/feeds update helloworld ./scripts/feeds install -a -f -p helloworld
要删除这个 feed 的话:
sed -i "/helloworld/d" "feeds.conf.default" ./scripts/feeds clean ./scripts/feeds update -a ./scripts/feeds install -a
执行 make menuconfig
后,可以在 LuCI -> Applications 中的 ssrp 条目上选择要使用的 v2ray 内核,有 v2ray 和 xray 两个可选。下面讲怎么更改内核版本,以 xray 内核为例。
在从上游拉取代码之后,feeds.conf.default 中指定的插件会出现在 lede/feeds 目录下。经过上面的操作,会多一个 lede/feeds/helloworld 目录,这个目录就是魔法上网相关插件的目录。
可以在 lede/feeds/helloworld/xray-core 目录下找到一个名为 Makefile 的文件,这个文件描述了要编译进 ssrp 的 xray 内核的相关信息。
如果需要指定 xray 内核版本的话,需要改 Makefile 文件的 2 个地方:
PKG_VERSION
这个变量保存了内核版本号。PKG_HASH
这个变量保存了从 Github 下载来的压缩包的 hash (SHA-256) 值。
给个例子,现在 lede/feeds/helloworld/xray-core/Makefile 的头几行被改成了这样:
... PKG_NAME:=Xray-core PKG_VERSION:=1.5.5 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)? PKG_HASH:=3f8d04fef82a922c83bab43cac6c86a76386cf195eb510ccf1cc175982693893 ...
此时需要用 PKG_VERSION
和 PKG_SOURCE_URL
两个变量组合出下载链接,组合结果是 https://codeload.github.com/XTLS/Xray-core/tar.gz/v1.5.5 。用这个链接下载文件到本地然后执行 sha256sum <tar.gz-file-name>
得到的结果就是 PKG_HASH
变量的值。
4. 虚拟化相关的包
如果编译出的系统最终会跑在虚拟机里,比如 Proxmox 或者 ESXi,就需要在编译时加入相关的包。
执行 make menuconfig
后:
- 如果用 VMware 系: Utilities -> open-vm-tools 选中
- 如果用 QEMU 系: Utilities -> Virtualization -> qemu-ga 选中
5. 硬盘管理相关的包
执行 make menuconfig
后, Utilities -> Disc 中可以自行选择需要的工具。
6. 精简体积
6.1. 可以不必编译进固件的 LuCI app
luci-app-accesscontrol 是用来限制设备的上网时间的,用 MAC 地址区分设备。
luci-app-adbyby-plux 是用来去广告的。如果有专门的网关设备的话,推荐把去广告的部分放在网关上。以降低这种不带硬件转发的设备的负载。
6.2. 去掉 IPv6 支持
执行 make menuconfig
后:
- Global build settings -> Enable IPv6 support in packages 取消选择
- Extra Packages -> ipv6healper 取消选择
如果选中了 ipv6healper 那么以下内容会被自动选中:
- Network -> odhcp6c, odhcpd-ipv6only
- LuCI -> Protocols -> luci-proto-ipv6
6.3. 去掉 coremark 跑分脚本
执行 make menuconfig
后: Utilities -> coremark 取消选择
但是去掉之后系统日志会报错:
Fri Jun 24 22:06:59 2022 daemon.err uhttpd[2287]: cat: can't open '/etc/bench.log': No such file or directory Fri Jun 24 22:06:59 2022 daemon.err uhttpd[2287]: cat: can't open '/etc/bench.log': No such file or directory Fri Jun 24 22:08:09 2022 daemon.err uhttpd[2287]: cat: can't open '/etc/bench.log': No such file or directory
ssh 连到 OpenWrt 之后执行下面的命令即可解决日志报错问题:
touch /etc/bench.log coremark >> /etc/bench.log
去掉 coremark 主要是为那些散热不好的设备考虑。如果有这个 app 的话,系统会找个时间自动开始跑分,这个操作会占满 CPU,有些散热不好的设备还没跑完分就暴毙了。如果机器的散热没问题的话这个包可以留着。
6.4. 去掉 samba 共享
执行 make menuconfig
后:
- Extra Packages -> autosamba 取消选择
- Luci -> Applications -> luci-app-samba 取消选择
6.5. 去掉 opkg 等包管理工具 (如果存储空间十分有限的话)
执行 make menuconfig
后:
- 去掉包安装工具: Base system -> opkg 取消选择
- 彻底断绝包的安装方式: Global build Settings -> Remove ipkg/opkg status data files in final images 选择
- 去掉从浏览器上传包的应用: Luci -> Applications -> luci-app-filetransfer 取消选择
7. 编译出的固件以何格式存储
执行 make menuconfig
后,进入 Target Images:
- 选中 ext4 和 squashfs 。ext4 文件系统不用多说;squashfs 文件系统是专为 flash 存储设备开发的文件系统,对于固态硬盘的损耗比 ext4 小,而且可以实现恢复出厂设置这个功能。
- 用 Build GRUB images (Linux x86 or x86_64 host only) 编译出的,就是 combined 固件;用 Build EFI GRUB images (Linux x86 or x86_64 host only) 编译出的,就是 uefi-gpt 固件。如果设备支持 uefi 启动,就用 uefi-gpt 固件,不支持就用 combined 固件。PVE 和 ESXi 上最好用不带 uefi 的固件。
- (0) Seconds to wait before booting the default entry 前面的数字代表了启动系统前等待的秒数。可以不改。
- Build LiveCD image (ISO) 选中以后,会编译出一个 ISO 镜像文件。方便刷写到其他存储设备里。
- 虚拟化磁盘文件,按需选择:
- Build PVE/KVM image files (QCOW2)
- Build VirtualBox image files (VDI)
- Build VMware image files (VMDK)
- Build Hyper-V image files (VHD)
- (16) Kernel partition size (in MB) 括号里的值表示内核分区的大小,16MB 足够,不用改。
- (160) Root filesystem partition size (in MB) 括号里的值表示系统根分区的大小。改成 300 可以应付大多数的,数路由器应有的需求。
8. 为固件添加编译者的信息
在 lede/package/lean/default-settings/files/zzz-default-settings 文件的第 49 行左右找到:
echo "DISTRIB_REVISION='R22.3.13'"
把它改成:
echo "DISTRIB_REVISION='R22.3.13 Compiled By Shouzhong Li'"
编译出固件以后会在 web ui 的底部显示:
Powered by LuCI Master (git-22.161.56906-efa5cfe) / OpenWrt R22.6.16 Compiled by Shouzhong Li
web ui 中的 状态 -> 总览 的 固件版本 也会显示:
OpenWrt R22.6.16 Compiled by Shouzhong Li / LuCI Master (git-22.161.56906-efa5cfe)
9. OpenWrt 虚拟机启动后无法连接也无法 ping 通
打开 /etc/config/network 网络配置文件,可以看到配置了静态 IP 的接口上没有配网关和 dns,写上以后 /etc/init.d/network restart
重启一下网络就行了。
option ipaddr '192.168.2.1' option netmask '255.255.255.0' option gateway '192.168.2.3' option dns '192.168.2.10'
10. LuCI App 特别说明
10.1. luci-app-turboacc
旧版 OpenWrt 在 LuCI -> Applications 里能找到 luci-app-turboacc 这个 app。
但是后来 luci-app-turboacc 这个 app 只有在选中 Include Flow Offload 之后才会出现。
除此之外 Include DNSForwarder 和 Include DNSProxy 也是旧 luci-app-turboacc 的部分,需要自行选中。
11. LuCI app 用途说明
LuCI —> Applications —> luci-app-accesscontrol #访问时间控制
LuCI —> Applications —> luci-app-acme #ACME自动化证书管理环境
LuCI —> Applications —> luci-app-adblock #ADB广告过滤
LuCI —> Applications —> luci-app-adbyby-plus #广告屏蔽大师Plus +
LuCI —> Applications —> luci-app-advanced-reboot #Linksys高级重启
LuCI —> Applications —> luci-app-ahcp #支持AHCPd
LuCI —> Applications —> luci-app-airplay2 #AirPlay音乐推流 (安卓 + IOS)
LuCI —> Applications —> luci-app-amule #aMule下载工具
LuCI —> Applications —> luci-app-aria2 # Aria2下载工具
LuCI —> Applications —> luci-app-arpbind #IP/MAC绑定
LuCI —> Applications —> luci-app-asterisk #支持Asterisk电话服务器
LuCI —> Applications —> luci-app-attendedsysupgrade #固件更新升级相关
LuCI —> Applications —> luci-app-autoreboot #支持计划重启
LuCI —> Applications —> luci-app-baidupcs-web #百度网盘管理
LuCI —> Applications —> luci-app-bcp38 #BCP38网络入口过滤 (不确定)
LuCI —> Applications —> luci-app-bird1-ipv4 #对Bird1-ipv4的支持
LuCI —> Applications —> luci-app-bird1-ipv6 #对Bird1-ipv6的支持
LuCI —> Applications —> luci-app-bmx6 #BMX6路由协议
LuCI —> Applications —> luci-app-bmx7 #BMX7路由协议
LuCI —> Applications —> luci-app-cifs-mount #CIFS/SMB挂载设置
LuCI —> Applications —> luci-app-cifsd #CIFS/SMB网络共享
LuCI —> Applications —> luci-app-cjdns #加密IPV6网络相关
LuCI —> Applications —> luci-app-clamav #ClamAV杀毒软件
LuCI —> Applications —> luci-app-commands #Shell命令模块
LuCI —> Applications —> luci-app-cshark #CloudShark捕获工具
LuCI —> Applications —> luci-app-ddns #动态域名 DNS (集成阿里DDNS客户端)
LuCI —> Applications —> luci-app-diag-core #core诊断工具
LuCI —> Applications —> luci-app-diskman #磁盘管理工具
—luci-app-diskman —> Include btrfs-progs #新型的写时复制 (COW)
—luci-app-diskman —> Include lsblk #lsblk命令 用于列出所有可用块设备的信息
—luci-app-diskman —> Include mdadm #mdadm命令 用于创建、管理、监控RAID设备的工具
—luci-app-diskman —> Include kmod-md-raid456 #RAID 4,5,6 驱动程序模块
—luci-app-diskman —> Include kmod-md-linear #RAID 驱动程序模块
LuCI —> Applications —> luci-app-dnscrypt-proxy #DNSCrypt解决DNS污染
LuCI —> Applications —> luci-app-dnsforwarder #DNSForwarder防DNS污染
LuCI —> Applications —> luci-app-dockerman #Docker容器
LuCI —> Applications —> luci-app-dump1090 #民航无线频率 (不确定)
LuCI —> Applications —> luci-app-dynapoint #DynaPoint (未知)
LuCI —> Applications —> luci-app-e2guardian #Web内容过滤器
LuCI —> Applications —> luci-app-familycloud #家庭云盘
LuCI —> Applications —> luci-app-filetransfer #文件传输 (该功能支持浏览器安装ipk包)
LuCI —> Applications —> luci-app-firewall #添加防火墙
LuCI —> Applications —> luci-app-flowoffload #Turbo ACC网络加速 (集成FLOW,BBR,NAT,DNS…)
LuCI —> Applications —> luci-app-freifunk-diagnostics #freifunk组件 诊断 (未知)
LuCI —> Applications —> luci-app-freifunk-policyrouting #freifunk组件 策略路由 (未知)
LuCI —> Applications —> luci-app-freifunk-widgets #freifunk组件 索引 (未知)
LuCI —> Applications —> luci-app-frpc #内网穿透Frp客户端
LuCI —> Applications —> luci-app-frps #内网穿透Frp服务端
LuCI —> Applications —> luci-app-fwknopd #Firewall Knock Operator服务器
LuCI —> Applications —> luci-app-guest-wifi #WiFi访客网络
LuCI —> Applications —> luci-app-haproxy-tcp #HAProxy负载均衡-TCP
LuCI —> Applications —> luci-app-hd-idle #硬盘休眠
LuCI —> Applications —> luci-app-hnet #Homenet Status家庭网络控制协议
LuCI —> Applications —> luci-app-ipsec-vpnd #VPN服务器 IPSec
LuCI —> Applications —> luci-app-kodexplorer #KOD可道云私人网盘
LuCI —> Applications —> luci-app-lxc #LXC容器管理
LuCI —> Applications —> luci-app-meshwizard #网络设置向导
LuCI —> Applications —> luci-app-minidlna #完全兼容DLNA / UPnP-AV客户端的服务器软件
LuCI —> Applications —> luci-app-mjpg-streamer #兼容Linux-UVC的摄像头程序
LuCI —> Applications —> luci-app-mtwifi #联发科 MT WiFi驱动的支持,其它硬件配置不要选这个
LuCI —> Applications —> luci-app-music-remote-center #DAAP遥控音乐服务器
LuCI —> Applications —> luci-app-mwan3 #MWAN3负载均衡
LuCI —> Applications —> luci-app-mwan3helper #MWAN3分流助手
LuCI —> Applications —> luci-app-n2n_v2 #N2N内网穿透 N2N v2 VPN服务
LuCI —> Applications —> luci-app-netdata #Netdata实时监控 (图表)
LuCI —> Applications —> luci-app-nfs #NFS网络共享
LuCI —> Applications —> luci-app-nft-qos #QOS流控 Nftables版
LuCI —> Applications —> luci-app-nlbwmon #网络带宽监视器
LuCI —> Applications —> luci-app-noddos #NodDOS Clients 阻止DDoS攻击
LuCI —> Applications —> luci-app-ntpc #NTP时间同步服务器
LuCI —> Applications —> luci-app-ocserv #OpenConnect VPN服务
LuCI —> Applications —> luci-app-olsr #OLSR配置和状态模块
LuCI —> Applications —> luci-app-olsr-services #OLSR服务器
LuCI —> Applications —> luci-app-olsr-viz #OLSR可视化
LuCI —> Applications —> luci-app-openvpn #OpenVPN客户端
LuCI —> Applications —> luci-app-openvpn-server #易于使用的OpenVPN服务器 Web-UI
LuCI —> Applications —> luci-app-p910nd #打印服务器模块
LuCI —> Applications —> luci-app-pagekitec #Pagekite内网穿透客户端
LuCI —> Applications —> luci-app-polipo #Polipo代理 (是一个小型且快速的网页缓存代理)
LuCI —> Applications —> luci-app-pppoe-relay #PPPoE NAT穿透 点对点协议 (PPP)
LuCI —> Applications —> luci-app-privoxy #Privoxy网络代理 (带过滤无缓存)
LuCI —> Applications —> luci-app-qbittorrent #BT下载工具 (qBittorrent)
LuCI —> Applications —> luci-app-qos #流量服务质量 (QoS) 流控
LuCI —> Applications —> luci-app-radicale #CalDAV/CardDAV同步工具
LuCI —> Applications —> luci-app-ramfree #释放内存
LuCI —> Applications —> luci-app-rp-pppoe-server #Roaring Penguin PPPoE Server 服务器
LuCI —> Applications —> luci-app-samba #网络共享 (Samba)
LuCI —> Applications —> luci-app-samba4 #网络共享 (Samba4)
LuCI —> Applications —> luci-app-sfe #Turbo ACC网络加速 (flowoffload二选一)
LuCI —> Applications —> luci-app-s-s-libes #SS-libev服务端
LuCI —> Applications —> luci-app-shairplay #支持AirPlay功能
LuCI —> Applications —> luci-app-siitwizard #SIIT配置向导 SIIT-Wizzard
LuCI —> Applications —> luci-app-simple-adblock #简单的广告拦截
LuCI —> Applications —> luci-app-softethervpn #SoftEther VPN服务器 NAT穿透
LuCI —> Applications —> luci-app-splash #Client-Splash是无线MESH网络的一个热点认证系统
LuCI —> Applications —> luci-app-sqm #流量智能队列管理 (QOS)
LuCI —> Applications —> luci-app-squid #Squid代理服务器
LuCI —> Applications —> luci-app-ssr-plus #ShadowsocksR Plus+
—luci-app-ssr-plus —> Include Shadowsocks V2ray Plugin #SS V2Ray插件
—luci-app-ssr-plus —> Include V2Ray #V2ray客户端
—luci-app-ssr-plus —> Include Trojan #Trojan客户端
—luci-app-ssr-plus —> Include redsocks2 #redsocks2代理
—luci-app-ssr-plus —> Include Kcptun #Kcptun加速
—luci-app-ssr-plus —> Include ShadowsocksR Server #SSR服务器
LuCI —> Applications —> luci-app-ssrserver-python #SSR Python服务器
LuCI —> Applications —> luci-app-statistics #流量监控工具
LuCI —> Applications —> luci-app-syncdial #多拨虚拟网卡 (原macvlan)
LuCI —> Applications —> luci-app-tinyproxy #Tinyproxy是 HTTP (S) 代理服务器
LuCI —> Applications —> luci-app-transmission #BT下载工具
LuCI —> Applications —> luci-app-travelmate #旅行路由器
LuCI —> Applications —> luci-app-ttyd #网页终端命令行
LuCI —> Applications —> luci-app-udpxy #udpxy做组播服务器
LuCI —> Applications —> luci-app-uhttpd #uHTTPd Web服务器
LuCI —> Applications —> luci-app-unblockmusic #解锁网易云灰色歌曲3合1新版本
—UnblockNeteaseMusic Golang Version #Golang版本
—UnblockNeteaseMusic NodeJS Version #NodeJS版本
LuCI —> Applications —> luci-app-unblockneteasemusic-go #解除网易云音乐 (合并)
LuCI —> Applications —> luci-app-unblockneteasemusic-mini #解除网易云音乐 (合并)
LuCI —> Applications —> luci-app-unbound #Unbound DNS解析器
LuCI —> Applications —> luci-app-upnp #通用即插即用UPnP (端口自动转发)
LuCI —> Applications —> luci-app-usb-printer #USB 打印服务器
LuCI —> Applications —> luci-app-v2ray-server #V2Ray服务器
LuCI —> Applications —> luci-app-verysync #微力同步
LuCI —> Applications —> luci-app-vlmcsd #KMS服务器
LuCI —> Applications —> luci-app-vnstat #vnStat网络监控 (图表)
LuCI —> Applications —> luci-app-vpnbypass #VPN BypassWebUI 绕过VPN设置
LuCI —> Applications —> luci-app-vsftpd #FTP服务器
LuCI —> Applications —> luci-app-watchcat #断网检测功能与定时重启
LuCI —> Applications —> luci-app-webadmin #Web管理页面设置
LuCI —> Applications —> luci-app-webshell #网页命令行终端
LuCI —> Applications —> luci-app-wifischedule #WiFi计划任务
LuCI —> Applications —> luci-app-wireguard # WireGuard VPN
LuCI —> Applications —> luci-app-wirelessregdb #WiFi无线
LuCI —> Applications —> luci-app-wol #WOL网络唤醒
LuCI —> Applications —> luci-app-wrtbwmon #实时流量监测
LuCI —> Applications —> luci-app-xlnetacc #迅雷快鸟
LuCI —> Applications —> luci-app-zerotier #ZeroTier内网穿透