内核是否真的使用了所有内核参数?

炸鱼薯*_*德里克 11 linux-kernel

为什么 Linux 允许 'init=/bin/bash'?

我读了这个,答案是说它是运行这个初始化程序的内核。

然后我开始怀疑,Linux通常带有一个initramfs,它最终会mount和pivot_root到真正的根文件系统。那么这个init论点是什么意思呢?initramfs中的路径?或者就像我猜的那样,它不是由内核读取,而是由 initramfs 的 init 来执行真正的 init。

另外,root=UUID=xxxx论点,是真正由内核读取还是仅由 initramfs 的 init 读取以找到真正的根文件系统?

似乎我可以将我想要的任何参数作为内核参数传递,那么它们是否都被内核读取,或者至少其中一些只对用户空间程序有意义?

Ste*_*itt 18

在内核命令行上传递的参数不一定对内核有意义:内核参数文档

内核将内核命令行中的参数解析为“--”;如果它不能识别参数并且它不包含“.”,则该参数将传递给 init:带有“=”的参数进入 init 的环境,其他参数作为命令行参数传递给 init。“--”之后的所有内容都作为参数传递给 init。

这不适用于initroot哪些确实是内核参数,并由内核处理。用户空间也可以对它们进行操作,因为它们出现在/proc/cmdline. (例如,systemd 会考虑quiet内核参数以减少其输出。)

当内核与一个initramfs的引导时,该root参数不使用直接由内核,并且init如果参数仅用于rdinit失败。init启动在 中处理kernel_init,其工作原理如下:

  • 如果存在可访问的“ramdisk 执行命令”(rdinit内核命令行上给定的值,或/init),内核会尝试运行该命令;
  • 如果失败,并且有一个“执行命令”(init内核命令行上给出的值),内核会尝试运行它,如果不能,则恐慌;
  • 作为最后的手段,内核尝试运行/sbin/init, /etc/init, /bin/init, 和/bin/sh; 如果这些都不能运行,它就会恐慌

当有 initramfs 时,所有这些都发生在那里,并且目标卷不是由内核挂载的。内核运行第一个程序(通常是 initramfs 中的脚本)会发生什么取决于程序,而不是内核。如果文件系统已挂载,则未传递给的参数仍然可用。init/initinit/proc/cmdline/proc

  • 我很确定内核不会从 initramfs 加载“init=”中指定的程序。如果 initramfs 正在使用中,那么它似乎在用户指定的 init 程序运行之前正常运行(不确定是内核执行此操作还是 initramfs 中的代码)。 (3认同)