为什么 Linux 的文件系统被设计为单个目录树?

use*_*323 93 filesystems mount directory-structure

谁能解释为什么将 Linux 设计为单个目录树?

而在 Windows 中,我们可以有多个驱动器,例如C:\, 和D:\,而在 Unix 中只有一个根。有什么具体原因吗?

don*_*l24 194

由于 Unix 文件系统比 Windows 早很多年,因此可以将问题重新表述为“为什么 Windows 为每个设备使用单独的指示符?”。

分层文件系统的优点是任何文件或目录都可以作为根目录的子目录找到。如果您需要将数据移动到新设备或网络设备,文件系统中的位置可以保持不变,应用程序不会看到差异。

假设您有一个操作系统是静态的系统,并且有一个具有高 I/O 要求的应用程序。您可以以只读方式挂载 /usr 并将 /opt(如果应用程序位于那里)放到 SSD 驱动器上。文件系统层次结构不会改变。在 Windows 下,这要困难得多,特别是对于坚持生活在 C:\Program Files\ 下的应用程序

  • 而那个(修辞)问题确实有一个答案:传统。只是一个与 Unix 不同的传统来自。Windows 是从 DOS 那里得到的,而 DOS 又是从 CP/M-80 得到的,它遵循许多小型机和大型机操作系统的共同模式。驱动器名称刚刚从`DISK0:` 或`SY:` 缩短为`A:`。 (28认同)
  • 我相信,从 Windows NT 开始,就可以在 Windows 中的给定虚拟路径上挂载设备以完成与 Unix 完全相同的事情,尽管这在家用 PC 上并不常见(在服务器和业务部署中比较常见)。如果您愿意,您可以选择将其视为对 Unix Way(tm) 的证明。 (13认同)
  • @BruceEdiger 我不会试图争辩 DOS 是对的。只是指出为什么 Windows 是这样的存在上下文,并且这不仅仅是 MS 从帽子里拿出来的东西。 (8认同)
  • @RBerteig - 也许是传统,尤其是在 Windows 的情况下,但 Rob Pike 在 The Hideeous Name 中为 Unix 风格的命名方案提出了一个相当有说服力的论点,http://pdos.csail.mit.edu/~rsc/pike85hideous.pdf (6认同)

Gil*_*il' 87

这部分是出于历史原因,部分是因为这样更有意义。

多媒体

Multics是第一个引入我们今天所知的分层文件系统的操作系统,其目录可以包含目录。引用RC Daley 和 PG Neumann 的“用于二级存储的通用文件系统”

论文的第 2 节介绍了文件的层次结构,可以灵活地使用系统。这种结构包含足够的能力来确保多功能性。(…)

为了便于理解,文件结构可以被认为是一棵文件树,其中一些是目录。即,除了一个例外,每个文件(例如,每个目录)发现自己被恰好一个目录中的一个分支直接指向。例外情况是位于树根的根目录或根目录。尽管它没有从任何目录明确指向,但根是由文件系统已知的虚构分支隐式指向的。(…)

在任何时候,用户都被认为是在某个目录中操作,称为他的工作目录。他可以简单地通过指定条目名称来访问由其工作目录中的条目有效指向的文件。多个用户可能同时拥有相同的工作目录。

在许多其他方面,Multics 寻求灵活性。用户可以在文件系统的子树中工作而忽略其余部分,并且仍然可以从目录中受益来组织他们的文件。目录也用于访问控制——READ 属性允许用户列出目录中的文件,而 EXECUTE 属性允许用户访问该目录中的文件(这与许多其他功能一样,存在于 unix 中)。

Multics 也遵循单一存储池的原则。本文不赘述这方面。单个存储池与当时的硬件非常匹配:没有可移动存储设备,至少没有用户会关心的。Multics 确实有一个单独的备份存储池,但这对用户是透明的。

Unix

Unix 从 Multics 中汲取了很多灵感,但其目标是简单,而 Multics 的目标是灵活性。

单一的分层文件系统非常适合 Unix。与 Multics 一样,存储池通常与用户无关。然而,有可移动设备,Unix 确实通过mountandumount命令将它们暴露给用户(保留给“超级用户”,即管理员)。在“UNIX 分时系统”中,Dennis Ritchie 和 Ken Thompson 解释说:

尽管文件系统的根总是存储在同一设备上,但整个文件系统层次结构不必驻留在该设备上。有一个带有两个参数的挂载系统请求:一个现有普通文件的名称,以及一个特殊文件的名称,该文件的关联存储卷(例如,磁盘包)应该具有包含自己的目录层次结构的独立文件系统的结构. mount 的作用是使对以前的普通文件的引用改为引用可移动卷上文件系统的根目录。实际上,mount 用一个全新的子树(存储在可移动卷上的层次结构)替换了层次树(普通文件)的一片叶子。挂载后,可移动卷上的文件和永久文件系统中的文件几乎没有区别。例如,在我们的安装中,根目录驻留在我们一个磁盘驱动器的一个小分区上,而另一个包含用户文件的驱动器由系统初始化序列挂载。可挂载的文件系统是通过写入其相应的特殊文件来生成的。可以使用实用程序来创建空文件系统,或者可以简单地复制现有文件系统。

分层文件系统还具有将管理多个存储设备的复杂性集中到内核中的优点。这意味着内核更复杂,但结果是所有应用程序都更简单。由于内核必须关心硬件设备,但大多数应用程序并不关心,这是一种更自然的设计。

视窗

Windows 的起源可以追溯到两个谱系:VMS,一种最初为VAX小型机设计的操作系统,以及CP/M,一种为早期英特尔微型计算机设计的操作系统。

VMS 有一个分布式分层文件系统Files-11。在 Files-11 中,文件的完整路径包含节点名称、该节点上的帐户名称、设备名称、目录树路径、文件名、文件类型和版本号。VMS 具有强大的逻辑名称功能,允许将快捷方式定义到特定目录,因此用户很少需要关心目录的“真实”位置。

CP/M 是为具有 64kB RAM 和软盘驱动器的计算机设计的,因此它只是为了简单。没有目录,但文件引用可以包括驱动器指示(A:B:)。

MS-DOS 2.0 引入目录时,它使用的语法与 MS-DOS 1 兼容,MS-DOS 1 本身遵循 CP/M。因此,路径以具有单字母名称的驱动器为根。(此外,/在 VMS 和 CP/M 中使用斜杠字符来启动命令行选项,因此必须使用不同的字符作为目录分隔符。这就是为什么 DOS 和后来的 Windows 使用反斜杠的原因,尽管一些内部组件也支持斜杠)。

Windows 保留了与 DOS 和 VMS 方法的兼容性,因此即使驱动器号变得不那么相关,它也保留了驱动器号的概念。今天,在幕后,Windows 使用UNC路径(最初由 Microsoft 和 IBM 为OS/2 开发,具有相关的祖先)。尽管这是为高级用户保留的(可能是由于历史的重要性),但 Windows 确实允许通过重新分析点进行安装。

  • 实际上,最初 CP/M 被设计为在 **16** 而不是 64 KB 的 RAM 中运行。64 KB 的数字可能是允许应用程序*一些* 喘息的空间;当命令处理器 (CCP) 被覆盖并在必要时重新加载时,BIOS 和 BDOS 始终驻留在内存中。是的,这就是 BIOS 的来源——IBM 没有提出这个术语!请参阅维基百科 [CP/M:*硬件模型*](https://en.wikipedia.org/wiki/CP/M#Hardware_model) 和*操作系统的组件*。请记住,16 KB 只是大约三个密集写入的页面(70 行 × 80 个字符/行 × 3 个页面 = 16800 字节)。 (5认同)
  • 尽管这不是默认行为,但使用 NTFS 文件系统,Windows 也可以将所有存储安装在单个根目录下:http://technet.microsoft.com/en-us/library/cc753321.aspx http://www.howtogeek。 com/98195/how-to-mount-a-hard-drive-as-a-folder-on-your-windows-pc/ http://serverfault.com/questions/24400/in-windows-how-to-安装文件夹作为驱动器 (3认同)
  • 似乎相关部分是 MS-DOS 1.0 是基于软盘的。在这样的系统上,(a) 知道您的文件在哪个物理磁盘上很重要,并且 (b) `A:` 和 `B:` 是区分软盘驱动器的一个不错的约定,如果你有两个软盘驱动器. 在 MS-DOS 2.0 中添加硬盘支持时,驱动器`C:` 名称允许向后兼容,将 HD 视为一张大软盘。 (3认同)

msw*_*msw 36

拥有单个目录树背后没有安全问题。

设计 Unix 的人在操作系统方面拥有丰富的经验,这些操作系统要求用户知道哪些物理设备包含给定资源。由于操作系统的部分目的是在真实硬件之上创建抽象机器,因此他们认为通过物理位置分配寻址资源要简单得多,并决定将所有内容放入一个名称树中。

这只是Unix 设计背后的天才的一部分。


Kaz*_*Kaz 28

请注意,在现代 Windows 中持续存在的 MS-DOS 驱动器号名称在这里是一个红鲱鱼。驱动器号名称不是具有多个根的文件系统结构的最佳表示。他们是这种系统的稻草人实施。

支持多个根的正确实现的文件系统将允许对卷进行任意命名,例如dvdrom:/path/to/file.avi. 例如系统将摆脱困扰 Windows 的可笑的用户界面问题。例如,如果您插入诸如相机之类的设备,Windows 资源管理器 UI 会让您相信有一个名为 Camera(或其他任何名称)的设备,并且您有一个类似Computer\Camera\DCIM\.... 但是,如果您从资源管理器中剪切并粘贴此路径的文本版本,它实际上不起作用,因为某些路径名组件是用户界面虚构的,底层操作系统不知道。在具有多个根的正确实施的系统中,这很好:会有一个camera:\DCIM\...在系统的每一层都被统一识别的路径。此外,如果您从旧 PC 上移植旧硬盘驱动器,您将不会被F:诸如old-disk:.

因此,如果 Unix 在文件系统结构中确实有多个根,那么它会像这样理智地完成,而不是像在 MS-DOS 和 Windows 中那样使用一个字母的驱动器名称。换句话说,让我们只将 Unix 方案与一个好的多根设计进行比较。

那么,为什么 Unix 没有健全的多根实现,而支持理智的单根实现呢?这可能只是为了简单起见。挂载点提供能够通过名称访问卷的所有功能。无需使用额外的前缀语法来扩展命名空间。

从数学上讲,任何不相交的树图(“森林”)都可以通过添加一个根节点并使不相交的部分成为其子节点来连接。

此外,卷不必位于根级别更加灵活。由于没有表示卷的特殊语法(它只是一个路径组件),挂载点可以在任何地方。如果你带来三个旧磁盘到你的机器,你可以让他们作为/old-disk/one/old-disk/two等等。然而你想,你可以整理磁盘,您组织的文件和目录的方式。

可以编写依赖于路径的应用程序,并且可以在重新配置存储设备时保持路径的有效性。例如,应用程序可以使用众所周知的路径,如/var/log/var/lib。这取决于你是否/var/log/var/lib在同一个磁盘卷或单独的。您可以将系统迁移到新的存储拓扑,同时保留路径。

挂载点是一个好主意,这就是为什么 Windows 从 Windows 2000 左右就拥有它们的原因。

卷挂载点对于在计算机中添加或删除设备时发生的系统更改非常有效。 微软技术网

  • 也许巧合的是,您的“良好的多根设计”听起来很像旧的 [AmigaDOS](http://en.wikipedia.org/wiki/AmigaDOS) 系统,它允许任意卷名称,包括引用的“指定”卷到另一个卷内的特定目录。您甚至可以(使用适当的 [软件](http://aminet.net/package/comm/tcp/FTPMount))拥有“虚拟”卷,例如“FTP:”卷,它允许您访问任何具有类似“FTP:hostname/path/to/file”的路径的 FTP 服务器。 (6认同)
  • 这确实不是一个好的答案,因为它似乎非常主观。它非常明显地抨击Windows。 (3认同)
  • @Rig 虽然这可能是真的,但 Windows 仍然拥有这些可追溯到 MS-DOS 的驱动器号名称,因此值得彻底抨击。这是大多数用户熟悉的多根文件系统,但我们不能真正将其用于与单根进行比较的目的,因为它是这种系统的一个稻草人示例。 (3认同)
  • @Kaz 我仍然觉得这个答案更像是咆哮。Windows 的文件系统有所不同,但它并没有使它错误、可怕或危害人类罪。你不喜欢它,因为你有权喜欢它。微软甚至没有提出这个方案,他们从当时流行的系统中借用了它,但他们必须维护它以使用遗留代码进行合理的可维护性。 (3认同)

ter*_*don 13

*nix 和 Windows 都安装了它们的驱动器。在 Windows 中,它们会自动安装在安装点中,默认情况下,这些安装点按字母升序排列。这些默认值是:

  • A:B:=> 软盘
  • C: => 第一个硬盘的第一个分区
  • D: => 如果不存在其他分区,则下一个分区或下一个硬盘驱动器或 CD/DVD 驱动器。

每个挂载点都是一个目录。

在 *nix 中,挂载点由用户决定。例如,我将一个分区安装为/,另一个安装为/home. 所以,/home是一个单独的驱动器,它相当于E:在 Windows上说。

在 Windows 和 *nix 两种情况下,挂载点都是单独的目录。唯一的区别是在 *nix 中,这些单独的目录是 的子目录/C:而在 Windows 中,每个挂载点都直接挂载在/My Computer比方说下。

从用户的角度来看,主要优点是安装件是完全透明的。我不需要知道该目录/home实际上是在一个单独的分区上。我可以将它用作普通目录。相反,在 DOS 中,我必须通过挂载点的名称显式调用它,例如E:\home

外部驱动器在两个系统中的安装方式几乎相同。说D:Windows 和/mnt/cdromLinux。每个都是一个目录,我真的看不出有什么区别。当您在 Windows 下将 CDROM 放入驱动器时,该磁盘D:就像在 Linux 中一样被挂载。

  • 出于好奇,您知道如果有人想在 Windows 上创建 27 个驱动器会发生什么吗?Windows 将第 27 个驱动器称为什么?:D (3认同)
  • 小吹毛求疵:Windows 中的驱动器号*默认*按字母升序排列,但它们可以并且经常被重命名。 (3认同)
  • @terdon:他只是将驱动器安装在一个目录中——就像你在 POSIX 操作系统中所做的那样。 (3认同)
  • @JosephR:在某些时候 - 我不确定什么时候,但可能是 NT - Windows 获得了在目录中安装驱动器的能力,就像 Unix 一样。默认情况下,实际上没有人这样做(这让我感到惊讶:随着核弹和铺路重新安装的频率,我认为类似于将 /home 放在单独的卷上的东西现在会变得流行)。但是,如果驱动器号/数字/符号用完,如果您想向系统添加更多驱动器,则必须执行此操作。 (3认同)
  • 哈哈哈。似乎 Windows [太沉闷](http://stackoverflow.com/questions/1944877/maximum-number-of-drives-in-windows) 甚至无法做到这一点。 (2认同)
  • @约瑟夫R。我想最后一条评论是针对你的。 (2认同)

Bru*_*ger 10

我同意上面的答案,尤其是 Doug O'Neal 的答案,但我认为他们都错过了一些东西,像 MS-DOS“C:”或“A:”这样的显式设备安装点也是如此。

Rob Pike 写了The Hideeous Name关于名字的语法,但 Russ Cox把它归结为

当可以添加新语义而不添加新语法时,命名空间...是最强大的。

可以任意安装设备的单个名称空间允许真正灵活的操作。我经常使用/mnt/sdb1/mnt/cdrom临时将当前未使用的磁盘或 CD 放入整个文件系统。在 NFS 服务器上拥有主目录并不少见,因此无论您登录哪台机器,您都能在$HOME任何地方获得相同的内容。

归结为:对特殊事物使用特殊语法对您可以做的事情施加了明确的限制。如果您只能在“E:”或“W:”或其他任何内容上挂载未使用的磁盘、CD 或 DVD,或者网络文件系统/“共享”,那么您的灵活性就会大大降低。

  • @Kaz,我认为 `proto://` 业务是务实的。不能指望每个软件都知道那里的所有 URI 方案。因此,了解方案 ID 何时结束以及 URI 的其余部分何时开始会很有帮助。 (3认同)
  • @Christopher Creutzig - 我在几个地方将 /usr/local 设置为网络驱动器。“本地”则表示站点本地,而不是机器本地。 (2认同)

小智 6

这是愚蠢的。Windows 也有一个层次结构点。但它是隐藏的和非标准的。作为大多数东西的窗户。

在这种情况下,它是“我的电脑”概念。这相当于 Unix 中的根 (/)。请记住,root 是存在于内核中的一个概念。你喜欢不喜欢。就像 Windows 对待“我的电脑”一样。当然,你可以在 unix 中在 root 上挂载一个分区,这是大多数人所做的。很多事情都会查看事物的特定路径(例如 /etc/),但您不受它的限制。无论如何,将驱动器安装在 /C:/ 中。在 unix 中你不被禁止这样做。

C:\ 在windows 中不是root,它是一个分区的挂载点。必须在顶级“我的电脑”上。在 unix 中,您可以在任何其他树下安装分区。因此,Linux 您可以将 C: 装入,/而将 D: 装入/mnt/d/... 甚至也装入,/但这很棘手,并且取决于安装在已装入路径之上时两个文件系统的行为。

因此,您可以通过“强制”自己遵循 Windows 随机强加给您的相同限制来获得与 Windows 完全相同的效果。

/ (treat this as "My Computer")
/c/ (mount your first data partition here)
/d/ (mount your second data partition here)
Run Code Online (Sandbox Code Playgroud)

然后,您必须在引导选项中传递挂载选项。因为你不会有 /etc/... 但这也是模拟窗口强加的限制,就像它所做的那样。

  • 那只是 GUI 演示。文件路径不使用“我的电脑”。 (5认同)
  • Windows 确实有一个单一的层次结构,它甚至有挂载点,但默认情况下不使用它们。 (4认同)
  • @gcb:关键是 shell 层次结构不能直接用于“普通”应用程序。您不能通过“我的电脑”或其他 shell 文件夹调用 `CreateFile`;这是一个只有与 shell 相关的代码才能理解的抽象,所有内核调用(因此 90% 的应用程序,因为大多数语言中的文件管理是根据内核文件 API 实现的)对这些东西一无所知。只有当程序使用“标准对话框”(理解 shell 命名空间)并且选定的文件直接映射到“真实”(=内核理解)路径时,shell 文件夹才可用。 (4认同)
  • “我的电脑”是 Shell 层次结构的根节点。它包含驱动器,_如果它们有驱动器号_,还有控制面板和任何连接的 Windows Phone。Shell 层次结构使用 PIDL 而不是路径。 (3认同)

小智 5

Windows 具有驱动器号的原因可能比 Microsoft 和 DOS 更早。为可移动驱动器分配字母在 IBM 系统上很常见,因此 Microsoft 可能只是通过复制 CP/M 来按照 IBM 的指示行事。最初,DOS 无论如何都没有目录。

当 MS-DOS 在具有一两个可移动磁盘且没有固定媒体的计算机上运行时,您实际上并不需要带有目录的文件系统。使用一个或两个 180 KB 磁盘,您永远不会有足够的文件来组织它们。

https://en.wikipedia.org/wiki/Drive_letter_assignment