為什么蘋(píng)果Mac硬盤(pán)不分區(qū)?
有人可以給我解釋一下,為什么 Linux 的文件系統(tǒng)是「單目錄層階樹(shù)狀」結(jié)構(gòu),而不像 Windows 那樣有個(gè) C: D: 分區(qū)啥的,這樣做有沒(méi)有特別的原因呢?一句話:不分區(qū)的好,Windows 那是為了向下兼容
Doug O'Neal
說(shuō)起來(lái) Unix 的文件系統(tǒng)的道行要比 Windows 的早很多年,所以您的問(wèn)題得改成:「為什么 Windows 要自搞一套弄出個(gè)硬盤(pán)分區(qū)符號(hào)來(lái)呢?」
樹(shù)狀的文件結(jié)構(gòu)有個(gè)優(yōu)勢(shì)就是任何子目錄或者文件,都能順著根目錄找到。所以,如果你需要把本地文件遷移到一個(gè)網(wǎng)絡(luò)硬盤(pán)上,這時(shí)候?qū)τ谲浖?lái)說(shuō),它們不會(huì)察覺(jué)到任何區(qū)別。
假設(shè)你有一套系統(tǒng),操作系統(tǒng)焊死不能動(dòng),但是有個(gè)程序有很高的I/O需求,那么你可以很方便地把 /usr 目錄加載為只讀,然后吧 /opt(應(yīng)用程序安裝目錄)目錄加載到一塊SSD上。這樣整個(gè)文件系統(tǒng)的結(jié)構(gòu)對(duì)于操作系統(tǒng)來(lái)說(shuō)沒(méi)有發(fā)生任何改變。然而在Windows下,這種問(wèn)題就比較討厭,特別是程序路徑前面帶著個(gè) C:Program Files 的時(shí)候……
Gilles 70票
這都是有歷史原因在里面的,部分上是因?yàn)檫@樣做在當(dāng)時(shí)更有效。
Multics
Multics 是我所知的歷史上第一個(gè)采用「層階樹(shù)狀文件結(jié)構(gòu)」的操作系統(tǒng),一個(gè)目錄里還嵌著子目錄這種機(jī)制。引用 R.C. Daley 和 P.G. Neumann 的《通用輔助文件存儲(chǔ)(A General-Purpose File System For Secondary Storage)》一文中的話:
論文第二部分闡述了一種「層階樹(shù)狀文件結(jié)構(gòu)」的文件系統(tǒng),對(duì)于操作系統(tǒng)來(lái)說(shuō),它非常高效。這種結(jié)構(gòu)兼顧了可靠性和靈活性……
為了便于理解,我們可以把這種結(jié)構(gòu)想象成一棵樹(shù),文件的樹(shù),其中有一些目錄其實(shí)也是文件。但是有一個(gè)例外的目錄,它自身的指針只指向一個(gè)單一的,確定的目錄,那就Root目錄。它沒(méi)有明確地被其他目錄所指,root目錄只是隱式地代表一個(gè)虛擬的分支,我們稱這個(gè)分支結(jié)構(gòu)為「文件系統(tǒng)」。
在任何時(shí)候,用戶都處于一個(gè)目錄下面,我們稱它為「工作目錄(working directory)」,用戶可以通過(guò)指定入口訪問(wèn)工作目錄下面的文件。而且多個(gè)用戶可以同時(shí)工作在同一個(gè)工作目錄之下。
在其他各個(gè)方面,Multics 追求的是靈活性,用戶只需工作在整個(gè)文件系統(tǒng)的一條分支上,其他的不用管,但還能保證用目錄管理文件的便捷性。目錄還被用來(lái)控制訪問(wèn)權(quán)限 —— 目錄的 READ 屬性允許用戶訪問(wèn)目錄中的文件,而 EXECUTE 屬性允許用戶修改目錄中的文件 (這個(gè)特性被后來(lái)的unix系統(tǒng)繼承下來(lái))。Multics 還遵循了「單一存儲(chǔ)對(duì)象池」的設(shè)計(jì)原則。但是論文沒(méi)有在這方面展開(kāi)?!竼我淮鎯?chǔ)對(duì)象池」對(duì)于當(dāng)時(shí)的硬件條件來(lái)說(shuō)非常合適,那時(shí)候沒(méi)有可移動(dòng)的硬盤(pán),起碼是沒(méi)有人關(guān)心這個(gè)問(wèn)題。Multics 確實(shí)有一個(gè)備用的備份存儲(chǔ)池,但對(duì)于用戶來(lái)說(shuō),它是不存在的。
Unix
Unix 系統(tǒng)深受 Multics 的影響,但是比起 Multics 的「靈活」,Unix 更專注于加強(qiáng)系統(tǒng)的「簡(jiǎn)潔」。
「單一目錄樹(shù)層級(jí)」的文件系統(tǒng)就很適合Unix系統(tǒng)。就和 Multics 一樣,存儲(chǔ)池的細(xì)節(jié),經(jīng)常不需要用戶關(guān)心。但是后來(lái)出現(xiàn)了可拆卸的硬盤(pán), Unix 通過(guò) mount 和 umount 兩個(gè)命令把對(duì)存儲(chǔ)設(shè)備的操作暴露給用戶(只有「管理員權(quán)限」的用戶才能執(zhí)行這樣的操作)。在 《Unix 分時(shí)系統(tǒng)設(shè)計(jì)(The Unix Time-Sharing System)》一文中, Dennis Ritchie 和 Ken Tompson 解釋道:
雖然系統(tǒng)根目錄一般都在同一個(gè)存儲(chǔ)設(shè)備上,但是對(duì)于其他分支目錄則未必要這樣做。出于兩種考慮,我們需要 mount命令完成存儲(chǔ)設(shè)備掛載的工作:普通文件的文件名一致性,和文件所在的存儲(chǔ)設(shè)備可能有其獨(dú)立的文件存儲(chǔ)結(jié)構(gòu)。通過(guò)mount命令,可以把之前的一個(gè)文件,替換成一個(gè)可移動(dòng)存儲(chǔ)設(shè)備上的完整的目錄結(jié)構(gòu),事實(shí)上,mount命令把文件層級(jí)的某一部分,通過(guò)引用外部數(shù)據(jù),替換成一個(gè)新的結(jié)構(gòu)。這樣對(duì)于之前整個(gè)文件系統(tǒng)來(lái)說(shuō),沒(méi)有發(fā)生任何改變。其實(shí),拿我們的系統(tǒng)安裝過(guò)程舉例,root目錄一直在我們的硬盤(pán)上占了一小塊地方,但其他用戶數(shù)據(jù)在不同的硬盤(pán)上,通過(guò)mount機(jī)制,按序列加載組成一個(gè)初始化的系統(tǒng)。一個(gè)「可掛載」的系統(tǒng),完全是通過(guò)讀寫(xiě)特殊文件完成的。各種應(yīng)用可以創(chuàng)建自己的文件系統(tǒng),或者簡(jiǎn)單地從他處拷貝一份。
(小編注:上面這段文字的中心思想:在UNIX中,一切都是文件。)「層階樹(shù)狀文件系統(tǒng)」還有一個(gè)優(yōu)勢(shì),就是可以把管理存儲(chǔ)設(shè)備的復(fù)雜任務(wù)交給內(nèi)核處理,這就意味著內(nèi)核雖然越來(lái)越復(fù)雜,但是對(duì)于建立其上的應(yīng)用來(lái)說(shuō),其結(jié)果就是保持簡(jiǎn)潔。因?yàn)閮?nèi)核已經(jīng)把臟活累活都包了,大部分應(yīng)用都不用關(guān)心這部分細(xì)節(jié),這是一種更加自然的設(shè)計(jì)。
Windows
Windows 系統(tǒng)流淌著兩支古老血脈:設(shè)計(jì)運(yùn)行在 VAX 微機(jī)上的 VMS 操作系統(tǒng),和早期Intel微機(jī)(如 8080、Z80)上運(yùn)行的 CP/M 操作系統(tǒng)。
VMS 有一個(gè)分布式的層級(jí)文件系統(tǒng),叫做 Files-11
。在 Files-11 中,一個(gè)文件的完整路徑包括一個(gè)「節(jié)點(diǎn)名稱」、一個(gè)關(guān)聯(lián)的用戶賬戶、設(shè)備名稱、目錄樹(shù)、文件名和文件類型,以及版本號(hào)。VMS 有強(qiáng)大的Logical Names功能,這個(gè)功能允許自定義「快捷方式」到指定的路徑,所以用戶不需要在意目錄的「真實(shí)」路徑。
CP/M 是為了 64kB 的內(nèi)存和軟盤(pán)系統(tǒng)設(shè)計(jì)的,為了一切從簡(jiǎn),所以從誕生起,它就沒(méi)有「目錄」這個(gè)概念,但是文件是通過(guò)引用「驅(qū)動(dòng)器位置」來(lái)訪問(wèn)的,比如 A: 或者 B:
而 MS DOS 1.0 繼承了 CP/M 的這個(gè)特性,所以,當(dāng) MS DOS 2.0 引入「目錄」的概念以后,為了兼容 1.0 也在路徑錢(qián)保留了「盤(pán)符」字符,而斜杠「/」符號(hào)是原來(lái) VMS 和 CP/M 系統(tǒng)中表示「命令參數(shù)開(kāi)始」的符號(hào),所以后來(lái)的 DOS 以及 Windows 必須區(qū)分,而采用了 反斜杠「」 符號(hào)作為路徑分隔符。
Windows 繼承了 DOS 和 VMS 的習(xí)慣,雖然已經(jīng)意義不大,但是依舊保留著「盤(pán)符」的傳統(tǒng)。如今,在 Windows 底層,采用的是 UNC 路徑(通用命名規(guī)則,即 servernamesharename 的規(guī)范),但這只是一些高級(jí) Windows 用戶需要知道的功能,Windows 現(xiàn)在確實(shí)可以通過(guò)「重解析點(diǎn)」(Reparse Points)來(lái)掛在存儲(chǔ)設(shè)備。(所以不需要C:這樣的盤(pán)符了)
您知道了嗎?