`run-init` 到底是什么?

`run-init` 到底是什么?

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

# 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."

我搜索了ramdisk内容里的所有脚本,没有找到类似这样的文件名或者函数名,这到底是什么run-init情况?

答案1

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

所以主要功能是运行初始化.c,但它只是一个run_init函数的包装器,它位于运行初始化库

run_init做了很多工作:

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

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

答案2

根据dpkg-query它是软件包的一部分klibc-utils。对源代码进行一些挖掘后,会发现调用 来execv启动真实文件系统上的 init 进程。如果失败,run-init将返回,从而触发panic最后一行的 。

答案3

Ubuntu 14.04LTS 在空文件夹中创建文件 [get-it.sh]

#!/bin/sh

cp /boot/initrd* initrd.cpio.gz
mkdir initrd
cd initrd
zcat ../initrd.cpio.gz | cpio -di
find | grep run-init
cd ..

并运行它:bash get-it.sh

文件 run-init 将位于 ./bin/run-init

您也可以从安装 CD 获取 initrd

相关内容