Linux内核-0x4 编译Kernel

编译Linux Kernel是件很有意思的事,让我们有种要开始开车的感觉。刚刚开始学习Linux内核,基本上第一步应该就是说让我来用我的电脑编译一个Linux内核,然后替换掉原有内核。反正跟着网上的各种教程走,基本不会翻车。

我是在CentOS的虚拟机上编译的,虚拟机是跑在最近刚刚整的一台最新的群晖Synology1821+的NAS,感觉性能还可以,具体版本如下:

1
2
3
Linux localhost.localdomain 
4.18.0-305.12.1.el8_4.x86_64 #1 SMP Wed Aug 11 01:59:55 UTC 2021
x86_64 x86_64 x86_64 GNU/Linux

可以看到内核版本是 4.18.0-305.12.1.el8_4.x86_64

download

下载linux内核source,在 官网下载 即可,随便选个版本,我选的是 5.13.11,我编译的时候最新的。

内核版本更新比较快,完成这篇文章时,已经是 5.13.12 了,版本的编号有约定规则的,不过目前对我来说,不太重要,后面再说。

yum install

什么都不要说,上来就先 sudo -u root yum install xxx,我install了如下几个包就完事了:

1
2
3
4
5
6
7
make
gcc
ncurses-devel
flex
bison
openssl-devel
elfutils-libelf-devel

其实我是在make的时候,不断发现要install包,才能完成,直到我完成,我就install了上面那几个包。

make menuconfig

利用系统已经存在的内核配置文件config文件可以方便的完成内核文件的配置,这个文件是隐藏的,执行以下命令:

1
cp /boot/config-`uname -r` ./.config

如果不是第一次编译,可以首先执行这样一条语句:
make mrproper
将上一次编译的文件(.o .config)删除掉

执行 make menuconfig 会弹出如下的界面:

makemenuconfig

最右下角是 Load,根据提示把 .config 文件选中导入,最后保存退出。

在config之后,make时发现一些错误,然后注释掉了下面的config

1
2
3
4
# CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
# CONFIG_SYSTEM_TRUSTED_KEYRING=y
# CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"
# CONFIG_DEBUG_INFO_BTF=y

make

1
2
3
# 编译大内核,如果你想编译小内核,可以这样 make zImage
make bzImage
make install

留个疑问,zImage和bzImage是什么关系呢?网上翻一翻,没看太明白,后面看明白了再补上……

reboot

完成编译,重启就ok了,uname信息是

1
2
3
Linux localhost.localdomain 
5.13.11 #3 SMP Tue Aug 17 20:16:22 CST 2021
x86_64 x86_64 x86_64 GNU/Linux

可以看到内核版本是 5.13.11

dev

网上说,一般用得多的是 arch 和 drivers 目录下的内容,我暂时不知道更多,边学边写。

写在最后

我为什么要编译内核?或者,编译内核的『新生代农民工』们为什么要编译内核?往往事情是先有需求,再有动作的,编译内核有什么样的需求,行业大佬们要做什么,我在网上找了找,一般是下面几种情况:

1)支撑业务需要裁剪内核,添加变更驱动,添加变更功能;

2)学习内核需要。

对于支撑业务,在行业中内核会有些什么样的作用呢?什么样的业务诉求需要做内核的定制呢?这个后面继续学习。