谁能解释一下为什么Linux被设计成单一目录树?
在 Windows 中,我们可以有多个驱动器,例如C:\
、 和D:\
,而在 Unix 中只有一个根。有什么具体原因吗?
答案1
由于 Unix 文件系统早于 Windows 许多年,因此人们可能会重新表述这一问题:“为什么 Windows 为每个设备使用单独的指示符?”。
分层文件系统的优点是任何文件或目录都可以作为根目录的子目录找到。如果您需要将数据移动到新设备或网络设备,文件系统中的位置可以保持不变,应用程序将看不到差异。
假设您有一个操作系统是静态的系统,并且有一个具有高 I/O 要求的应用程序。您可以以只读方式挂载 /usr 并将 /opt(如果应用程序驻留在此处)放置到 SSD 驱动器上。文件系统层次结构不会改变。在 Windows 下,这要困难得多,特别是对于坚持位于 C:\Program Files\ 下的应用程序
答案2
这部分是出于历史原因,部分是因为这样更有意义。
多路系统
多路系统是第一个引入分层文件系统正如我们今天所知,目录可以包含目录。引用“用于二级存储的通用文件系统”作者:RC Daley 和 PG Neumann:
本文的第 2 部分介绍了文件的层次结构,这允许灵活地使用系统。该结构包含足够的功能来确保多功能性。 (……)
为了便于理解,文件结构可以被认为是文件树,其中一些是目录。也就是说,除了一个例外,每个文件(例如,每个目录)发现自己被恰好一个目录中的恰好一个分支直接指向。例外情况是位于树根部的根目录或根。尽管没有从任何目录显式指向根,但文件系统已知的虚构分支隐式指向根。 (……)
在任何时候,用户都被认为是在某个目录(称为其工作目录)中进行操作。他只需指定条目名称即可访问其工作目录中的条目有效指向的文件。多个用户可能同时拥有相同的工作目录。
与许多其他方面一样,Multics 寻求灵活性。用户可以在文件系统的子树中工作并忽略其余部分,并且仍然受益于目录来组织他们的文件。目录还用于访问控制——READ 属性允许用户列出目录中的文件,而 EXECUTE 属性允许用户访问该目录中的文件(这与许多其他功能一样,存在于 UNIX 中)。
Multics 也遵循单一存储池的原则。本文没有详细讨论这方面的内容。单个存储池与当时的硬件非常匹配:没有可移动存储设备,至少没有用户会关心的。 Multics确实有一个单独的备份存储池,但这对用户来说是透明的。
Unix
Unix 从 Multics 中汲取了很多灵感,但其目标是简单性,而 Multics 的目标是灵活性。
单一分层文件系统非常适合 Unix。与 Multics 一样,存储池通常与用户无关。然而,存在可移动设备,并且 Unix 确实通过mount
和umount
命令(保留给“超级用户”,即管理员)。在“UNIX 分时系统”,丹尼斯·里奇和肯·汤普森解释说:
尽管文件系统的根始终存储在同一设备上,但整个文件系统层次结构不必驻留在该设备上。有一个带有两个参数的挂载系统请求:现有普通文件的名称,以及特殊文件的名称,该文件的关联存储卷(例如磁盘包)应具有包含其自己的目录层次结构的独立文件系统的结构。挂载的作用是使对之前普通文件的引用改为对可移动卷上文件系统的根目录的引用。实际上,mount 将层次结构树的叶子(普通文件)替换为全新的子树(存储在可移动卷上的层次结构)。安装后,可移动卷上的文件与永久文件系统中的文件实际上没有区别。例如,在我们的安装中,根目录驻留在一个磁盘驱动器的一个小分区上,而包含用户文件的另一个驱动器则由系统初始化序列安装。可安装的文件系统是通过写入其相应的特殊文件来生成的。实用程序可用于创建空文件系统,或者可以简单地复制现有文件系统。
分层文件系统还具有将管理多个存储设备的复杂性集中到内核中的优点。这意味着内核更加复杂,但所有应用程序都变得更加简单。由于内核必须关心硬件设备,但大多数应用程序不需要,因此这是一个更自然的设计。
视窗
Windows 的祖先可以追溯到两个谱系:虚拟管理系统,最初设计的操作系统VAX小型计算机,以及CP/M,专为早期英特尔微型计算机设计的操作系统。
VMS有一个分布式分层文件系统,文件11。在文件 11 中,文件的完整路径包含节点名称、该节点上的帐户名称、设备名称、目录树路径、文件名、文件类型和版本号。 VMS 具有强大的逻辑名称功能允许定义特定目录的快捷方式,因此用户很少需要关心目录的“真实”位置。
CP/M 是为具有 64kB RAM 和软盘驱动器的计算机设计的,因此它追求简单性。没有目录,但文件引用可以包含驱动器指示(A:
或B:
)。
什么时候操作系统2.0 引入了目录,它使用的语法与 MS-DOS 1 兼容,MS-DOS 1 本身遵循 CP/M。因此,路径植根于具有单字母名称的驱动器。 (此外,VMS 和 CP/M 中使用斜杠字符/
来启动命令行选项,因此必须使用不同的字符作为目录分隔符。这就是 DOS 和后来的 Windows 使用反斜杠的原因,尽管某些内部组件也支持斜杠)。
Windows 保留了与 DOS 和 VMS 方法的兼容性,因此它保留了驱动器号的概念,即使它们变得不太相关。如今,Windows 在底层使用北卡罗来纳大学路径(最初开发的由 Microsoft 和 IBM 提供操作系统/2,有相关血统)。尽管这是为高级用户保留的(可能是由于历史的重量),但 Windows 确实允许通过安装重解析点。
答案3
使用单个目录树不存在安全问题。
设计 Unix 的人在操作系统方面拥有丰富的经验,这些操作系统要求用户知道哪个物理设备包含给定的资源。由于操作系统的部分目的是在实际硬件之上创建一个抽象机器,他们认为通过资源的物理位置来寻址要简单得多,因此决定将所有内容放入一个名称树中。
这只是背后天才的一部分Unix的设计。
答案4
*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/cdrom
Linux。这些都是一个目录,我并没有真正看出区别。当您在 Windows 下将 CDROM 放入驱动器时,该磁盘会D:
像在 Linux 中一样安装。