[简介]我尝试构建一个Linux内核
您好,我
是系统解决方案部门的基础设施 Wasshoi Man。
我的上一篇博客,我尝试过增加字体大小作为实验,但我做得太过分了,所以我决定反思一下,这次以正常大小书写。
你知道什么是内核吗?
在计算机中,操作系统充当硬件和软件之间的桥梁。
这个操作系统是由多个软件而不是单个软件组成的,其核心部分是内核。
我对内核的先决知识就到此为止,我感觉我只是隐约听说过它。
此后,我一边忙于日常工作,一边暗自思念那个隐约不明的“卡内尔”,但
在工作的方方面面,我都能看到上校的影子。
``调整内核交换性以调整交换使用情况''
``调整与 net.ipv4.tcp_max_syn_backlog 的连接''`
`如果无法写入 fstab,将会发生内核恐慌''
作为一名兼职基础设施工程师,我觉得我想更接近这个有时在走廊里经过的人,在不知不觉中,我有了你们许多人一定有的同样的感觉。
了解内核不是很酷吗? ?
我如此敬佩的操作系统深处到底有什么?
为了解开这个谜团,我们的研究团队深入操作系统。
什么是构建?
顺便说一下,最棒的是内核是开源的。
你可以看到代码。这是最好的。
然而,它是用C语言(*)编写的,因此不能按原样使用。
您需要将其转换为二进制并使用它。
这构建或编译。
例如,在构建时,您可以添加最初未包含在内核中的功能,删除不必要的功能以减少内存消耗,或者修改源代码本身以使其成为您可以想到的最强大的内核。
成为最强就好了。世界上的Linux发行版大概都是以同样的方式创建的。可能(当然,也有一些发行版是在各种事情发生后诞生的
(*) 最近,似乎有很多对以“所有权”概念而闻名的编程语言“Rust”的支持,将被采用作为内核开发的第二语言,因此可能会有更多其他软件包未来比C更重要。
现在,什么是内核?
无论如何,我会尝试构建它以便更好地理解标题集合。这只是一个练习问题。
准备好构建
有多种构建方法,但这次
我想在CentOS7无论你在世界的哪个地方,安装源代码并执行此操作都是一件痛苦的事情,包括管理方面,但它也有一个优点,即能够安装你喜欢的版本并且不太可能有工作时出现的问题取决于特定的分布,我们这次选择了这种方法。
此外,下面描述的工作是使用 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. .xz
# 解压 [root@localhost tmp]# tar xvf linux-5.15.58.tar.xz
解压后的目录中充满了许多相关文件。
结构请参考下面的URL。
https://linuxjf.osdn.jp/JFdocs/The-Linux-Kernel-15.html
接下来,我们把我们需要的东西放入环境中。
您需要几样东西,但最常见的如下:
- 编译器“GCC”
- 构建工具“make”
- 围绕内核构建工具时使用的库所需的“头文件”
- 其他图书馆
我们将使用这些命令安装它。
# 安装一套源码构建工具 [root@localhost ~]# yum groupinstall "开发工具"
运行该命令将安装许多工具。
诸如“GCC”之类的重要工具包含在名为“开发工具”的组包中,并使用“groupinstall”选项一起安装。
然而,这还不够,所以我们将安装一些额外的项目。
写在Documentation/process/changes.rst
中(以下简称源码目录)
# 安装所需的软件包 [root@localhost ~]# yum install clang squashfs-tools pcmciautilsquota 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 是麻烦的因为很难,软件集合 我们将使用 Red Hat 提供的机制来使用较新的 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 键模块化功能(仅在必要时调用的状态) 使用 Space 键按顺序在这些状态之间转换
- “<*>”显示在启用的功能旁边。“<>”显示在禁用的功能旁边。“<M>”显示在模块化功能旁边。
现在我已经到达设置屏幕,我想对其进行设置,但
显然有大约 20,000 个太大了。
开源真是太棒了。
太多了,所以我就省略细节了。 (我希望我能了解它并在我的博客上写下它。或者更确切地说,我会写它。)
有文档训练才刚刚开始。
现在您已经完成了借口,选择“退出”退出“make menuconfig”屏幕。
系统会询问您是否要保存,因此如果您保存并退出,则会在源目录的第一层中创建一个名为“.config”的文件。
如果你往里面看,你会发现这是内核构建配置文件。
正如我上面所写,您可以直接编辑此文件,而无需使用“menuconfig”或其他工具。
让我们构建
一旦你做到了这一步,剩下的就很容易了。
让我们转到源目录并构建内核,
具体取决于规范,这可能需要相当长的时间,因此最好并行运行它。
# 检查处理器数量 [root@localhost linux-5.15.58]# nproc
在我的虚拟环境中结果是“2”
# 使用 make 命令并行构建内核,将 nproc 命令确认的处理器数量作为可选参数 [root@localhost linux-5.15.58]# make -j2
当您键入命令时,一些处理就会开始。
时间很长,所以吃点零食然后等待。
经过几个小时的等待,大功告成。
在去那里的路上,我的电脑像夏季汽车的引擎盖一样热。
它是 CPU 基准测试吗?
如果检查源目录,可以看到已经创建了“vmlinux”和“modules.builtin”等各种相关文件。
到这里终于搭建完成了。
让我们安装构建的内核
我会借此机会尝试安装它。
在此之前,我做了一些研究,发现似乎有一种将linux源目录放在“/usr/src/”下的做法。 (LPIC里好像也会问啊?我有Level 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 module_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 救援 f9788dcfa7cdc542bad786c12fab4a3c (3.10.0-1160.71.1.el7.x86_64) 2:CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7(核心)3:CentOS Linux (3.10.0-1160.66) 。 1.el7.x86_64) 7 (核心) 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的知识,就很满足了。
非常感谢!