什么是`run-init`?

nai*_*231 3 initramfs

init在 bootint 过程中,初始 ramdisk 中有一个脚本。在最后一次操作中,它说:

# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."
Run Code Online (Sandbox Code Playgroud)

我在ramdisk内容中搜索所有脚本,找不到任何类似的文件名或函数名。run-init实际上是什么?

rth*_*rth 8

run-init是一个二进制可执行文件,它位于 /usr/lib/klibc/bin/run-init和您的 initramfs 中,由klibc-utilsUbuntu 中的包提供。它不是一个脚本,所以你不能直接看里面,你可以通过运行apt source klibc-utils或浏览上游存储库来查看它的源代码https://git.kernel.org/cgit/libs/klibc/klibc.git .

所以 main 函数在run-init.c 中,但它只是run_init函数的包装器,它位于runinitlib.c 中

run_init 做了很多工作:

  1. 它跳转到新的根文件系统
  2. 检查这是新的根文件系统
  3. 检查它是否在 initramfs 上
  4. 清理所有目录(为什么要浪费内存?)
  5. 挂载新的根文件系统
  6. 并在新的根文件系统中运行 init

我相信,由于依赖关系,通过脚本完成所有这些工作会非常复杂,但是二进制可执行文件可以非常轻松地完成。