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