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\ 下的应用程序
Gil*_*il' 87
这部分是出于历史原因,部分是因为这样更有意义。
Multics是第一个引入我们今天所知的分层文件系统的操作系统,其目录可以包含目录。引用RC Daley 和 PG Neumann 的“用于二级存储的通用文件系统”:
论文的第 2 节介绍了文件的层次结构,可以灵活地使用系统。这种结构包含足够的能力来确保多功能性。(…)
为了便于理解,文件结构可以被认为是一棵文件树,其中一些是目录。即,除了一个例外,每个文件(例如,每个目录)发现自己被恰好一个目录中的一个分支直接指向。例外情况是位于树根的根目录或根目录。尽管它没有从任何目录明确指向,但根是由文件系统已知的虚构分支隐式指向的。(…)
在任何时候,用户都被认为是在某个目录中操作,称为他的工作目录。他可以简单地通过指定条目名称来访问由其工作目录中的条目有效指向的文件。多个用户可能同时拥有相同的工作目录。
在许多其他方面,Multics 寻求灵活性。用户可以在文件系统的子树中工作而忽略其余部分,并且仍然可以从目录中受益来组织他们的文件。目录也用于访问控制——READ 属性允许用户列出目录中的文件,而 EXECUTE 属性允许用户访问该目录中的文件(这与许多其他功能一样,存在于 unix 中)。
Multics 也遵循单一存储池的原则。本文不赘述这方面。单个存储池与当时的硬件非常匹配:没有可移动存储设备,至少没有用户会关心的。Multics 确实有一个单独的备份存储池,但这对用户是透明的。
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 确实允许通过重新分析点进行安装。
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 左右就拥有它们的原因。
卷挂载点对于在计算机中添加或删除设备时发生的系统更改非常有效。 微软技术网
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 中一样被挂载。
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,或者网络文件系统/“共享”,那么您的灵活性就会大大降低。
小智 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/... 但这也是模拟窗口强加的限制,就像它所做的那样。
小智 5
Windows 具有驱动器号的原因可能比 Microsoft 和 DOS 更早。为可移动驱动器分配字母在 IBM 系统上很常见,因此 Microsoft 可能只是通过复制 CP/M 来按照 IBM 的指示行事。最初,DOS 无论如何都没有目录。
当 MS-DOS 在具有一两个可移动磁盘且没有固定媒体的计算机上运行时,您实际上并不需要带有目录的文件系统。使用一个或两个 180 KB 磁盘,您永远不会有足够的文件来组织它们。
https://en.wikipedia.org/wiki/Drive_letter_assignment
| 归档时间: |
|
| 查看次数: |
12212 次 |
| 最近记录: |