我正在尝试设置一个从 LVM 格式的映像文件运行的 Linux 系统。在对 initramfs 和引导选项进行一些修改之后,我设法通过将主机文件系统安装到/run/initramfs/host
、losetup
将映像安装到/dev/loop0
并确保内核和 udev 检测到其中的 LVM(和根 LV)来使其启动并运行。到目前为止,一切都很好。
问题是,当关闭(或重新启动,或......)系统时,根文件系统和主机都没有正确卸载,因为先有鸡还是先有蛋的情况:根(或/oldroot
,如关机所指的那样) script) 无法卸载,因为/oldroot/run/initramfs/host
仍然安装,并且主机无法卸载,因为这样做会导致/oldroot
无法访问。
不干净的关闭并不是世界末日,因为两个文件系统都记录了日志,因此在下次启动时fsck
只需重播日志,但显然干净的关闭会更好。
所以问题是:是否有可能以某种方式安排关闭顺序(我能修改关闭脚本),或者启动顺序(也许通过将主机安装点移动到不同的位置)以便可以干净地卸载两个文件系统?
答案1
如果有人遇到同样的问题:
tmpfs
我所需要的只是在进行任何卸载之前,在关闭脚本中将主机文件系统的挂载点移动到根文件系统之外的位置(这很好,因为它在枢轴根中运行):
mount --move /oldroot/run/initramfs/host /host
这样可以/oldroot
干净地卸载。然后可以使用简单的命令卸载主机文件系统
umount /host
答案2
有一些操作系统做这种工作的技巧:
mount --move
这让你交换挂载点上的文件系统pivot_root
chroot
与切换/
根文件系统一起使用
最初,特征的目标是:
initramdisk
使用as启动内核根文件系统(保留一些RAM
用于未压缩initrd
)。- 访问所需的所有模块和脚本真正的根设备在第一个引导步骤中启动。 (这可能包含网络初始化和网络设备安装)
- 准备好后,检查真正的根设备并安装为就绪的根文件系统。运行
pivot_root
(andchroot
),因此运行后,ramdisk
将变为未使用的内存盘安装于/initrd
. - 因此,从那里,可以
umount /initrd
释放内存。
看看man mount
并且man pivot_root
!
答案3
要将文件系统标记为完全卸载而不使其上的文件不可用,请将其重新挂载为只读:
mount -o remount,ro /mount/point
即使该文件系统上有打开的文件可供读取、运行可执行文件、当前目录或活动安装点,也可以完成此操作。只有打开用于写入的文件才能防止以只读方式重新挂载。