绪论
首先要明确一下个人编译(包括各路大神编译出来的各种固件)的优缺点
优点:
- 可以自行决定要包含什么软件包,也可以把自定义的或者其它的软件包编译进去
- 可以修改各种参数,比如系统名称之类的,有点像修改安卓里build.prop的意思
缺点:
- 无法使用官方软件仓库,即opkg install,因为内核的指纹检测过不了,不过你可以通过各种奇奇怪怪的办法绕过,但是还可能有些奇奇怪怪的问题
- 操作有点复杂,全新编译时间长,还需要会处理各种编译时的报错,这涉及到很多很多知识,本篇会稍微带一点,但也绝对无法涵盖所有可能的报错
- 需要科学上网,否则不少依赖的文件无法下载或下载极慢
那为啥又要用macOS(M系列芯片)上编译呢?很简单,就是因为我买了个MacBook Air 2020作主力机了XD
这篇教程理论上也适用于ARM架构的其它平台的编译,毕竟在macOS上也是通过虚拟机装了个Ubuntu实现的嘛
做好处理各种问题的准备,继续前进吧
依赖及源码准备
安装一个Parallels,装好Ubuntu(用让它自己联网装的那个就好),至于这个软件你怎么买或者破解,不是本篇讨论的重点,这里就给个官网的链接.
我们这里以Lean大神的仓库为例
首先安装依赖的软件包,官方给出的那些事X86架构下的,需要把其中一些X86特有的软件包换成对应到ARM架构下的软件包,你可以通过Debian官网提供的软件包查询来找到对应的软件包(我第一次就这么干的),也可以用此处给出的命令一键安装:
sudo apt update&&sudo apt upgrade -y&&apt install -y gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget curl swig rsync
之后找一个文件夹,继续按照通常的流程走,先git clone https://github.com/coolsnowwolf/lede
把源码clone下来,然后cd lede
这里多一步,修改feeds.conf.default文件,加入下面这行,作用我不多说,点到为止:
src-git helloworld https://github.com/fw876/helloworld
如果你还想要用我定制化过的infinityfreedom主题的话,也可以加入下面这行:
src-git infinityfreedom https://github.com/realJiaoKan/luci-theme-infinityfreedom.git
此外,你有什么自己的软件源也可以加到这里
注意,别忘了在后续的操作中选择上这里添加的软件包哦!
之后跑一下老三样:
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
Menuconfig
进入到menuconfig之后,想折腾的可以每个目录都看看,看看英文大概也能明白都是干啥的
有几个地方可以关注一下
Target Images --->
Ext4还是SquashFS?简单来说,SquashFS后期无法扩容,你要用docker什么的话只能外挂分区,但是它可以做到类似于传统路由器的“重置”的效果,就是拿牙签戳Reset键的效果,Ext4的话虽然后期扩容什么的比较方便,但是要恢复初始设置就得再刷一次系统
落实到实际操作,你要使用ext4的话就把squashfs前面的*去掉,在ext4前面打上*就好,反之亦然(默认其实就是SquashFS)
此处有个地方需要注意,那就是内核分区的大小和最终分区的大小,分别对应了Kernel partition size (in MB)和Root filesystem partition size (in MB),如果你要编译许多许多的软件包的话这俩调大点,我用的分别是256和1024
LuCI --->
这里是我们需要主要配置的,你想要的软件包啥的基本都在这里选上安装就好了.
Applications --->
这是我们主要需要配置的,你可以自己看英文说明,也可以看看恩山论坛上定期更新的详细翻译版本
Themes --->
这里选择你要装的主题,如果你前面添加了我定制的infinityfreedom主题源的话别忘了在这里选上
Extra packages --->
把ipv6helper选上,添加一下IPv6支持
至此,配置就大致完成了,别忘了保存一下
Go环境配置
如果你现在直接编译的话,你会发现中间有报错,说go-bootstrap不能安装在ARM架构上,这里解决一下这个问题
首先装一下ARM版本的Go
sudo apt install golang-go
然后修改刚刚make menuconfig生成的.config文件,找到CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT=""这行,在双引号中填入/usr/bin/go
,此处如果你的Go安装路径有所不同,请自行修改
开始编译
至此,你已经可以开始编译了,你自然可以直接make,但还是先把所有需要下载的东西下载下来吧,如果你有稳定的“魔法力量”,也可以让它边编译边下载
make -j8 download V=s
开始编译,第一次由于大概率会遇到各种各样的问题,请使用单线程编译,这样错误信息可读性也会更高,你要去提交Issue时也请贴出单线程的log
make -j1 V=s
二次编译
这里参照GitHub上给出的就好
纯编译:
cd lede
git pull
./scripts/feeds update -a && ./scripts/feeds install -a
make defconfig
make -j8 download
make -j$(($(nproc) + 1)) V=s
如果要重新配置的话:
rm -rf ./tmp && rm -rf .config
make menuconfig
make -j$(($(nproc) + 1)) V=s
别忘了重新修改一下.config文件,因为旧的被删掉了
可能出现的错误以及处理办法
此处给出我遇到的一些问题以及我的解决办法
哈希校验失败
多是由于别的软件包更新了,哈希值变动了,但是官方的仓库里还没有改,你可以去提交Issue催促更新,或者自己把新的哈希值更具你的log替换到存对应校验哈希的文件里面
内核编译时提示补丁装不上
最近恰逢官方仓库的内核从5.10更新到5.15,我遇上了一个补丁没法装上去的错误,有三个解决办法
- “我不编译你还不行吗?”——手动把出错的补丁删掉,不过这估计会导致出一些奇奇怪怪的问题,你可以看看补丁里面的说明,我碰上的是个缩小安装包体积的补丁装不上,不编译它那就不编译吧
- 比较正常一点的办法是丢Issue,可以参考一下我丢的Issue
- 对于dalao来说,或许你可以试着自己修一下补丁,嗯,别忘了顺便commit一下帮助一下想我一样的小白们
一些软件包实在不支持ARM下编译
比如naiveproxy,我是直接不编译它了,我反正也用不到,实在需要的话就请自行解决吧
软件包冲突
这个的话你就自己回去menuconfig里面根据log改改软件包配置,直到冲突结束
这大概就是我遇到的问题了,希望能帮到你,如果你遇到了新的问题,先仔细阅读log,这很重要,这可以让你知道哪里出了问题,然后去Google,实在解决不了的话就去提交Issue或者找群友啥的吧
特别感谢
首先感谢Lean大神提供的仓库,大家去留个小星星吧
还有恩山论坛上的一篇帖子也给了我很多提示
Comments 2 条评论
大大 我的M芯片的mac根据你的教程在parallels desktop这个虚拟机里debian11编译成功了 但是在multipass这个虚拟机里面ubuntu(没有debian可选)安装依赖源什么的都很正常直到make menuconfig之后在.config文件里面找不到配置CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT=""这行 无数次失败无论ubuntu18 20 22我都试过
No rule to make target ‘.mk’. Stop.
大佬,为何我这里会报这个错?