为什么 Linux 允许 'init=/bin/bash'?
我读了这个,答案是说它是内核运行这个初始化程序。
然后我开始怀疑,Linux 通常带有一个 initramfs,它最终会挂载和 pivot_root 到真正的根文件系统。那么这个init
论点是什么意思呢?initramfs 中的路径?或者就像我猜的那样,它不是由内核读取,而是由 initramfs 的 init 来执行真正的 init。
另外,这个root=UUID=xxxx
论点是真正由内核读取还是仅由 initramfs 的 init 读取以找到真正的根文件系统?
似乎我可以将任何我想要的参数作为内核参数传递,那么它们是否都被内核读取,或者至少其中一些只对用户空间程序有意义?
在内核命令行上传递的参数不必对内核有意义:内核参数文档说
这不适用于内核参数
init
,root
哪些是内核参数,由内核处理。它们也可以由用户空间操作,因为它们出现在/proc/cmdline
. (因此,例如 systemd 会考虑quiet
内核参数以减少其输出。)使用initramfs启动内核时,内核
root
不直接使用该init
参数,仅在rdinit
失败时使用该参数。init
启动是在 中处理的kernel_init
,其工作原理如下:rdinit
内核命令行上给定的值,或者/init
),内核会尝试运行它;init
内核命令行上给出的值),内核会尝试运行它,如果不能运行,则会出现恐慌;/sbin/init
,/etc/init
,/bin/init
, and/bin/sh
; 如果这些都不能运行,它会恐慌。当有一个 initramfs 时,所有这些都发生在那里,并且目标卷不是由内核安装的。内核运行第一个程序(通常是 initramfs 中的脚本)后会发生什么取决于程序,而不是内核。如果文件系统已挂载,则未传递给的参数仍然可用。
init
/init
init
/proc/cmdline
/proc
传递自定义内核参数是在 KickStart 安装期间自定义系统的一种方法,例如 PXE 服务器可以设置:
然后在 KickStart 配置中使用where
lab
来做与其他系统构建不同的事情:在这里设置与其他系统类型不同的文件系统布局。考虑到所涉及的单个命名空间,希望与内核使用的标签不同的标签用于本地定制。