单独编译openwrt内核的简单方法
使用openwrt已经有一些时间了,openwrt官方的项目提供了很完整的工具链,只需要clone官方的git并且make即可自动完成openwrt镜像的构建。但是,这种方法比较臃肿,每次都会重新构建整个内核以及所有软件包,会花非常多的时间。并且,最近为了研究需要,想要编译旧版本的内核放在qemu当中运行,如果对于新的发行版,比如18.06,19.07的版本,可以使用make target/linux/compile就可以单独编译内核。但是旧编译链由于feeds都已经废弃,所以如果想要编译5,6年前的发行版内核,比如kamikaze,backfire这种n年前的发行版,目前要正常完整构建因为缺少很多第三方的svn源,已经不太可能了。所以本文给出了一种自己编译的方法,步骤也并不复杂,在此记录一下:
交叉编译链的选择
笔者这里使用目前比较流行的musl-cross编译链:
https://github.com/GregorR/musl-cross
按照官方操作说明生成对应架构的编译器即可,这里就不废话了。默认会安装在/opt/cross/xxxx-linux-musl之类下面,本文就以mips为例来操作。
获得内核源码
内核源码直接从kernel.org获得即可,openwrt内核和mainline的内核区别就在于openwrt对内核打了非常多的patch,只要从官方内核+patch即可得到openwrt的内核,以kamikaze版本的内核2.6.32.10为例,首先获得主线内核:
https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.10.tar.xz
解压之后,从openwrt的git中获得patch和增加的代码:
git clone https://git.openwrt.org/openwrt/svn-archive/openwrt.git cd openwrt git checkout <tag or commit>
然后将target/linux/genetic-2.6里面找到files目录,里面的内容直接覆盖到内核的根目录,然后复制target/linux/genetic-2.6/patches-2.6.32里面的patch到某个目录,然后在内核中应用openwrt中提取的patch即可,这个就比较麻烦只能手工操作了,我这里写了一个bash脚本来完成,保存成apply_patch.sh:
#!/bin/sh for file in `ls $1` do patch -p1 < $1"/"$file done
切换到内核根目录,然后运行上述脚本
./apply_patch.sh ./patches-2.6.32/
这样就打上openwrt的patch了,现在的内核就已经是openwrt的内核了。
构建内核
然后根据我们需要的架构,以mips为例,运行:
make ARCH=mips CROSS_COMPILE=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl- menuconfig make ARCH=mips CROSS_COMPILE=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl- make -j8
最终会在内核目录下生成vmlinux,即我们需要的内核了。
当然,编译过程可能会有一些错误,因为mainline内核要在交叉编译中正常使用,可能需要一些额外的patch,这些也需要自己收集一下打上。
foxwallop
果然疫情期间都比较无聊,我自己也是在学习编译padavan固件 但是里面的坑实在是又多又杂,还没踩完就复工了…搁置
Hanys
好像没有地方注册哦。。。想学DIY ssd丫。。。
Django
我傻了,搜搜软路由直接搜到了jarvisoj创始人的博客辽,大佬膜拜一下。。。。