casper mount 后整个 / 会被替换,因此 /init 或 initrd 中的其他脚本生成的文件会消失。如何才能让这些文件在登录实时系统后可见?
如果需要的话我可以编辑 initrd 中的任何文件
答案1
我不知道在实际根文件系统挂载后,有什么方法可以访问 initramfs 根文件系统。你尝试访问的 initramfs 中是否有生成的特定文件?由于你提到卡斯帕我假设您正在启动 live-cd 映像。
如果您可以访问控制台,则可以在挂载实际根文件系统之前暂停启动过程。例如,添加内核参数break=bottom
将在挂载实际根文件系统之前暂停启动过程,并在 initramfs 环境中打开救援 shell。
如果您对某些特定文件感兴趣,则(默认情况下)的内容/run/initramfs
将在 initramfs 环境和引导环境之间保留。某些日志文件会写入那里。您可能能够添加一个钩子来将文件复制到那里。(编辑我认为整个/run
文件系统都保留了下来)
编辑- 我找到了 Rob Landley 的几篇文章,它们为这个过程增添了更多色彩。它们都表明 initramfs 根目录的内容确实被破坏/删除了。
switch_root 所做的是从 rootfs 中删除所有文件(以释放内存),然后 chroot 到一个新的文件系统并在新的文件系统中执行一个新的 init 进程。
initramfs 是 rootfs:您既不能使用 pivot_root rootfs,也不能卸载它。相反,删除 rootfs 中的所有内容以释放空间(find -xdev / -exec rm '{}' ';'),使用新根覆盖 rootfs(cd /newmount; mount --move . /; chroot .),将 stdin/stdout/stderr 附加到新的 /dev/console,然后执行新的 init
由于 initramfs 是 ramfs,删除其内容会释放其使用的内存。
链接
- https://landley.net/writing/rootfs-programming.html
- https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
- https://github.com/mirror/busybox/blob/2dade4f18a86d05642aa6f3ef4c5b5100fd10907/util-linux/switch_root.c#L298
- https://www.michael-joost.de/linux_initramfs.html
- 启动后可以访问 initrd 文件系统吗?
- https://wiki.ubuntu.com/DebuggingCasper
- https://wiki.debian.org/InitramfsDebug
- https://manpages.ubuntu.com/manpages/bionic/en/man8/initramfs-tools.8.html