我是 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 运行