内核编译中这些术语有什么区别

内核编译中这些术语有什么区别

条款如何

make、make bzImage、makemodules、makeinstall、makemodules_install 彼此相关。

我看到的一篇内核教程使用了所有 make bzImage、makemodules、makeinstall、makemodules_install 命令来编译和安装新内核。而另一个仅使用 make、make install 和 make module_install 命令。那么有什么区别呢?

答案1

随着时间的推移,Linux 内核编译过程本身得到了进一步的发展。它变得更加复杂,但也更加精简。在内核源目录中运行make help以查看所有目标的列表make以及每个目标的简要说明。

对于当前的 5.x 内核系列,命令makemake all是等效的:它们都将运行特定于体系结构的默认目标列表。

在 x86 硬件架构上,默认列表包含:

  • make vmlinux构建裸内核(如果您运行,这也会自动执行make bzImage,就像以前您可以制作压缩的可启动内核映像文件一样,您首先需要制作您想要压缩的东西;未压缩的版本也适用于某些内核调试工具。)
  • make modules构建内核模块
  • make bzImage创建可启动的压缩内核映像文件。

以上所有操作都可以以普通用户身份执行,无需额外权限。

另一方面,如果存在,make install将使用~/bin/installkernel或。/sbin/installkernel您自己的系统~/bin/installkernel可能会在适用的情况下使用sudo或类似的内容,但系统/sbin/installkernel通常被编写为期望您已经具有 root 访问权限。

同样,make modules_install会将新内核版本的模块复制到/lib/modules/<kernel_version>/目录树中,因此需要 root 访问权限才能成功运行。

由于最佳实践是在没有特定需要的情况下避免以 root 身份运行任何冗长且复杂的进程(例如内核编译!),因此当前的最小内核编译过程将类似于:

  • 以普通用户身份配置内核
  • 运行makemake all以普通用户身份运行
  • 运行sudo make modules_install以安装内核模块
  • 运行sudo make install以安装实际的内核。我建议最后执行此操作,因为/sbin/installkernel可能会触发其他操作,例如自动构建 initramfs 文件,并且如果新的内核模块已经就位,那么这些其他操作会更成功。

但是,如果您正在进行内核开发,而不仅仅是根据自己的需求构建定制内核,那么您可能需要使用更细粒度的流程;例如,如果您正在开发一个内核模块,您可能希望make modules作为单独的步骤运行,以便您可以更轻松地查看它是否由于您犯的错误而失败,并且可以更快地修复错误。修复错误后,您将可以跳到make modules再次运行,因为前面的步骤已经成功完成。

同样,使用早期内核启动过程的开发人员可能只需要 bzImage 在另一个系统(具有一组棘手的 ACPI 表或其他系统)中进行测试,而根本不关心模块。

相关内容