![如何彻底卸载使用 aufs 的根文件系统](https://linux22.com/image/823327/%E5%A6%82%E4%BD%95%E5%BD%BB%E5%BA%95%E5%8D%B8%E8%BD%BD%E4%BD%BF%E7%94%A8%20aufs%20%E7%9A%84%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.png)
前言:我制作了一个使用 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 本身同步并变为只读,因此下次启动时它将被标记为干净卸载。