Linux启动过程中,“init”从哪里执行?

Linux启动过程中,“init”从哪里执行?

我是 Linux 新手,在参加六月份开始的 Linux 服务器管理课程之前,我想对 Linux 启动过程有一个透彻的了解。

设置问题:在 Linux 启动过程中,内核和 initramfs 被加载到内存中之后...然后,内核通过 cpio 在内存中解压到 /boot/(一个基于 RAM 的虚拟文件系统),加载必要的模块等,然后....

内核执行/sbin/init程序。

问题:内核是从基于 RAM 的虚拟文件系统中的 /sbin/init 执行“init”程序,还是从物理磁盘执行,因为 / 分区已经被内核挂载了?

.... 内核何时停止使用基于 RAM 的文件系统,并开始使用物理 / 分区?

谢谢你,英格玛

答案1

内核从第一次执行 init 进程(无论是从 initramfs 还是“真实”分区)的那一刻起就放弃了控制权。它不会自行加载模块,而且肯定不会做“其他事情”。这些都是用户空间程序。

当挂载根文件系统需要的不仅仅是挂载基本分区时,通常会使用 initramfs。在 initramfs 的 init 进程/脚本完成后,它会使用 从根分区启动 init 程序exec()。这将替换当前的 init 进程。必须确保 init 程序永不终止 — — 这会导致内核崩溃。

简单地说:如果使用了 initramfs,则其 init 程序/脚本总是被使用。

答案2

在我的 Kubuntu 上,init 从 /sbin/init 运行,它是挂载在 / 上的块设备 /dev/sda5

该命令mount将告诉您文件系统是如何挂载的。您的 init 完全有可能从 ram-disk 运行。

另外,ps -aux | grep init告诉我:

root         1  0.0  0.0  27228  1644 ?        Ss   16:44   0:03 /sbin/init

其中 init 是 PID 1,在 /sbin/init 运行

相关内容