Lean's Openwrt docker编译记录

在本地跑是因为选择的软件包太多,编译占用超过Action限额,跑一半会被强制终止……粗略估计额外编译的软件包在4~6个左右似乎没问题

用docker是因为凑齐依赖挺麻烦的。如果用的ubuntu或者debian直接跑编译就行了。

Windows没试过,不知道能不能用docker编译

一切的开始,整备好网络环境,各显神通,下载出了问题能把人逼疯

1.docker容器准备

  • 没有什么特别的,pull一个ubuntu,进入容器
1
docker pull ubuntu
1
docker run -it --name=lede ubuntu:latest
  • 先把需要用到的软件包和依赖安装一下
1
apt update -y
1
apt full-upgrade -y
1
apt install sudo
1
apt install -y ack antlr3 aria2 asciidoc autoconf automake autopoint binutils bison build-essential bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pip libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev npm
1
apt-get -y autoremove --purge
1
apt-get clean
  • 不能用root用户编译,新建一个用户,切换过去

  • 起个用户名,比如’rimo‘

1
2
3
4
useradd -d /home/rimo -m rimo
passwd rimo
usermod -aG sudo rimo
su rimo

下次再来可以直接用该用户登录

1
docker exec --user rimo -it ContainerID /bin/bash

2.源码准备

  • clone一份源码
1
git clone https://github.com/coolsnowwolf/lede
  • 按需要添加源
1
echo 'src-git small8 https://github.com/kenzok8/small-package' >> ./feeds.conf.default

最近编译失败太多,保守了一点

1
2
3
4
#src-git netspeedtest https://github.com/sirpdboy/netspeedtest
# netspeedtest需要依赖npm,不在lede依赖中
src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small

更保守……

1
2
3
4
5
echo "src-git helloworld https://github.com/fw876/helloworld.git" >> "feeds.conf.default"
git clone https://github.com/KFERMercer/luci-app-tcpdump.git ./package/luci-app-tcpdump
git clone https://github.com/vernesong/OpenClash.git ./package/luci-app-openclash
git clone https://github.com/rufengsuixing/luci-app-adguardhome.git ./package/luci-app-adguardhome
git clone https://github.com/sirpdboy/netspeedtest.git package/netspeedtest

update feeds

1
./scripts/feeds update -a
  • feeds install
1
./scripts/feeds install -a

需要注意的是,有些自定义源中的软件包会和源码自带源冲突,make menuconfig时会出现报错

视情况追加参数 -f

切换默认主题为argon-mod

1
sed -i 's/luci-theme-bootstrap/luci-theme-argon-mod/g' ./feeds/luci/collections/luci/Makefile
  • 上传.config

    • 退出容器
1
docker exit

或者偷个懒,直接新建一个终端模拟器窗口,切过去执行

1
docker cp .config lede:/home/rimo/lede/
  • 回到容器,补完.config
1
make defconfig

没有准备.config的话直接生成

1
make menuconfig

  • 修改主机名
1
sed -i 's/OpenWrt/ShiinaWrt/g' ./package/base-files/files/bin/config_generate
  • 网络配置信息,按需修改,不改就不用管
    • 从 zzz-default-settings 文件的第2行开始添加
1
2
3
4
5
6
7
8
9
sed -i "2i # network config" ./package/lean/default-settings/files/zzz-default-settings
sed -i "3i uci set network.lan.ipaddr='10.10.10.252'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "4i uci set network.lan.proto='static'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "5i uci set network.lan.type='bridge'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "6i uci set network.lan.ifname='eth0'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "7i uci set network.lan.netmask='255.255.255.0'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "8i uci set network.lan.gateway='10.10.10.253'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "9i uci set network.lan.dns='10.10.10.253'" ./package/lean/default-settings/files/zzz-default-settings
sed -i "10i uci commit network\n" ./package/lean/default-settings/files/zzz-default-settings

3.开始编译

编译过程各种玄学出错……

  • 预下载编译所需的软件包
1
make download -j8 V=s
1
find dl -size -1024c -exec ls -l {} \;

输出有结果的话删除这些文件,然后重新make download

1
find dl -size -1024c -exec rm -f {} \;
  • 开始编译
1
make -j$(nproc)
  • 首次编译出错,想要错误日志的话单线程,很慢,很慢……
1
make -j1 V=s

按理说lean大的源码没那么多问题,但是玄学原因,或者改源码改翻车了,还是可能经历各种报错

23-01-01 small8/speedtest-web编译报错,以后再试试

  • 编译完成后的文件输出在 ./lede/bin/,拷贝出来就可以用了
  • ./lede/bin/packages/里是编译好的各种ipk
  • ./lede/bin/targets/里是固件
1
docker cp lede:/home/rimo/lede/bin 本机/lede

4.后续编译

  • 确认一下上次的容器
1
docker ps -a
  • 运行并用非root用户进入容器
1
docker run ContainerID
1
docker exec --user rimo -it ContainerID /bin/bash
  • 更新一下
1
apt update -y
1
apt full-upgrade -y
  • 如果是按上面顺序来的话源码是有小改动的,git pull需要合并
  • 避免出错,先清空旧的编译产物,还原源码后重新来一遍
1
make clean

或者更激进(更换编译架构的话必须用这边

1
make dirclean

彻彻底底清清空空,一般用不着,/dl、/feeds和.config文件也会删掉

1
make distclean
  • 避免合并麻烦,先还原 Open­Wrt 源码到初始状态。
  • 有需求的另外fork源码去修改更方便,这里只是轻度定制,没必要
1
git clean -xdf
  • 清除临时文件
1
rm -rf tmp
  • 拉取更新
1
git pull
  • 重复 # 2 和 # 3
  • 嫌麻烦写个脚本运行一下就行了

comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计