李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

OpenWRT 旁路由编译

Table of Contents

1. 编译时的问题

严格按照 Github 主页 README.md 给出的条件进行环境配置。

  1. 缺少依赖 libelf-dev: 编译过程中提示缺少依赖 libelf-dev 导致跳过了某些模块的编译,最后得到的固件依然可用,但不知有什么问题。个人推测是用了其他的模块来代替,性能可能有所下降吧。
  2. root 分区,不要设 128, 256, 512, 1024 这类数值,尽量保持默认。
  3. 更改了某些 package 的配置,但编译后还用了原先的配置。最方便的办法是 make clean 重新编译。还可以执行 make menuconfig 去掉这个 package 编译一次,只需要几分钟,然后重新选上再编译一次就行了。
  4. 编译过程中不要 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_VERSIONPKG_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 后:

  1. Extra Packages -> autosamba 取消选择
  2. 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:

  • 选中 ext4squashfs 。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 DNSForwarderInclude 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内网穿透



Last Update: 2023-08-13 Sun 14:28

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议