Linux内核裁剪
不知道最后能不能成功,但且先记录着,资料太多了,看得好迷茫。
安装虚拟机过程略,系统是Ubuntu 20.04.3 LTS。
环境准备
打开终端,下载 linux 源码,这里下载的版本是5.4.0
1 | |
下载完后打开下载目录,解压到 /home/USERNAME 。
值得一提的是这里的 linux-source-5.4.0.tar.bz2 是一个软链接,我们实际上是安装了一个软件包,这个软件包包含了源代码压缩包,并在 /usr/src 下创建了一个软链接,指向的是其同目录同名文件夹下的同名文件。
1 | |
进入解压后的源码目录
1 | |
安装交叉编译器,这里的 gcc 版本是 9.3.0
1 | |
编辑源码根目录下的 makefile 文件,检索 ARCH 字段,等于号后面填的是目标平台,可以在 arch/ 下找到对应的文件夹名。这里我们不填 arm64 而是 arm,前者会使后面的编译部分出现大量报错,原因未知。同时,在下一行增加 CROSS_COMPILE 填的是交叉编译的工具。
1 | |
此时输入 make menuconfig 启动配置内核界面会报错,根据提示安装缺少的软件包就行了,我就缺了4个包。
1 | |
内核裁剪
学艺不精,内核配置先略过,下篇再讲。这里从默认配置出发,先走一遍流程。
生成镜像(误)
配置完内核选项后,输入下面的命令生成镜像文件:
1 | |
出现报错:没有规则可制作目标“debian/canonical-certs.pem”
这是应该是证书出了问题,编辑源码根目录下的 .config 文件,检索 .pem,将两行代码中的值删除即可。

1 | |
再次生成,再报错:can’t open file “block/Kconfig”
看来是文件出了点问题,之前好奇动了很多东西,网上的笔记也看得很杂,改动也挺多的,下面重新解压代码重新搞。
生成镜像
有了之前的经历,例如源码下载、环境搭建等步骤就不用重新弄了。
重新将代码解压到合适位置,重新修改 makefile 与 .config 文件。再次运行生成指令:
1 | |
这次一切正常,但编译的速度有点慢了,可以加上 -j 参数开启多核编译。
1 | |
看这喂饱的CPU,针不戳。大概7分钟就生成好了,如果不加参数可能是12倍之多了。


生成镜像的路径在 arch/arm/boot/,路径与文件都与师兄师姐们的笔记不一样,应该是代码版本不同导致的,zimage 是 image 压缩后的文件,即便按照默认配置生成,这也是小到出乎我意料。

总结与问题
从linux官方文档库中可以看到,最新linux源代码版本是5.15,apt获取的源码而是19年的版本,如果需要从新的源码编译,就得手动下载。之前一条条 apt-get install 安装的工具也一样,很可能是过时的,如果需要安装新的软件,就需要自行去官网下载已编译或甚至编译的软件源码自行安装。这个过程是可以预见的,希望后面的记录会有体验到。
试过几次裁剪都以失败告终,例如中间提到的文件问题。但默认配置生成的镜像大小至少让我明白了,现阶段裁剪更多的是无用的驱动程序,在编译过程中出现了很多其他品牌的驱动都是无用的。
最后,提出一些问题,希望后面的篇章能做出解答:
- Uboot相关制作的切入点
- 根目录系统制作与Busybox的关系
- arch=arm64不可用的原因
- make menuconfig的大致流程
- 启动裁剪系统的方法