条款如何
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 内核系列,命令make
和make 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 身份运行任何冗长且复杂的进程(例如内核编译!),因此当前的最小内核编译过程将类似于:
- 以普通用户身份配置内核
- 运行
make
或make all
以普通用户身份运行 - 运行
sudo make modules_install
以安装内核模块 - 运行
sudo make install
以安装实际的内核。我建议最后执行此操作,因为/sbin/installkernel
可能会触发其他操作,例如自动构建 initramfs 文件,并且如果新的内核模块已经就位,那么这些其他操作会更成功。
但是,如果您正在进行内核开发,而不仅仅是根据自己的需求构建定制内核,那么您可能需要使用更细粒度的流程;例如,如果您正在开发一个内核模块,您可能希望make modules
作为单独的步骤运行,以便您可以更轻松地查看它是否由于您犯的错误而失败,并且可以更快地修复错误。修复错误后,您将可以跳到make modules
再次运行,因为前面的步骤已经成功完成。
同样,使用早期内核启动过程的开发人员可能只需要 bzImage 在另一个系统(具有一组棘手的 ACPI 表或其他系统)中进行测试,而根本不关心模块。