Linux 内核构建过程的每一步都发生了什么?

Ank*_*rVj 30 ubuntu make linux-kernel

我已经阅读了许多关于如何使用这些内核构建自定义内核和启动 Ubuntu 的教程,并成功地遵循了指南并启动了自定义内核,但我不了解指南中的每个命令的作用以及实际发生的情况每个命令。

Ubuntu 网站上描述的过程对fakeroot, dpkg, make-kpkg, 一些 initramfs 和其他可怕的东西做了很多工作,但根本无法帮助我理解发生了什么。

  • makelinux内核目录中的输出是什么?
  • 它是否创建了“压缩内核映像”?
  • “压缩内核映像”文件的名称是什么?它放在哪里?
  • 有什么作用make modules
  • 应该make modules在之前还是之后make
  • 不会make自动构建我的模块吗?
  • 将新构建的内核添加到可引导内核列表的过程是什么(英文,不仅仅是命令列表)?
  • 有什么作用make install
  • make install它添加到我的可引导内核列表中,这样我就不必再做任何事情了吗?
  • 有等价物make modules_install吗?

bah*_*mat 39

从一开始...

  • make编译并链接内核映像。这是一个名为vmlinuz.
  • make modules为您M在内核配置期间回答的每个问题编译单独的文件。目标代码与您新构建的内核相关联。(对于Y已回答的问题,这些已经是 的一部分vmlinuz,对于已回答的问题,N它们将被跳过)。
  • make install将您构建的内核安装到/vmlinuz.
  • make modules_install将您的内核模块安装到/lib/modules/lib/modules/<version>

至于将其添加到可用内核列表中,则由引导加载程序处理。每个引导加载程序都不同,但grub在 x86 和 amd64 上最常见,因此我将对其进行描述。其实很简单。蛴螬看起来//boot/lib/modules任何东西,看起来像它可能是一个工作的内核,并增加了它。是的,这是一个过于简单化的描述。

Ubuntu 文档中额外的“可怕的东西”是创建deb包的额外东西。当您为自己做更多事情时,最好将其打包。你会及时切换。

构建内核和模块是分开的,因为对于需要的人(即内核开发人员)来说,他们通常只对一个模块进行更改。他们可以应用他们的更改,重建和安装模块。当每天必须完成 20 次时,这可以节省大量时间。它永远不会更新为具有单个make everything命令。相反,您make && make modules && make install && make modules_install 可以像文档所说的那样运行。构建过程有利于内核开发人员,而不是您。这就是它应该的方式。

实际上,除了内核开发人员或发行版打包人员之外,几乎没有任何人可以编译内核。几乎在任何情况下,您想要的内核功能都已经为您构建好了,并且可以在预打包的内核之一中使用。也有例外,但如今它们极为罕见。

并不是说我不鼓励您构建自己的内核,我实际上鼓励您这样做。我认为从头开始构建你的内核是学习它如何在那里工作的宝贵实践。部分原因是,也许有一天你成为需要的例外。但它也教你很多关于内核和启动过程的一般知识。你会因为这样做而成为一个更好的人。

  • 你是对的,区别在于压缩。命令 `make bzimage` 就是这样做的。`/vmlinuz` 是一个二进制文件,而不是一个目录。在过去的 5 年里,我一直只制作打包的内核,所以我不记得直接安装的内核的 `modules_install` 的行为。Grub 会在没有帮助的情况下在 `/boot` 中找到你的内核。是的,您应该在安装新内核后始终运行 `grub-update`。 (3认同)