【引言】构建 Linux 内核

大家好,我
是系统解决方案部门的基础设施工程师 Wasshoi Man。
我的上一篇博客,我尝试使用了较大的字体,但有点过头了,所以这次我决定使用正常字体。
你知道内核是什么吗?
在计算机中,操作系统充当硬件和软件之间的桥梁。
操作系统并非单一软件,而是由多个软件组件构成,其核心部分称为内核。
这就是我对内核的全部了解;我只是隐约听说过它。
在那之后,即使我忙于日常工作,我也会偷偷地想着那位神秘的“上校”,
上校的身影仿佛无处不在。
“调整内核交换分区以调整交换分区使用情况。”
“使用 net.ipv4.tcp_max_syn_backlog 调整连接。”
“如果 fstab 文件出错,将会发生内核崩溃。”
作为一名业余基础设施工程师,我偶尔会在走廊里遇到这个人,并强烈地想要接近他,不知不觉中,我也开始有了和其他人一样的感觉。
了解内核是不是很酷?
那么,我所渴望的操作系统深处究竟隐藏着什么呢?
为了解开这个谜团,我们的研究团队深入操作系统内部进行了探索。
什么是构建?
顺便说一句,最棒的是内核是开源的,
所以你可以看到代码。这很酷。
然而,由于它是用 C 语言编写的 (*),因此不能直接使用。
必须先将其转换为二进制文件才能使用。
这构建或编译。
在构建过程中,您可以添加内核最初未包含的功能,或者相反,删除不必要的功能以减少内存消耗,甚至可以调整和修改源代码本身,以创建“我能想象到的最强大的内核”。
成为最好的感觉真好,不是吗?我相信市面上所有的 Linux 发行版都是出于这种想法而诞生的。当然,也有一些发行版是各种特殊情况下诞生的
(*)最近,采用以“所有权”概念而闻名的编程语言“Rust”作为内核开发的第二语言的趋势日益增长,因此我们未来可能会看到除 C 之外的软件包数量增加。
让我们尝试构建一个内核
来更好地理解它正如标题所示,实践是关键。
准备建造
构建方法有很多种,但这次我
将在CentOS 7安装源代码并进行各种操作可能很麻烦,尤其是在管理方面,但我选择这种方法是因为它允许你安装任何你想要的版本,并降低遇到特定发行版相关问题的几率。
以下步骤Vagrant 的 Bento Box 虚拟环境中执行的
首先,我们来下载内核源代码。
内核可从以下链接(或本站的镜像站点)获取。
*本文将使用长期支持版本 5.15.58。
Linux 内核档案库
https://www.kernel.org/
# 下载 tar 文件 [root@localhost]# cd /tmp [root@localhost tmp]# curl -O https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.58.tar.xz
# 解压 [root@localhost tmp]# tar xvf linux-5.15.58.tar.xz
提取的目录包含许多相关文件。
目录结构请参考以下网址:
https://linuxjf.osdn.jp/JFdocs/The-Linux-Kernel-15.html
接下来,我们将向环境中添加必要的物品。
需要的物品有很多,但最重要的如下:
- 编译器“GCC”
- 构建工具“make”
- 用于构建内核相关工具的库所需的头文件
- 其他图书馆
这些程序将使用以下命令安装:
# 安装一套用于源代码构建的工具 [root@localhost ~]# yum groupinstall "Development tools"
运行该命令后,将安装许多工具。
诸如“GCC”之类的重要工具包含在“开发工具”组软件包中,并使用“groupinstall”选项一次性全部安装。
然而,这还不够,所以我们还需要安装一些其他软件包。
列在我们刚刚解压缩的目录(以下简称源目录)Documentation/process/changes.rst
# 安装所需软件包 [root@localhost ~]# yum install clang squashfs-tools pcmciautils quota ppp nfs-utils procps-ng kernel-devel udev mcelog python-sphinx openssl-devel dwarves elfutils-libelf-devel ncurses-devel
"ncurses-devel" 用于控制台屏幕控制,之所以包含它,是因为在执行稍后将要执行的 "make menuconfig" 命令时需要它。
让我们更改构建设置
工具准备就绪后,我们来调整内核设置。有几种方法可以更改设置。
虽然可以直接编辑“.config”文件来更改设置,但这有点麻烦,所以这次我们将使用一种名为“menuconfig”的设置方法,它允许您通过菜单选择来更改设置。
现在,进入源代码目录并运行必要的命令。
[root@localhost linux-5.15.58]# make menuconfig ~~~ *** 编译器版本过旧。 *** 您的 GCC 版本:4.8.5 *** 最低 GCC 版本:5.1.0
我被训了一顿。抱歉。GCC
版本太旧了。
我明白了,正在更新当前的 GCC烦人的因为这很困难,软件集合 我们将使用红帽公司提供的系统中的较新版本的 GCC。
# 安装软件包 [root@localhost linux-5.15.58]# yum install scl-utils centos-release-scl # 安装包含 gcc 的工具集 [root@localhost linux-5.15.58]# yum install devtoolset-8 # 配置当前 shell 使用 gcc8 [root@localhost linux-5.15.58]# source scl_source enable devtoolset-8 # 检查版本 [root@localhost linux-5.15.58]# gcc -v
现在看来我终于可以使用 menuconfig 了,让我们试试运行它。
[root@localhost linux-5.15.58]# make menuconfig
来了
!设置窗口出现了。

屏幕顶部有文字说明,但为了概括操作方法和屏幕说明,
- 选择“选择”以返回,使用 Tab 键在“选择”和“退出”之间切换。
- Y 键启用该功能,N 键禁用该功能,M 键将该功能模块化(仅在必要时调用的状态),空格键在这些状态之间切换。
- 已启用的功能用“<*>”标记,已禁用的功能用“<>”标记,模块化功能用“<M>”标记。
高达 20,000 个
可配置的内核变量。这数字太惊人了。
开源软件真是太棒了。
内容太多,我就不一一赘述了。(我希望以后能了解更多,并在我的博客上写下来。我保证。)
相关文档。我的培训才刚刚开始。
现在我已经说完这些废话了,请选择“退出”离开“make menuconfig”界面。系统会询问
您是否要保存,请保存并退出。您应该会在源代码目录的根目录下看到一个名为“.config”的文件。打开这个文件
,您会发现它是内核构建配置文件。
正如我上面提到的,您可以直接编辑此文件,而无需使用“menuconfig”或其他工具。
让我们一起建造它
到了这一步,剩下的就简单了。
切换到源代码目录,尝试构建内核。
根据你的电脑配置,这可能需要很长时间,所以最好并行运行。
# 检查处理器数量 [root@localhost linux-5.15.58]# nproc
在我的虚拟环境中,结果是“2”。
# 使用 nproc 命令确认的处理器数量作为可选参数,并运行 make 命令以并行构建内核。[root@localhost linux-5.15.58]# make -j2
输入命令后,系统将开始处理。
这需要一些时间,您可以趁此机会吃点零食。
等了几个小时后,测试完成了。
期间,电脑发热得像夏天汽车引擎盖一样。
也许是CPU基准测试?
如果您查看源代码目录,您会发现已创建了各种相关文件,例如“vmlinux”和“modules.builtin”。
至此,构建终于完成。
让我们安装已编译好的内核
既然有机会,我就试试安装一下。
在此之前,我做了一些研究,发现 Linux 源代码目录通常放在“/usr/src/”下。(LPIC 上似乎也有人问过这个问题。嗯?我才 1 级???)
所以我很快决定移动这个目录。
由于不同发行版的源代码目录位置可能不同,所以研究一下会很有意思。
# 更改目录 [root@localhost]# mv /tmp/linux-5.15.58 /usr/src/ # 创建符号链接 [root@localhost]# ln -s /usr/src/linux-5.15.58 /usr/src/linux
合规性检查完成!
现在,让我们最终安装内核。
# 安装模块文件 [root@localhost linux]# make modules_install # 首先检查当前内核版本 [root@localhost linux]# uname -r 3.10.0-1160.71.1.el7.x86_64 # 安装内核和初始化磁盘映像 [root@localhost linux]# make install
所以我们先尝试重启一次。
[root@localhost linux]# 重启
所以,当我再次启动 VirtualBox 时,
/sbin/mount.vboxsf:挂载失败,错误信息:没有这样的设备
是啊……
他就是不肯站起来……
我不知道他为什么生气,但我知道他肯定是有事生气的。
这种事现实生活中也会发生。
显然,由于内核版本发生了变化,VirtualBox 管理的版本与正在更新的版本之间存在差异,导致共享文件夹无法挂载
。
看起来,如果添加某种插件,它在这方面就能发挥很好的作用。
确实有很多先驱者。
# 安装插件 vagrant plugin install vagrant-vbguest # 运行 vagrant vbguest # 完成后重新加载 vagrant reload
我们通过 SSH 登录查看版本。
[root@localhost ~]# uname -r 3.10.0-1160.71.1.el7.x86_64
嗯?
一切都没变。
检查操作系统启动时可用的内核版本。
[root@localhost ~]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg 0 : CentOS Linux (5.15.58) 7 (Core) 1 : CentOS Linux 7 Rescue f9788dcfa7cdc542bad786c12fab4a3c (3.10.0-1160.71.1.el7.x86_64) 2 : CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core) 3 : CentOS Linux (3.10.0-1160.66.1.el7.x86_64) 7 (Core) 4 : CentOS Linux (0-rescue-62851673ae88124499bf281ce5a57918)7(核心)
有
“0: CentOS Linux (5.15.58) 7 (Core)” ← 就是这样。看来构建过程
没有自动切换。这也是 VirtualBox 的配置要求吗?(我怀疑是这样)
现在,让我们使用“grub2-set-default”命令将默认启动列表编号“0”。
[root@localhost ~]# grub2-set-default 0
然后重启电脑,再尝试使用 SSH 连接。
[root@localhost ~]# uname -r 5.15.58
哇哦,
这就是我们这次打造的版本!
那挺好的!
想法
Linux是一个博大精深的领域。
我有很多不懂的地方,也学到了很多东西,包括故障排除。
如果我要创建自己的 Linux 发行版,我
可能需要自己安装内核和其他软件包。
听起来工作量很大,但感觉很有趣!
我觉得我的写作水平很差,这一点在我的文章中表现得很明显,但
我很满意,因为我学到了一些关于Linux的知识。
非常感谢!
27