我正在阅读Unix 操作系统的设计作者:Maurice J Bach,关于文件系统挂载有两个问题:
为什么当文件表中挂载点inode的引用计数大于1时,文件系统挂载会失败?
为什么 Unix 不允许在多个点挂载文件系统?(如果允许这样做,会发生什么糟糕的事情?)
答案1
HP(HP-UX)手册页mount(2)
说:
如果 mount() 失败,则 errno 将设置为下列值之一。
[EACCES]
路径前缀的组件拒绝搜索权限。[EBUSY]
小路当前已安装,是某人的当前工作目录,或正处于繁忙状态。[EBUSY]
与 fs 关联的文件系统当前已挂载。
当您的问题 (1) 适用时,您会得到第一个 EBUSY,因为:
- 如果该目录已经是挂载点,您将无法访问先前挂载的目录,这使得先前的挂载变得无关紧要。
- 如果目录(比如说
/some/where
)是某个进程的当前目录,则您有一个对内容具有不同视图的进程/some/where
;新来者看到已挂载文件系统上的内容,但旧进程看到已挂载目录中的内容。
当文件系统已挂载时,您会得到第二个 EBUSY 来回答您的问题 (2) - 换句话说,您无法将其挂载两次。这是一件好事 - 如果两个单独的挂载点都假设它们对超级块等具有独占访问权限,而实际上它们是共享的,那么将存在可怕的混淆危险。如果创建文件/some/where/newfile
也同时创建,也会造成混淆,/opt/other/newfile
因为同一设备同时挂载在/some/where
和上/opt/other
。
我还没有检查 AIX、Solaris、Linux、MacOS X、BSD 手册页mount(2)
,但我预计行为应该是相同的。
答案2
这不是一个直接的答案,但你可以通过使用mount --bind
答案3
基本上,将一个文件系统挂载到多个位置的可能性打破了树状层次文件系统的概念,将其转换为有向无环图(即使您可以尝试将已挂载的文件系统挂载到 itshelf 的子目录中,这进一步打破了可能的循环、无向的一般图)。基本上,问题是,当您尝试使用已挂载根目录..
中的条目传递到父目录时,您必须选择要遵循现在的几个父目录中的哪一个才能到达父目录。
在 Linux 中,有一个--bind
mount 选项允许您在其他位置(不是已挂载的文件系统,而是普通目录)挂载一个目录(不一定是文件系统上的根目录),这样您就可以在 chroot(2)ed 进程上挂载 /proc 或 /sys 文件系统之类的东西,并让它们访问这个框架。
这种挂载方式与文件的软链接和硬链接之间的区别是一样的。内核对它的处理方式不同,它只允许每个根文件系统有一个真正的挂载点。原因基本上是相同的,因为您不能使用硬链接创建循环,而可以使用软链接。您不能再次挂载已挂载的文件系统,但可以mount --bind
多次挂载同一个目录。