如果某个进程的当前工作目录或根目录位于已安装的文件系统上,我可以卸载/重新安装该文件系统吗?
如果某个进程在已安装的文件系统上具有读/写文件描述符或读/写/共享映射文件,我可以将该文件系统重新挂载为只读吗?如果是,当您写入这些文件描述符和 mmap 时,它们会发生什么?
答案1
进程的工作目录和根目录被视为对文件系统的活动引用,与打开的文件相同。因此它们会阻止文件系统被卸载。内核返回“忙”错误。
EBUSY 目标无法卸载,因为它正忙。
如果没有打开用于写入的文件,则可以将文件系统重新挂载为只读。进程的工作目录和根目录不计为打开写入的文件;它们不会阻止文件系统重新挂载为只读。
EBUSY 源无法以只读方式重新安装,因为它仍然保持文件打开以供写入。
还有另一种情况:至少在某些文件系统上,如果打开了未链接的文件,则无法将其重新挂载为只读,即使是为了读取。关闭未链接的文件可以回收空间,但这可能需要更新磁盘上的文件系统元数据块。
该命令umount -l
(使用umount2(..., MNT_DETACH)
)能够从挂载树中分离繁忙的文件系统。文件系统保持活动状态。一旦最后一个打开的文件被关闭,它将被关闭。该文档没有说明关闭是否发生在后台,或者您是否可以依赖在最后一次 close() 调用返回后彻底关闭的文件系统。