编译Linux Kernel是件很有意思的事,让我们有种要开始开车的感觉。刚刚开始学习Linux内核,基本上第一步应该就是说让我来用我的电脑编译一个Linux内核,然后替换掉原有内核。反正跟着网上的各种教程走,基本不会翻车。
我是在CentOS的虚拟机上编译的,虚拟机是跑在最近刚刚整的一台最新的群晖Synology1821+的NAS,感觉性能还可以,具体版本如下:1
2
3Linux 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 | make |
其实我是在make的时候,不断发现要install包,才能完成,直到我完成,我就install了上面那几个包。
make menuconfig
利用系统已经存在的内核配置文件config文件可以方便的完成内核文件的配置,这个文件是隐藏的,执行以下命令:1
cp /boot/config-`uname -r` ./.config
如果不是第一次编译,可以首先执行这样一条语句:
make mrproper
将上一次编译的文件(.o .config)删除掉
执行 make menuconfig
会弹出如下的界面:
最右下角是 Load
,根据提示把 .config
文件选中导入,最后保存退出。
在config之后,make时发现一些错误,然后注释掉了下面的config
1 | CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" |
make
1 | 编译大内核,如果你想编译小内核,可以这样 make zImage |
留个疑问,zImage和bzImage是什么关系呢?网上翻一翻,没看太明白,后面看明白了再补上……
reboot
完成编译,重启就ok了,uname信息是1
2
3Linux 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)学习内核需要。
对于支撑业务,在行业中内核会有些什么样的作用呢?什么样的业务诉求需要做内核的定制呢?这个后面继续学习。