在Docker容器内编译OpenWrt/Lede
制作了一个适合在国内网络环境下编译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 | quiet_mode |
由于在/etc
,每次重开容器都会复位,需要再次设置。
另外Go已设置好国内代理的环境变量,不用管。
编译固件
1 | git clone https://github.com/coolsnowwolf/lede |
可能要套proxychains
的是feeds update -a
和make -j8 download V=s
。
虽然有建议第一次编译用单线程跑,但这样太慢了。等出错再用make -j1 V=s
排错。