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


11

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

我读了这篇文章,答案是说内核正在运行该初始化程序。

然后我开始怀疑,Linux通常带有一个initramfs,该initramfs最终将挂载和ivot_root到实际的根文件系统。那么,这种init说法是什么意思呢?initramfs中的路径?或者像我猜到的那样,它不是由内核读取的,而是由initramfs的init来执行真正的init的。

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

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

Answers:


18

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

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

这并不适用于initroot这确实是内核参数,由内核来处理。由于它们出现在中,因此它们也可以由用户空间作用/proc/cmdline。(因此,例如systemd考虑了quiet内核参数以减少其输出。)

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

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

当有一个initramfs时,所有这些都将在此发生,并且内核不会挂载目标卷。会发生什么内核运行的第一个init程序(通常是/init在initramfs的脚本)高达程序,而不是内核。如果安装了文件系统,则未传递给init它们的参数仍然可用。/proc/cmdline/proc


还有一点好奇,如果init-in-initramfs是set-uid-non-root文件,该怎么办?没有可执行位的文件?还是会以root身份运行吗?如果它损坏了ELF,或者找不到ld-linux.soELF或递归太深的脚本,或者根本无法执行,该怎么办?
炸鱼薯条德里克

3
我很确定内核不会从initramfs中加载“ init =“中指定的程序。如果正在使用initramfs,则在运行用户指定的init程序之前,它似乎可以正常运行(不确定是由内核执行此操作还是在initramfs中编写代码)。
–plugwash

@炸鱼薯条德里克要指定替代程序,而不是/init从ramdisk引导时,可以使用rdinit=/path/toboot参数。
pizdelect

3

传递自定义内核参数是在KickStart安装期间自定义系统的一种方法,例如PXE服务器可以设置:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

lab然后在KickStart配置中使用where 与其他系统版本进行不同的操作:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

在这里可以设置与其他系统类型不同的文件系统布局。给定涉及单个名称空间,希望用于本地自定义的标签与内核使用的标签不同。

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.