如何彻底卸载使用 aufs 的根文件系统

如何彻底卸载使用 aufs 的根文件系统

前言:我制作了一个使用 SquashFS 和 aufs 启动 Debian/Ubuntu 的启动映像。该映像包含已清理的 debootstrap 安装,压缩为 squashfs 映像。

squashfs 映像被视为我的文件系统的只读部分。本地硬盘被视为我的根文件系统的可写部分。

rootfs 的所有设置都是从​​ initramfs 完成的,它调用 switch_root 来启动 Debian/Ubuntu。rootfs 本身使用 aufs 安装在 squash 映像 (ro) 和硬盘 (rw) 上。

当 initramfs 运行时,我会检查硬盘是否已完全卸载。在挂载之前,我会通过调用“fsck -Cp”来确保硬盘已完全卸载(我知道,我不应该这么做)。

问题:我遇到的问题是,我的根文件系统的可写部分从未被正确卸载,导致它(例如,硬盘)处于不干净的状态。

问题的根源显然是硬盘被 aufs 文件系统使用。而 aufs 文件系统显然被 rootfs 使用。除此之外,我认为必须修改 Debian/Ubuntu 关机程序才能实现这一点。

到目前为止我做了什么: 我尝试手动关机,首先进入运行级别 1,然后强制 ro-remounts rootfs 和 hdd,但 hdd 仍然无法干净地卸载。

我还通过添加一个选项来创建 aufs 的安装方式xino文件在硬盘驱动器安装之外。我从未看到正在创建的文件,也无法使用 lsof 在硬盘驱动器上看到任何打开的文件。

最后但并非最不重要的一点是,我将硬盘添加到 Ubuntu 安装的 fstab 中,以便它识别它。不过,当 Debian/Ubuntu 关闭时,什么都没有改变 :(

从表面上看,我创建了一个“鸡和蛋”问题,因为如果不先卸载根文件系统,我就无法卸载硬盘,而我需要卸载根文件系统才能卸载硬盘,哈哈。

我完全不知道要运行什么命令才能正确卸载它,所以非常感谢任何帮助。

答案1

抱歉,您永远无法卸载根文件系统——无论您使用的是 squashfs+aufs,还是普通的 ext2/ext3/ext4...

您可以做的是将其重新挂载为只读,从数据完整性的角度来看,这是相同的。对于常规文件系统:

mount -oremount,ro /
sync # initiate writing any pending writes to disk
sleep 5 # and give writes some time to finish.

注意aufs有些不同,因为你需要确保aufs本身设置为只读时,其读写备份仍然可写...例如,假设/mnt/sq/rwext4 是你的 aufs 的读写部分吗?/“ 山:

 cat /proc/mounts > /etc/mtab # may not be needed if your mtab is symlink or otherwise reflects real situation
 fuser -mv / # show debug of what is using this disk and blocking unmount/ro-remount, if anything
 auplink / flush 
 mount -oremount,noxino,noplink,ro /
 mount -oremount,sync /mnt/sq/rw
 mount -oremount,mod:/mnt/sq/rw=ro /
 mount -oremount,ro /mny/sq/rw
 sync
 sleep 5
 cat /proc/mounts
 dmesg
 sleep 300 # to give you time to read mounts/dmesg info
 halt -d -f

在生产中你显然不需要调试信息......

简而言之,您刷新到磁盘并禁用需要写入 ext4 覆盖的 aufs 功能,然后强制 ext4 本身同步并变为只读,因此下次启动时它将被标记为干净卸载。

相关内容