#1 楼
由于Unix文件系统比Windows早许多年,因此人们可以将问题改写为“为什么Windows会对每个设备使用单独的指示符?”。分层文件系统的优势在于,可以将任何文件或目录作为根目录的子级找到。如果需要将数据移动到新设备或网络设备,则文件系统中的位置可以保持不变,并且应用程序将看不到差异。
假设您有一个操作系统所在的系统是静态的,并且有一个对I / O要求很高的应用程序。您可以将/ usr挂载为只读,然后将/ opt(如果应用程序驻留在其中)放入SSD驱动器。文件系统层次结构不变。在Windows下,这要困难得多,尤其是对于那些坚持使用C:\ Program Files \
的应用程序而言。
评论
这个(修辞性的)问题确实有一个答案:传统。只是与Unix不同的传统。 Windows是从DOS那里得到的,而DOS是从CP / M-80那里得到的,它遵循了许多小型计算机和大型机操作系统的通用模式。驱动器名称刚刚从DISK0:或SY:缩短为A:。
–RBerteig
2013年10月7日19:00
@RBerteig-也许是传统,尤其是在Windows情况下,但Rob Pike在“ The Hideous Name”(pdos.csail.mit.edu/~rsc/pike85hideous.pdf)中为Unix风格的命名方案提出了一个相当令人信服的论点。
–布鲁斯·埃迪格(Bruce Ediger)
13年10月7日在19:15
我相信,自Windows NT以来,已经有可能在Windows中的给定虚拟路径上挂载设备,以完成与Unix完全相同的操作,尽管在家用PC上并不常见(在服务器和业务部署中较为常见)。如果愿意,您可以选择将其视为Unix Way(tm)的证明。
–JSBձոգչ
13年10月7日在20:15
@BruceEdiger我不会试图证明DOS是正确的。只是指出存在Windows为什么这样的背景,而不仅仅是MS脱帽而出。
–RBerteig
13年10月7日在21:33
@BruceEdiger:哇。好纸。这也是我很少看到派克(Pike)对某事毫无疑问是错误的几次。 (即,ARPANET名称服务系统无法扩展。如今,我们将其称为DNS,并且已经很好扩展。具有权限和委派的绝对层级空间的核心概念完全保持不变)。诚然,这是因为与邮件相关的非IP网络已经消失了。
–凯文·卡斯卡特(Kevin Cathcart)
13-10-9在18:25
#2 楼
这部分是由于历史原因,部分是因为这样更有意义。 。 R.C引用“通用存储辅助文件系统”。戴利和PG Neumann:本文的第2部分介绍了文件的分层结构,该文件允许灵活使用系统。此结构包含足够的功能来确保多功能性。 (…)
为了便于理解,可以将文件结构视为文件树,其中有些是目录。也就是说,除了一个例外,每个文件(例如,每个目录)都发现自己恰好由一个目录中的一个分支直接指向。唯一的例外是树根目录中的根目录或根目录。尽管未从任何目录中明确指向根,但根由文件系统已知的虚拟分支隐式指向。 (…)
在任何时候,用户都被视为在某个目录中操作,该目录称为他的工作目录。只需指定条目名称,他就可以访问其工作目录中的条目有效指向的文件。一个以上的用户可能一次拥有相同的工作目录。
与许多其他方面一样,Multics寻求灵活性。用户可以在文件系统的子树中工作,而忽略其余部分,并且仍然受益于目录来组织其文件。目录还用于访问控制-READ属性允许用户列出目录中的文件,而EXECUTE属性允许用户访问该目录中的文件(这与许多其他功能一样,都存在于Unix中)。 >Multics还遵循具有单个存储池的原则。本文不涉及这方面。单个存储池与当时的硬件非常匹配:没有可移动存储设备,至少没有用户需要的设备。 Multics确实有一个单独的备份存储池,但是对用户是透明的。分层文件系统非常适合Unix。与Multics一样,存储池通常与用户无关。但是,这里有可移动设备,Unix确实通过
mount
和umount
命令(保留给“超级用户”,即管理员)将它们公开给用户。在“ UNIX分时系统”中,Dennis Ritchie和Ken Thompson解释了:尽管文件系统的根目录始终存储在同一设备上,但是不必将整个文件系统层次结构都驻留在该设备上。有一个带有两个参数的挂载系统请求:一个现有普通文件的名称,和一个特殊文件的名称,其关联的存储卷(例如磁盘包)应具有包含其自身目录层次结构的独立文件系统的结构。挂载的作用是导致对以前普通文件的引用改为引用可移动卷上文件系统的根目录。实际上,mount用一个全新的子树(存储在可移动卷上的层次结构)替换层次结构树(普通文件)的叶子。挂载之后,可移动卷上的文件与永久文件系统上的文件之间几乎没有区别。例如,在我们的安装中,根目录位于我们的一个磁盘驱动器的一个小分区上,而另一个包含用户文件的驱动器则通过系统初始化顺序安装。通过在其对应的特殊文件上写入来生成可安装文件系统。可以使用一种实用程序来创建一个空文件系统,或者可以简单地复制一个现有文件系统。
分层文件系统还具有集中管理多个存储设备到内核中的复杂性的优点。这意味着内核更加复杂,但是所有应用程序因此都变得更加简单。由于内核必须关心硬件设备,而大多数应用程序则不需要,因此这是一种更自然的设计。
Windows
Windows的起源可以追溯到两个世系:VMS,最初是为Windows Vista设计的操作系统。 VAX微型计算机和CP / M,这是为早期Intel微型计算机设计的操作系统。
VMS具有分布式的分层文件系统Files-11。在Files-11中,文件的完整路径包含节点名称,该节点上的帐户名称,设备名称,目录树路径,文件名称,文件类型和版本号。 VMS具有强大的逻辑名称功能,允许将快捷方式定义到特定目录,因此用户几乎不必关心目录的“实际”位置。
CP / M设计用于具有64kB RAM和软盘驱动器的计算机,因此为了简单起见。没有目录,但是文件引用可以包含驱动器指示(
A:
或B:
)。当MS-DOS 2.0引入目录时,它使用与MS-DOS 1兼容的语法(本身遵循CP) / M。因此,路径植根于具有单个字母名称的驱动器。 (此外,VMS和CP / M中使用了斜杠字符
/
来启动命令行选项,因此必须使用不同的字符作为目录分隔符。这就是DOS和更高版本的Windows使用反斜杠的原因,尽管某些内部组件也支持Windows保留了与DOS和VMS方法的兼容性,因此即使它们变得不那么重要,它也保留了驱动器字母的概念。如今,Windows在后台使用UNC路径(最初由Microsoft和IBM为OS / 2的相关祖先开发)。尽管这是为高级用户保留的(可能是由于历史原因),但是Windows确实允许通过重新解析点进行安装。评论
尽管这不是默认行为,但Windows NT可以使用NTFS文件系统将所有存储安装在一个根目录下: / 24400 /…
– Gerlos
13年10月8日在16:54
似乎相关的部分是MS-DOS 1.0是基于软盘的。在这样的系统上,(a)了解文件所在的物理磁盘非常重要,并且(b)A:和B:是区分软盘驱动器(如果有两个的话)的一种不错的约定。在MS-DOS 2.0中添加了硬盘驱动器支持后,通过将HD视为一张BIG软盘,驱动器C:名称允许向后兼容。
–user1024
13年10月9日,下午5:03
实际上,最初CP / M被设计为在16 KB而不是64 KB的RAM中运行。 64 KB的数字可能会为应用程序提供一些喘息的空间。当命令处理器(CCP)被覆盖并在必要时重新加载时,BIOS和BDOS始终驻留在内存中。是的,那是BIOS的来源-IBM没有提出这个用语!请参阅Wikipedia CP / M:硬件模型和操作系统组件。请记住,16 KB只能写大约三个密集页面(70行×80个字符/行×3页= 16800字节)。
–用户
13-10-9在11:31
#3 楼
拥有一个目录树就没有安全方面的顾虑。由于操作系统的一部分目的是在真实的硬件上创建抽象机,因此他们认为通过物理位置来分配资源更加简单,因此决定将所有内容放到一个名称树中。 >这只是Unix设计背后天才的一部分。
#4 楼
请注意,来自MS-DOS的驱动器号名称一直存在于现代Windows中,在这里是一个红色鲱鱼。驱动器号名称不是具有多个根的文件系统结构的最佳表示。它们是这种系统的草编实现。这样的系统将摆脱困扰Windows的可笑用户界面问题。例如,如果您插入相机之类的设备,则Windows资源管理器UI将使您相信存在一个名为Camera(或任何其他名称)的设备,并且您拥有类似dvdrom:/path/to/file.avi
的路径。但是,如果您从资源管理器中剪切并粘贴此路径的文本版本,则该路径实际上不起作用,因为某些路径名组件是用户界面小说,而底层操作系统则不知道。在具有多个根的正确实施的系统中,这会很好:将存在一个Computer\Camera\DCIM\...
路径,该路径在系统的每个级别都可以被统一识别。而且,如果您从OLD PC移植到旧硬盘驱动器上,则不会陷入诸如camera:\DCIM\...
这样的驱动器盘符名称,而是可以随心所欲地为其命名,例如F:
。 />因此,如果Unix在文件系统结构中确实具有多个根,则将像这样明智地完成操作,而不是像在MS-DOS和Windows中使用一个字母的驱动器名称那样。换句话说,让我们仅将Unix方案与良好的多根设计进行比较。 ?可能只是为了简单起见。挂载点提供了能够通过名称访问卷的所有功能。无需使用附加的前缀语法来扩展名称空间。从数学上讲,任何不相交的树图(“森林”)都可以通过添加根节点并将不相交的片段作为其子元素来进行连接。
此外,卷不必位于根级别更为灵活。由于没有表示卷的特殊语法(它只是路径组件),因此挂载点可以在任何地方。如果将三个旧磁盘带入计算机,则可以将它们命名为
old-disk:
,/old-disk/one
等。您可以根据需要组织磁盘,从而可以组织文件和目录。可以编写应用程序取决于路径,并且在重新配置存储设备时可以保持路径的有效性。例如,应用程序可以使用众所周知的路径,例如
/old-disk/two
和/var/log
。 /var/lib
和/var/log
是在同一磁盘卷上还是在单独的磁盘卷上,这取决于您。您可以在保留路径的同时将系统迁移到新的存储拓扑。挂接点是一个好主意,这就是Windows自Windows 2000以来就拥有它们的原因。 >
卷挂载点对于在添加设备或从计算机中删除设备时发生的系统更改具有强大的抵抗力。 Microsoft Technet
评论
也许巧合的是,您的“良好的多根设计”听起来很像旧的AmigaDOS系统,该系统允许使用任意卷名,包括“已分配”卷,这些卷引用了另一个卷中的特定目录。您甚至可以(使用适当的软件)具有“虚拟”卷,例如FTP:卷,该卷使您可以使用路径FTP:hostname / path / to / file访问任何FTP服务器上的文件。
–伊尔马里·卡洛宁(Ilmari Karonen)
13年10月8日在1:28
这确实不是一个好答案,因为它似乎非常主观。它非常公开地打击Windows。
–钻机
13年10月8日在17:37
@Rig尽管这可能是正确的,但Windows仍然值得彻底抨击,因为这些驱动器名仍然可以追溯到MS-DOS。这是大多数用户熟悉的多根文件系统,但是我们不能真正将其用于与单根文件进行比较,因为它是这种系统的一个典型例子。
–卡兹
13-10-9在1:56
@Kaz我仍然觉得这个答案更像是一头胡话。 Windows的文件系统有所不同,但不会出错,糟糕或危害人类罪。您不喜欢它,因为您有权获得。微软甚至没有提出这个方案,他们从当时流行的系统中借用了它,但是他们必须对其进行维护以实现对遗留代码的合理维护。
–钻机
13-10-9在3:22
@钻机确定;比起用a石箭头获得下一顿晚餐,这还没有什么可怕的。在他们的鼎盛时期,火石箭头实际上是最先进的。啊,但是哎呀,我们实际上不能说关于DOS和驱动器号,对于类推,我们可以这么说吗?
–卡兹
13年10月9日,下午3:36
#5 楼
* nix和Windows均安装其驱动器。在Windows中,这些文件会自动安装在默认情况下按字母升序安装的安装点。这些默认值是:A:
和B:
=>软盘C:
=>第一个硬盘驱动器的第一分区D:
=>如果不存在其他分区,则为下一个分区或下一个硬盘驱动器或CD / DVD驱动器。每个安装点都是一个目录。 ,安装点由用户决定。例如,我有一个分区安装为
/
,另一个分区安装为/home
。因此,/home
是一个单独的驱动器,相当于Windows上的E:
。在Windows和* nix这两种情况下,挂载点都是单独的目录。唯一的区别是,在* nix中,这些单独的目录是
/
的子目录,而在Windows中,每个挂载点都直接挂载在C:
的下面,假设在/
下。从用户的角度来看,主要优点是安装座是完全透明的。我不需要知道目录
My Computer
实际上在单独的分区上。我可以将其用作普通目录。取而代之的是,在DOS中,我必须用挂载点的名称来显式调用它,例如/home
外部驱动器在两个系统中的安装方式几乎相同。对于Windows说
E:\home
,对于Linux说D:
。这些都是目录,我看不出有什么区别。在Windows下将CDROM放入驱动器中时,就像在Linux中一样,磁盘已安装到/mnt/cdrom
。评论
出于好奇,您是否知道如果有人想在Windows上创建27个驱动器,会发生什么情况? Windows将其称为27号硬盘吗? :D
–约瑟夫·R。
13年10月7日在18:12
哈哈哈看来Windows太迟钝了,甚至无法做到这一点。
–约瑟夫·R。
13年10月7日在18:20
次要nitpick:Windows中的驱动器号默认为升序,但是可以并且经常被重命名。
–RBerteig
13年10月7日在19:02
@terdon:他只是将驱动器安装在目录中-就像您在POSIX OS中所做的一样。
–意大利Matteo
13-10-8的2:08
@JosephR:有时-我不确定何时,但可能是NT- Windows获得了将驱动器安装在目录中的能力,就像Unix一样。默认情况下,实际上没有人这样做(这使我感到惊讶:随着nuke-pave的重新安装频率的增加,到现在为止,类似于将/ home放在单独的卷上的东西已经很流行了)。但是,如果驱动器号/数字/符号用完了,这就是要向系统添加更多驱动器时必须要做的。
–最傻的
13年10月8日在16:11
#6 楼
我同意上面的答案,特别是道格·奥尼尔的答案,但是我认为它们都缺少一些东西,像MS-DOS“ C:”或“ A:”这样的显式设备安装点也一样。罗布·派克(Rob Pike)撰写了有关名称语法的The Hideous Name,但Russ Cox将其归结为:
名称空间...当可以添加新语义时功能最强大
,而无需添加新语法。我经常使用
/mnt/sdb1
和/mnt/cdrom
将当前未使用的磁盘或CD临时放入整个文件系统。在NFS服务器上拥有主目录并不少见,因此无论您登录到哪台计算机,都可以在同一位置获得相同的$HOME
。特殊的事情对您可以做的事情施加了一定的限制。如果只能将未使用的磁盘或CD或DVD或网络文件系统/“共享”安装在“ E:”或“ W:”或任何其他文件上,则灵活性会大大降低。评论
您实际上并不需要符号链接。您可以在任何路径(例如/ usr / local)上直接挂载分区(或网络存储或其他),尽管当我找到一个/ usr / local指向网络挂载的网络时,它总是使我感到困惑。是的,它们确实存在,并且出于某些原因:/ usr / local是管理员用来放置非OS分发程序中内容的标准位置之一。
–克里斯托弗·克雷齐格(Christopher Creutzig)
13-10-7在20:24
@Christopher Creutzig-我的示例不需要同意的符号链接,我只是想举一个例子说明灵活的命名模式如何为您工作。这也许不是最好的例子。
–布鲁斯·埃迪格(Bruce Ediger)
13年10月7日在20:34
顺便看看愚蠢的网络。 proto://specifichost.domain.tld/topleveldir/middle/specificdoc.html。
–卡兹
13年10月8日在2:28
@Christopher Creutzig-我已经在几个地方将/ usr / local设置为网络驱动器。因此,“本地”是指站点本地,而不是计算机本地。
– doneal24
13-10-8在17:19
@Kaz,我认为proto://业务是务实的必需品。不能期望每个软件都知道那里的所有URI方案。因此,了解方案ID何时结束以及URI的其余部分开始很有帮助。
–阿德里安·拉特纳帕拉(Adrian Ratnapala)
13-10-9在11:09
#7 楼
真傻Windows还具有一个层次结构点。但是它是隐藏的并且是非标准的。作为大多数窗口。在这种情况下,它是“我的电脑”的概念。这相当于Unix中的根(/)。请记住,根是内核中存在的概念。你喜欢与否。就像Windows对待“我的电脑”一样。当然,您可以在UNIX的根目录上挂载一个分区,这就是大多数人所做的。许多事物都会关注事物的特定路径(例如/ etc /),但您不受其限制。务必将驱动器安装在/ C:/中。您不能在Unix中这样做。
C:\不是Windows的根目录,它是一个分区的安装点。哪个必须在顶层“我的电脑”上。在Unix中,您可以在其他任何树下挂载一个分区。因此,Linux可以将C:装入
/
,而将D:装入/mnt/d/
...甚至也可以装入/
,但这很棘手,并且取决于两个文件系统在已装入路径的顶部装入时的行为。 因此,您可以“强迫”您遵循窗口随机施加于您的相同限制,从而获得与Windows完全相同的效果。
/ (treat this as "My Computer")
/c/ (mount your first data partition here)
/d/ (mount your second data partition here)
然后,您必须在引导选项中传递安装选项。因为您将没有/ etc / ...,但这也模拟了Windows施加的限制,就像它那样。
评论
Windows确实有一个单一的层次结构,甚至有挂载点,但默认情况下不使用它们。
–吉尔斯'所以-不再是邪恶的'
13年10月8日在1:01
@吉尔斯不确定我明白。默认情况下,如何不将每个驱动程序附加到“我的电脑”根节点上?
– gcb
13-10-8在6:20
那只是GUI演示。文件路径不使用“我的电脑”。
–吉尔斯'所以-不再是邪恶的'
13-10-8在8:46
我的电脑是Shell层次结构的根节点。它包含驱动器(如果有驱动器号),还包含控制面板和任何已连接的Windows Phone。 Shell层次结构使用PIDL代替路径。
– MSalters
13-10-8在10:56
@gcb:关键是shell层次结构不能在“常规”应用程序中直接使用。您不能通过“我的电脑”或其他外壳文件夹调用CreateFile;这是一种抽象,只有与外壳相关的代码才能理解,所有内核调用(以及90%的应用程序,因为大多数语言的文件管理都是通过内核文件API来实现的)对此一无所知。仅当程序使用“标准对话框”(确实不足以解释外壳程序名称空间)并且仅当所选文件直接映射到“真实”(=理解内核)的路径时,才能使用shell文件夹。
–意大利Matteo
13-10-10在0:49
#8 楼
Windows具有驱动器号的原因可能比Microsoft和DOS更远。在IBM系统上通常将字母分配给可移动驱动器,因此Microsoft可能只是通过复制CP / M来按照IBM的指示行事。最初,DOS无论如何都没有目录。有了一个或两个180 KB磁盘,您再也没有足够的文件来组织它们了。https://en.wikipedia.org/wiki/Drive_letter_assignment
评论
这充其量是不准确的。 CP / M比任何Microsoft / IBM-PC DOS早很多年(我相信IBM的最初想法是将CP / M用作其“ PC”,因为尽管当时它是一个相当成熟的事实上的工业标准, (不同的CP / M系统可能不兼容的事实),并且毫无疑问,IBM-PC DOS很大程度上基于86-DOS,而后者基本上是CP / M的源代码兼容克隆。
–用户
13-10-9在11:41
#9 楼
实际上,Linux是基于Unix(或者是Unix,请参见讨论),而Unix来自大型机环境,在该环境中使用多个设备非常明显。在单个目录树中挂载设备可以为您提供最大的灵活性,并且不会限制操作系统可以访问的设备数量。另一方面,驱动器的DOS字母对于具有1个或2个软盘站和单个磁盘驱动器的PC是一个很好的设计。大软盘5,25'始终为A :,小软盘3,5'始终为B :,磁盘驱动器始终为C:。您始终知道是将文件复制到软盘还是复制到磁盘。如果您不能物理连接超过2个软盘驱动器和2个(或4个)硬盘,则不需要任何灵活性。
DOS设计对最终用户更友好,而Unix设计对管理员更友好。现在,驱动器号是Windows的负担,用户更多地依赖于自动打开带有可移动驱动器内容的资源管理器窗口,而不是知道驱动器号...实际上,Ubuntu也是如此。
#10 楼
实际上,这是不正确的。Windows使用另一种路径方案(嗯,不一样)
“单位字母”只是容易记住的路径,磁盘和分区。
ARC路径定义了Windows中文件的路径(但仅在启动时对用户可见):
http://support.microsoft.com/kb/102873
https://serverfault.com/questions/5910/how-do-i-determine-the-arc-path-for-a-particular-drive-letter-in-windows
在Windows NT中,磁盘,分区和单位字母之间没有关系:您可以将整个卷“放入”文件夹中(例如:c:\ myseconddisk可以是整个物理磁盘!)
评论
ARC路径仅用于引导,以便在NT移植到Alpha和MIPS时与某些ROM兼容。当系统运行时,它使用UNC路径。
– ninjalj
13-10-8在9:07
#11 楼
我想指出的两件事-Linux中的硬盘驱动器实际上是以一种分配字母/名称的方式,例如/ dev / sdb1。但是它们可以从单个/根结构安装到任何地方。人们(包括我自己)在Windows中有单独的驱动器的最常见原因是要在某个地方保存文档,音乐,程序等。因此,当不可避免地需要重新安装或更换Windows(无论是升级还是病毒或文件系统故障)时,仍然可以访问这些文件。我在linux中没有这个问题-文件系统更加可靠,并且操作系统不会中断,除非我直接采取行动或犯了错误(哦!最新的仓库,尝试一下!)并进行升级FAR更简单。而且,在极少数情况下,我不得不重新安装,因为所有软件都可以通过我添加的repos或ppa获得(并且我可以轻松地用活动磁盘复制我的主目录),从头开始回到我的位置在Windows中还原我的程序时,只花了几个小时,而不是几天来寻找新的安装程序和/或旧的cd键。
评论
首先要结合硬盘驱动器和文件系统。如果在文件系统中的某个位置挂载/ dev / sdb1,则可以访问驱动器上的文件。如果直接打开/ dev / sdb1,则会看到原始磁盘块。通常不是很有用,尤其是在使用加密文件系统的情况下。
– doneal24
13-10-8在18:44
我试图以Windows用户可能理解的方式来关联它。 C:在Windows中也不是硬盘,但是每个人都将其称为
–德雷克·克拉里斯(Drake Clarris)
13-10-8在18:57
1.您仍然可以保持文件不带字母。 2,在POSIX系统中,硬盘驱动器可以整体分区而没有分区表,拇指驱动器可以具有分区表。名称。
–贝鲁兹
13-10-10在7:36
评论
@terdon-我想他是在问要拥有一个根目录(/)与DOS风格(C:\ D:\)。您也可以(而且通常)在Linux中也有多个驱动器。实际上,基本原理是相同的,C:和D:在Windows中也是安装点。 Windows上/的等效项是“我的电脑”,所有内容均安装在该计算机下。
我认为一个更相关的问题是“为什么操作系统不具有单个根”? (对于DOS / Windows,答案可能是设计错误/无法规划未来/不必要的假设)
Windows之所以选择这个离奇的系统,是因为它之前有MS-DOS,MS-DOS遵循了CP / M设置的早期案例。 MS-DOS是一个基于软盘驱动器的系统(例如,最初在单个驱动器系统上,A:和B:有时,例如,A:和B:是同一驱动器,但是出于交换/复制操作的目的两个不同的逻辑磁盘) 。就像大多数被MS-DOS PC损坏的人一样,OP认为Linux上的/与MSDOS / Windows中的C:相同,而实际上并不是一样。
实际上,C:,D:和其他东西只是与DOS和Win32兼容。 Windows NT内部具有某种类似于UNIX的对象层次结构,驱动器号(通常是Win32的东西)只是指向“真实”对象的符号链接(c:\ file.txt实际上是\ ?? \ c:\ file .txt,带有\ ?? \ c:是例如\ device \ harddisk0 \ partition1的符号链接。参见例如在这里