制作了一个适合在国内网络环境下编译OpenWrt/Lede的Ubuntu 22.04镜像,方便了调试流程。

需求

在编译coolsnowwolf的lede时卡在了系统包libubox上,报错error: implicit declaration of function ‘assert’。花了些时间debug后发觉是本机编译环境的问题,所以一个干净的新系统作为编译环境能省去不少麻烦。
多系统切换很麻烦,虚拟机则资源配置不够灵活,故Docker这种轻量的方案凸显优势。
国内的上网环境你懂的,所以还要处理编译时下载源码Sci上网的问题。
值得一提的是,如果你对调试代码不感兴趣,只是选择需要的部件那么强烈推荐使用 GitHub Actions 云编译 OpenWrt
而对于开发而言,本地编译速度更快(GA给的是2.1G志强的其中两核),且修改代码后只需编译修改的部分即可,所以弄个适合国内环境开袋即用的builder镜像还是很有必要。

建立容器

由于不能用root用户进行编译,故镜像跑的是普通用户,需事先建立权限为1000:1000(一般是第一个用户)的文件夹给容器挂载。

1
mkdir -p ~/src

运行容器。

1
docker run --rm -it -v ~/src:/home/user/src mjysci/openwrt-builder:jammy

配置Sci上网(可选)

镜像环境并没有带相关客户端,因为每个人的情况都不一样。这里假定机器192.168.1.1对内网开放了1080端口作为socks5代理。
编辑~/.curlrc

1
proxy = socks5h://192.168.1.1:1080

脚本中拉取源码压缩包用的是curl,这里强制其走代理通道。且配置文件位于$HOME,改一次就行了。
若还是不行可以试试注释掉curl的proxy,命令套上proxychains。编辑/etc/proxychains.conf:

1
2
quiet_mode
socks5 192.168.1.1 1080

由于在/etc,每次重开容器都会复位,需要再次设置。
另外Go已设置好国内代理的环境变量,不用管。

编译固件

1
2
3
4
5
6
7
git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
make -j8 download V=s
make -j$(($(nproc) + 1)) V=s

可能要套proxychains的是feeds update -amake -j8 download V=s
虽然有建议第一次编译用单线程跑,但这样太慢了。等出错再用make -j1 V=s排错。