在 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-utils
Ubuntu 中的软件包提供。它不是脚本,因此您无法直接查看内部内容,您可以通过运行apt source klibc-utils
或浏览上游存储库来查看其源代码https://git.kernel.org/cgit/libs/klibc/klibc.git。
所以主要功能是运行初始化.c,但它只是一个run_init
函数的包装器,它位于运行初始化库
run_init
做了很多工作:
- 它跳转到新的根文件系统
- 检查这是否是新的根文件系统
- 检查它是否在 initramfs 上
- 清理所有目录(为什么要浪费 RAM?)
- 挂载新的根文件系统
- 并在新的根文件系统中运行 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