Jarvis's Blog

白帽子、全栈、IoT安全专家、嵌入式系统专家

单独编译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,这些也需要自己收集一下打上。

关于《流利说-英语》的学习体会

上一篇

嵌入式系统中linux内核insmod时出现Unable to handle kernel paging request at virtual address xxxx可能的原因

下一篇
评论
发表评论 说点什么
  • 果然疫情期间都比较无聊,我自己也是在学习编译padavan固件 但是里面的坑实在是又多又杂,还没踩完就复工了…搁置

  • 我傻了,搜搜软路由直接搜到了jarvisoj创始人的博客辽,大佬膜拜一下。。。。

550
0

    浙公网安备 33011002014706号