因此,通常 initramfs /init 脚本将以类似以下内容结尾
exec switch_root /newroot /sbin/init
有效地用 systemd 或任何能让你的船漂浮的东西替换它自己。但如果你在此之前分叉会发生什么?新的 init 系统仍然是分叉进程的父进程还是僵尸进程?对于 systemd,在 systemd 启动之前创建的子进程是否会产生“簿记问题”或产生其他不可预见的副作用?
编辑:在评论中询问示例代码。我真的看不出这会如何改变答案背后的原则,但可以肯定的是:
tail -f /dev/urandom &
exec switch_root /newroot /sbin/init
答案1
答案是没有什么大的事情发生。您正在通过 ing 替换您的进程exec
- 分叉进程只知道其父进程 pid 是 1,它并不真正关心该进程是 systemd 还是某些 initramfs /init
。唯一的阴暗之处是,它将是一个没有 systemd 服务的守护进程,因此日志记录、重新启动等将无法正常工作——除非您专门构建自己的服务,将其自身“附加”到分叉进程(可能不是很难)鉴于它应该有一个确定性的 pid 等)。
由于这些原因,通常不鼓励在常规启动后运行剩余的 initramfs 代码,但它不会使您的系统崩溃。评论区有一些有趣的讨论https://lwn.net/Articles/657345/对此进行了简要讨论。