Linux内核构建过程的每个步骤会发生什么?


27

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

在描述的过程Ubuntu的网站上做了很多工作,用的fakerootdpkgmake-kpkg,一些initramfs中,和其他可怕的东西,作品,但根本不帮我明白是怎么回事。

  • makelinux内核目录的输出是什么?
  • 它会创建“压缩内核映像”吗?
  • “压缩内核映像”文件的名称是什么,它放在哪里?
  • 怎么make modules办?
  • 应该make modules在之前还是之后完成make
  • 不会make自动构建模块吗?
  • 将新生成的内核添加到可启动内核列表中的过程(用英语,而不仅仅是命令列表)是什么过程?
  • 怎么make install办?
  • make install它添加到我的启动内核的列表,以便我没有做任何事情吗?
  • 是否有一个等效的make modules_install

Answers:


34

从一开始...

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

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

Ubuntu文档中额外的“可怕内容”是创建一个 deb程序包的。当您要做的比自己更多时,打包它会更好。您将及时切换。

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

实际上,除了内核开发人员或发行商打包程序之外,几乎没有任何人可以编译内核。在几乎任何情况下,所需的内核功能都已经为您构建,并且可以在预包装的内核之一中使用。也有例外,但这些天来极为罕见。

并不是说我不鼓励您构建自己的内核,而是实际上鼓励您这样做。我认为,从头开始构建内核对于了解内核如何工作是非常宝贵的实践。在某种程度上,因为也许有一天您成为例外。但是,它也通常教会您很多有关内核和启动过程的知识。您会做得更好。


1
非常感谢您对过程的理解。我有一些疑问。我的内核编译生成了vmlinux,而不是vmlinuz。我认为差异在于压缩。我应该手动压缩图像吗?是/vmlinuz在根文件夹的目录?当我进行安装时,将创建此目录并将新内核放置在该目录中吗?是否将make modules_install替换我当前安装的模块?假设我将vmlinux放在/ boot目录中,是否还需要做其他事情(例如编辑grub配置文件并执行grub-update或其他操作?)
AnkurVj 2011年

3
没错,区别在于压缩。该命令make bzimage是执行此操作的。/vmlinuz是二进制文件,而不是目录。在过去的五年中,我只制作了打包的内核,所以我不记得modules_install直接安装的内核的确切行为。Grub会在/boot没有帮助的情况下找到您的内核。是的,您应该grub-update在安装新内核后始终运行。
bahamat 2011年

所以我应该做make bzimage而不是make?我需要做一个make cleanmake bzimage一次吗?通过/vmlinuz你的意思是文件将在根目录或者Linux内核源代码目录中创建?
AnkurVj 2011年

1
无论您的内核是否压缩,这都没有关系。未压缩它只会占用更多的磁盘空间。任何带前缀的/都是绝对路径,所以是的,这是根目录中的文件。
bahamat 2011年

1
@GuyAvraham回答Y的模块已编译(即,它们是vmlinuz的一部分)。回答M的模块被编译为可加载模块。回答N的模块未编译。make modules_install只适用于回答的人M
bahamat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.