这个问题与我遇到任何技术问题无关。这是关于理解设计决策。
对我来说,问题是“为什么 Linux 中的挂载点需要是现有目录?”分为两部分:
- 为什么挂载点必须是目录?
- 为什么挂载点需要是现有文件?
这两种情况对我来说都没有意义。
如果我们现在假设挂载点由于某种原因需要存在,显然 VFS 用它们做了一些 FS 本身不支持的事情。那么为什么还要检查挂载点是否是一个目录呢?我自己能想到的唯一反驳论点是“是的,但是如果应用程序已经确定某个路径指向一个目录怎么办?”,我会回答:“好吧,如果它只有无论如何,即使没有安装,该路径也可能指向一个目录,或者它可能不再存在,那么无论安装如何,它仍然可以访问它。”
问题的第二部分对我来说更没有意义。同样,VFS 正在做 FS 不支持的事情。那么为什么要关心 FS 所说的呢?或者,如果我们决定关心,那么为什么要强迫有东西存在而不是强迫什么都没有呢?当然,如果什么都没有,那么你必须解决这样的问题:如果有人试图在这条路上创造一些东西,会发生什么。但这似乎是一件非常简单的事情。另一方面,如果我们强制要求存在某物,那么总是在存在挂载时,更高一级的 FS 子树会被隐藏。这似乎会导致许多其他问题,包括与我们之前遇到的一个问题相反的问题:如果有人试图删除该内容怎么办?但它也会导致诸如“如果某个进程当前正在导航该子树或其密码位于该子树中怎么办?”之类的问题。和“如果需要释放上层FS的空间并且要删除的文件在该子树中怎么办?”。
我不一定要寻找做出此设计决策的点(尽管知道这一点会很有趣,因为我认为它会追溯到很久以前)。我正在寻找做出此设计决定的原因。
答案1
在Unix中,目录也是一个文件,其内容是子文件的列表。
假设您要挂载/dev/sdb1
到/mnt/usb
,同时/mnt
是一个空目录。
如果允许在没有现有挂载点的情况下挂载,挂载后:
- 您可以访问
/mnt/usb
- 但在列表中
/mnt
没有名为 的条目usb
。
这会导致不一致。
所以挂载点必须是一个现有的文件才能同步/mnt
列表。现有文件甚至不必是目录,也可以是常规文件。