1. 程式人生 > >檔案系統實現

檔案系統實現

檔案系統實現

檔案系統結構

磁碟提供大量的外部空間來維持檔案系統。磁碟的下述兩個特點,使其成為儲存多個檔案的方便介質:

  1. 可以原地重寫,可以從磁碟上讀一塊,修改該快,並將它寫回到原來的位置。
  2. 可以直接訪問磁碟上的任意一塊資訊。因此,可以簡單地順序或隨機地訪問檔案,從一個檔案切換到另一個檔案只需要簡單地移動讀寫磁頭並等待磁碟轉動即可以完成。

為了提供對磁碟的高效且便捷的訪問,作業系統通過檔案系統來輕鬆地儲存,定位,提取資料。檔案系統有兩個不同的設計問題。第一個問題是如何定義檔案系統對使用者的介面。這個任務涉及定義檔案及其屬性,檔案所允許的操作,組織檔案的目錄結構。第二個問題是建立資料結構和演算法來將邏輯檔案系統對映到物理外存裝置上。

    檔案系統本身通常由許多不同的層組成。

    I/O控制為最底層,由裝置驅動程式和中斷處理程式組成,實現記憶體與磁碟之間的資訊傳輸。裝置驅動程式可以作為翻譯器。其輸入由高層命令組成,如"retrieve block 123"。其輸出由底層的、硬體特定的命令組成,這些命令用於控制硬體控制器,通過硬體控制器可以使I/O裝置與系統其它部分相連。

基本檔案系統只需要向合適的裝置驅動程式傳送一般命令就可對磁碟上的物理塊進行讀寫。每個塊由其數值磁碟地址來標識(例如,驅動器I,柱面(cylinder)73,磁軌(track)3,扇區(sector) 10)。

檔案組織模組(file-organization module):知道檔案及其邏輯塊和物理塊。由於知道所使用的檔案分配型別和檔案位置,檔案組織模組可以將邏輯地址轉換成基本檔案系統所用的物理塊地址。每個檔案的邏輯塊按從0或1到N來編號,而包含資料的物理塊並不與邏輯號匹配,因此需要通過翻譯來定位塊。檔案組織模組也包括空閒空間管理器,用來跟蹤未分配的塊並根據需要提供給檔案組織模組。

    最後,邏輯檔案系統管理元資料。元資料包括檔案系統的所有結構資料,而不包括實際資料(或檔案內容)。邏輯檔案系統根據給定符號檔名來管理目錄結構,並提供給檔案組織模組所需要的資訊。邏輯檔案系統通過檔案控制塊來維護檔案結構。檔案控制塊(file control block, FCB)

包含檔案的資訊,如擁有者,許可權,檔案內容位置。邏輯檔案系統也負責保護和安全。

採用分層的結構實現檔案系統,能夠最大限度地減少重複的程式碼。相同的I/O控制程式碼(有時候是基於檔案系統的程式碼)可以被多個檔案系統採用。然後每個檔案系統有自己的邏輯檔案系統和組織模組。

UNIX使用UNIX檔案系統(UFS)。Windows NT、Windows2000、WindowsXP支援磁碟檔案系統FAT,FAT32和NTFS(或Windows NT file System),雖然Linux支援超過40種不同的檔案系統,標準的Linux檔案系統是可擴充套件檔案系統(extended file system),它最常見的版本是ext2和ext3。同樣還存在一些分散式檔案系統,即伺服器上的檔案系統能夠被一個或多個客戶端載入。

檔案系統實現

概述

    實現檔案系統要使用多個磁碟和記憶體結構。雖然這些結構因作業系統和檔案而異,但是還是有一些通用規律的。

    在磁碟,檔案系統可能包括如下資訊:如何啟動所儲存的作業系統,總的塊數、空閒塊的數目和位置,目錄結構以及各個具體檔案等。

    (每個卷的)引導控制塊(boot control block)包括系統從該卷引導作業系統所需要的資訊。如果磁碟沒有作業系統,那麼這塊的內容為空。它通常為卷的第一塊。UFS稱之引導塊(boot block),NFTS稱之為分割槽引導扇區(partition boot sector)。

    (每個卷的)卷控制塊(volume control block)包括卷(或分割槽)的詳細資訊,如分割槽的塊數、塊的大小、空閒塊的數量和指標、空閒FCB的數量和指標等。UFS稱之為超級塊(superblock),而在NTFS中它儲存在主控檔案表(Master File Table)中。

    每個檔案系統的目錄結構用來組織檔案。UFS中它包括檔名和相關的索引節點(inode)號。NTFS中它儲存在主控檔案表(Master File Table)中。

    每個檔案的FCB包括很多該檔案的詳細資訊,如檔案許可權,擁有者、大小和資料塊的位置。UFS稱之為索引節點(inode)。NTFS將這些資訊存在主控檔案表中,主控檔案表採用關係資料庫結構,每個檔案佔一行。

    記憶體內資訊用於檔案管理系統並通過快取來提高效能。這些資料在檔案系統安裝的時候被載入,解除安裝的時候被丟棄。這些結構可能包括:

    一個記憶體中的安裝表,包括所有安裝卷的資訊。

    一個記憶體中的目錄結構快取,用來儲存近來訪問過的目錄資訊(對於卷所載入的目錄,可以包括一個指向卷表的指標)。

    系統範圍內的開啟的檔案表包括每個開啟檔案的FCB副本和其他資訊。

    單個程序的開啟檔案表包括一個指向系統範圍內已開啟檔案表中合適條目指標和其他資訊。

    為了建立一個新檔案,應用程式呼叫邏輯檔案系統。邏輯檔案系統知道目錄結構形式,為建立一個新檔案,它將分配一個新的FCB(如果檔案系統實現在檔案系統被建立的時候就已經建立了所有的FCB,那麼只是從空閒的FCB集合中分配一個)。然後系統把相應目錄資訊讀入記憶體。用新的檔名更新該目錄和FCB,並將結果寫回到磁碟。

    有些作業系統,包括UNIX,將目錄按檔案來處理,用一個型別域來標識是否為目錄。其他作業系統如Windows NT為檔案和目錄提供分開的系統呼叫。對檔案和目錄採用了不同的處理。不管結構如何,邏輯檔案系統能夠呼叫檔案組織模組來將目錄I/O對映成磁碟塊的號,再進而傳遞給基本檔案系統I/O控制系統。一旦檔案被建立,它就能用於I/O。不過,首先應該開啟檔案。呼叫open()將檔名傳給檔案系統。系統呼叫open()會首先搜溹系統範圍內的開啟檔案表以確定某檔案是否已被其他程序所使用。如果是,就在單個程序的開啟檔案表中建立一項,並指向現有的系統範圍內的開啟檔案表。當開啟檔案時,根據給定檔名來搜溹目錄結構。部分目錄結構通常快取在記憶體中以加快目錄操作。一旦找到檔案,其FCB就複製系統範圍內的開啟檔案表。該表不但儲存FCB,而且還跟蹤開啟該檔案的程序數量。

    接著,在單個程序的開啟檔案表中會增加一個條目,並通過指標將系統範圍內的開啟檔案表的條目和其他域相連。這些其他域可以包括檔案當前位置的指標(用於下一次的讀寫操作)和檔案開啟模式等。呼叫open()返回一個指向單個程序的開啟檔案表中合適條目的指標。所有之後的操作都是通過該指標進行的。檔名不必是開啟檔案表的一部分,因為一旦完成對FCB在磁碟上的定位,系統就不再使用檔名了。然而它可以被快取起來以節省後續開啟相同檔案的時間。對於訪問開啟檔案表的索引有多種名稱。UNIX稱之為檔案描述符(file descriptor),Window稱之為檔案控制代碼(file handle)。因此,只要檔案沒有被關閉,所有檔案操作都是通過開啟檔案表來進行的。

    當一個程序關閉檔案,就刪除一個相應的單個程序開啟檔案表的條目,系統範圍內開啟檔案表相應檔案條目的開啟數也會遞減。當開啟檔案的所有使用者都關閉一個檔案時,更新的檔案元資料會複製到磁碟的目錄結構中,系統範圍內的開啟檔案表的相應條目也將刪除。

    有的系統更加複雜,它們將檔案系統作為對其他系統方面的訪問介面,如網路。例如UFS的系統範圍的開啟檔案表有關於檔案和目錄的索引節點(inode)和其他資訊。它也有關於網路連線和裝置的類似資訊。採用這種方式,一個機制滿足了多個目的。

分割槽與安裝

    磁碟佈局因作業系統而異。一個磁碟可以分成多個分割槽,或者一個卷可以橫跨多個磁碟上的數個分割槽。

    分割槽可以是"生的"(或原始的,raw),即沒有檔案系統,或者"熟的"(cooked)即含有檔案系統。""磁碟(raw disk)用於沒有合適檔案系統的地方。

    引導資訊能儲存在各個分割槽中。同樣,它有自己的格式,因為在引導時系統並沒有檔案系統裝置驅動程式,所以並不能解釋檔案系統格式。因此,引導資訊通常為一組有序塊,並作為映象檔案讀入記憶體。該映象問阿金按預先指定的位置如第一個位元組開始執行。引導資訊除了包括如何啟動一個特定作業系統外,還可以有其他指令。例如,可以把多個作業系統裝在這樣的系統上,PC和其他系統可以雙引導。系統如何知道引導哪個?一個啟動載入器能夠知道位於引導區的多個檔案系統和多個作業系統。一旦裝入,它可以引導位於磁碟上的一個作業系統。磁碟可以有多個分割槽,每個分割槽包含不同型別的檔案系統和不同的作業系統。

    根分割槽(root partition)包括作業系統核心或其他系統檔案,在引導時裝入記憶體。其他卷根據不同作業系統可以在引導時自動裝入或在此之後手動裝入。作為成功裝入操作的一部分,作業系統會驗證裝置上的檔案系統確實有效。作業系統通過裝置驅動程式讀入裝置目錄並驗證目錄是否有合適的格式。如果為無效格式,那麼檢驗分割槽一致性,並根據需要自動或手動地加以糾正。最後,作業系統在其位於記憶體的裝入表中註明該檔案系統已裝入和該檔案系統的型別。

虛擬檔案系統

    實現多個型別檔案系統一個明顯但不十分滿意的方法是為每個型別編寫目錄和檔案程式。但是,絕大多數作業系統包括UNIX都使用面向物件技術來簡化,組織和模組化實現過程。使用這些方法允許不同檔案系統型別可通過同樣結構來實現,這也包括網路檔案型別和NFS。使用者可以訪問位於本地磁碟的多個檔案系統型別,甚至位於網路上的檔案系統。

    採用資料結構和子程式,可以分開基本系統呼叫的功能和實現細節。因此,檔案系統實現包括三個主要層次,第一層為檔案系統介面,包括oepn(),read(),write()和close()呼叫以及檔案描述符。

    第二層稱為虛擬檔案系統(VFS)層,它有兩個目的:

    VFS層通過定義一個清晰的VFS介面,以將檔案系統的通用操作和具體實現分開。多個VFS介面的實現可以共存在同一臺機器上,它允許訪問已裝在本地的多個型別的檔案系統。

    VFS提供了在網路上唯一標識一個檔案的機制。VFS基於稱為vnode的檔案表示結構,該結構包括一個數值識別符號以表示位於整個網路範圍內的唯一檔案。該網路範圍的唯一性用來支援網路檔案系統。核心中為每個活動節點(檔案或目錄)儲存一個vnode結構。

    VFS根據檔案系統型別呼叫特定檔案型別操作以處理本地請求,通過呼叫NFS協議程式來處理遠端請求。檔案控制代碼可以從相應的vnode中構造,並作為引數傳遞給程式。結構中的第三層實現檔案系統型別或遠端檔案系統協議。

    下面簡要的討論一下Linux中的VFS結構。Linux VFS定義的4中主要物件型別是:

    索引節點物件(inode object)表示一個單獨的檔案。

    檔案物件(file object)表示一個開啟的檔案

    超級塊物件(superblock object)表示整個檔案系統

    目錄條目物件(dentry object)表示一個單獨的目錄條目

    VFS對每種型別的物件都定義了一組必須實現的操作。這些型別的每一個物件都包含了一個指向函式表的指標。函式表列出了實際上實現特定物件的操作函式。比如,檔案物件的一些操作的縮寫(API)包括

目錄實現

線性列表

    最為簡單的目錄實現方法是使用儲存檔名和資料塊指標的線性列表。這種方法程式設計簡單但執行時較為費時。要建立新檔案,必須首先搜尋目錄以確定沒有相同名稱的檔案存在。接著,在目錄後增加一個新條目。要刪除檔案時,根據給定檔名搜溹目錄,接著釋放分配給它的空間。

    目錄條目的線性列表的真正缺點是查詢檔案需要線性搜尋。目錄資訊需要經常使用,使用者在訪問檔案時會注意到實現的快慢。事實上,許多作業系統採用軟體快取來儲存最近訪問過的目錄資訊。快取命中避免了不斷從磁碟讀取資訊。排序列表可以使用二分搜尋,並減少平均搜尋時間。

雜湊表

    用於檔案目錄的另一個數據結構是雜湊表。採用這種方法時,除了使用線性列表儲存目錄外,還使用雜湊資料結構。雜湊表根據檔名得到一個值,並返回一個指向線性列表中元素的指標。因此,它大大減少目錄搜尋時間。插入和刪除也較簡單,不過需要一些預備措施來避免衝突(collision)(兩個檔名雜湊到相同的位置)。

分配方法

    磁碟的直接訪問特點使大家能夠靈活地實現檔案。在絕大多數情況下,一個磁碟可儲存許多檔案。主要問題是如何為這些檔案分配空間,以便有效地使用磁碟空間和快速地訪問檔案。常用的主要磁碟空間分配方法有三個:連續、連結和索引。每種方法都有其優點和缺點。

連續分配

    連續分配(contiguous allocation)方法要求每個檔案在磁碟上佔有一組連續的塊。磁碟地址為磁碟定義了一個線性序列。採用這種序列,假設只有一個作業訪問磁碟,在訪問塊b後訪問b+1通常不需要移動磁頭。因此,用於訪問連續分配檔案所需要的尋道數最小。在確實需要尋道時所需要的尋道時間也最小。

    對一個連續分配檔案的訪問很容易。要順序訪問,檔案系統會記住上次訪問過塊的磁碟地址,如果需要可讀入下一塊。要直接訪問一個從塊b開始的檔案的塊i,可以直接訪問塊b+I,因此連續分配支援順序訪問和直接訪問。

    不過,連續分配也有一些問題。一個困難是為新檔案找到空間。被選擇來管理空閒空間的系統決定了這個任務如何完成。

    連續磁碟空間分配可以作為在前面描述的通過動態儲存分配(dynamic storage-allocation)問題的一個具體應用,即如何從一個空閒孔列表中尋找一個滿足大小為n的空間。

    連續分配的另一個問題是確定一個檔案需要多少空間。

    為了減少這些缺點,有的作業系統使用修正的連續分配方案。該方案開始分配一塊連續空間,當空間不夠時,另一塊被稱為擴充套件(extent)的連續空間會新增到原來的分配中。這樣,檔案塊的位置就成為開始地址,塊數,加上一個指向下一擴充套件的指標。。在有的系統上,檔案使用者可以設定擴充套件大小,但如果使用者設定不正確,將會影響效率。

連結分配

    連結分配(linked allocation)解決了連續分配的所有問題。採用連結分配,每個檔案是磁碟塊的連結串列;磁碟塊分佈在磁碟的任何地方。目錄包括檔案第一塊的指標和最後一塊的指標。每塊都有一個指向下一塊的指標。使用者不能使用這些指標,因此,如果每塊有512B,磁碟地址為4B,那麼使用者可以使用508B。

    要建立新檔案,可以簡單地在目錄中增加一個新條目。對於連結分配,每個目錄條目都有一個指向檔案首塊的指標。

    不過,連結分配確實有缺點。主要問題是它只能有效地用於檔案的順序訪問。連結分配不能有效地支援檔案的直接訪問。

    一個採用連結分配方法的變種是檔案分配表(FAT)的使用。每個卷的開始部分用於儲存該FAT。每塊都在該表中有一項,該表可以通過塊號碼來索引。FAT的使用與連結串列相似。目錄條目含有檔案首塊的塊號碼。根據塊號碼索引的FAT條目包含檔案下一塊的塊號碼。根據塊號索引的FAT條目包含檔案的下一塊的塊號碼。這條鏈會一直繼續到最後一塊,該塊對應FAT條目的值為檔案結束值。未使用的塊用0值表示。為了檔案分配一個新的塊只要簡單地找到第一個值為0的FAT條目,用新塊的地址替換前面的檔案結束值,用檔案結束值替換0.

    如果不對FAT採用快取,FAT分配方案可能導致大量的磁頭尋道時間。

索引分配

    連結分配解決了連續分配的外部碎片和大小宣告問題。但是,如果不用FAT,那麼連結分配就不能有效支援直接訪問,這是因為快指標與塊分佈在整個磁碟,且必須按順序讀取。索引分配(indexed allocation)通過把所有指標放在一起,即通過索引塊解決了這個問題。

    每個檔案都有其索引塊,這是一個磁碟塊地址的陣列。索引塊的第i個條目指向檔案的第i個塊。目錄條目包括索引塊的地址。要讀第i塊,通過索引塊的第i個條目的指標來查詢和讀入所需的塊。

    當建立檔案時,索引塊的所有指標都設為nil。當首次寫入第i塊時,先從空閒空間管理器中得到一塊,先從空閒空閒管理器中得到一塊,再將其地址寫到索引塊的第i個條目。

    如果索引塊太小,那麼它不能為大檔案儲存足夠多的指標。因此,必須採用一定機制來處理這個問題。針對這一目的的機制包括如下:

    連結方案:一個索引塊通常為一個磁碟塊。因此,它本身能直接讀寫。為了處理大檔案,可以將多個索引塊連結起來。

    多層索引:連結表示的一種變種是用第一層索引指向一組第二層的索引塊,第二層索引塊再指向檔案快。

    組合方案:在UFS中使用的另一方案是將索引塊的頭15個指標放在檔案的inode中。這其中的頭12個指標指向直接塊;即他們包括了能儲存檔案資料的塊的地址。因此,(不超過12塊的)小檔案不需要其他的索引塊。如果塊的大小為4KB,那麼不超過48KB的資料可以直接訪問。其他3個指標指向間接地址。

空閒空間管理

    因為磁碟空間有限,所以如果可能需要將刪除檔案的空間用於新檔案。為了記錄空閒磁碟空間,系統需要維護一個空閒空間連結串列(free-space list)。空閒空間連結串列記錄了所有空閒磁碟空間,即未分配給檔案或目錄的空間。當建立檔案時,搜尋空閒空間連結串列以得到所需要的空間,並分配給新檔案。這些空間會從空閒連結串列中刪除。當刪除檔案時,其磁碟空間會增加到空閒空間表上。

位向量

    通常,空閒空間表現為點陣圖(bit map)位向量(bit vector)。每塊用一位表示。如果一塊為空閒,那麼其位為1;如果一塊已分配,那麼其位為0。

連結串列

    空閒空間管理的另一個方法是將所有的空閒磁碟塊用連結串列連線起來,並將指向第一空閒塊的指標儲存在磁碟的特殊位置,同時也快取在記憶體中。第一塊包含一個下一空閒磁碟塊的指標,如此繼續下去。好在遍歷整個表並不是一個經常操作。通常,作業系統只不過簡單地需要一個空閒塊以分配給一個檔案,所以分配空閒表的第一塊就可以了。FAT方法將空閒塊的計算結合到分配資料結構中,不再需要另外的方法。

    對空閒連結串列的一個改進是將n個空閒塊的地址存在第一個空閒塊中。這些塊中前n-1個確實為空,而最後一塊包含另外n個空閒塊地址。

計數

    另外一種方法是利用這樣一個事實:通常,有多個連續塊需要同時分配或釋放,尤其是在使用連續分配和採用簇時更是如此。因此,不是記錄n個空閒塊的地址,而是可以記錄第一塊的地址和緊跟第一塊的連續的空閒塊的數量n。這樣,空閒空間表的每個條目包括磁碟地址和數量。雖然每個條目會比原來需要更多空間,但是表的總長度會更短,這是因為連續塊的數量常常大於1。

效率與效能

    有的系統有一塊獨立記憶體用來做緩衝快取,位於其中的塊假設馬上需要使用。其他系統採用頁面快取(page cache)來快取檔案資料。頁面快取使用虛擬記憶體技術,將檔案資料作為頁面而不是面向檔案系統地塊來快取。採用虛擬地址來快取檔案資料,與採用物理磁碟塊來快取相比,更為高效。許多系統都使用頁面快取來快取程序頁和檔案資料。這稱為統一虛擬記憶體(unified buffer cache)。

    有的UNIX和Linux版本提供了統一緩衝快取(unified buffer cache)。為展示統一緩衝快取的優點,考慮檔案開啟和訪問的兩種方法。一種方法是使用記憶體對映,另一種方法使用標準系統呼叫read()和write()。如果沒有統一緩衝快取,那麼情況會如下圖所示。

在這種情況下,標準系統呼叫read()和write()會經過統一緩衝快取。記憶體映呼叫需要使用兩個快取:頁面快取和緩衝快取。記憶體對映先從檔案系統中讀入磁碟塊並存放在緩衝快取中。因為虛擬記憶體不能直接與緩衝快取進行交流,所以緩衝快取內的檔案必須複製到頁面快取中。這種情況稱為雙重快取(double caching),需要兩次快取檔案資料。提供了統一緩衝快取,記憶體對映與read()和write()系統呼叫都使用同樣的頁面快取。這避免了雙重快取,且也允許用虛擬記憶體系統來管理檔案資料。這種統一緩衝快取如下所示。

    頁面快取,檔案系統和磁碟驅動程式有著有趣的聯絡。當資料寫到磁碟檔案時,頁先放在快取中,並且磁碟驅動程式會根據磁碟地址對輸出佇列進行排序。這兩個操作允許磁碟驅動最小化磁頭尋道和優化寫資料。除非要求同步寫,否則進行寫磁碟只是寫入快取,系統在方便時非同步地將資料寫到磁碟中。因而,使用者覺得寫非常快。當從磁碟中讀入資料時,塊I/O系統會執行一定的預讀操作;結果是,寫比讀更加接近於非同步。因此,通過檔案系統輸出到磁碟,通常要比磁碟讀入更加快;這與直覺相反。

恢復

一致性檢查

    部分目錄資訊儲存在記憶體(或快取)中以加快訪問。因為快取目錄資訊寫到磁碟並不是馬上進行的,所以記憶體目錄資訊通常要比相應磁碟資訊更新。

    通常,一個檢查和糾正磁碟不一致對的特殊程式需要在重啟時執行。一致性檢查程式(consistency checker),例如UNIX下的fsck和MS-DOS下的chkdsk系統程式,將目錄結構資料與磁碟資料相比較,並試圖糾正所發現的不一致。分配演算法和空閒空間管理演算法決定了檢查程式能發現什麼型別的問題,及其如何成功地糾正問題。

基於日誌結構的檔案系統

    資料庫基於日誌恢復演算法已成功應用到一致性檢查問題,這種實現稱為基於日誌的面向事務檔案系統(log-based transaction-oriented或journaling file system)。

    所有元資料都按順序寫到日誌上。執行一個特殊任務的一組操作稱為事務(transaction)。這些修改一旦寫到這個日誌上之後,就可認為已經提交,系統呼叫就可返回到使用者程序,以允許它繼續執行。同時,這些日誌條目再對真實檔案系統結構進行重放。隨著修改的進行,可不斷地更新一個指標以表示哪些操作已完成和哪些仍然沒有完成。當一個完成提交事務已完成,那麼就從日誌檔案中刪除(日誌檔案事實上是個環形緩衝)。環形緩衝寫到空間末尾的時候,會從頭開始寫,從而覆蓋掉以前的舊值。

    如果系統崩潰,日誌檔案可能有零個或多個事務。它所包含的任何事務已經由作業系統所提交,但是還沒有(對檔案系統)完成,所以必須要完成。可以執行事務直到該工作完成,因此檔案系統結構仍能保持一致。唯一可能出現的問題是一個事務被中斷,即在系統崩潰之前,它還沒有被提交。這些事務所做檔案系統的修改必須撤銷,以恢復檔案系統地一致性。這種恢復只是在崩潰時才需要,從而避免了與一致檢查有關的所有問題。

    對磁碟元資料更新採用日誌的另一種好處是,這些更新比直接在磁碟上進行要快。這種改善原因是順序I/O比隨機I/O的效能要好。低效率的同步隨機元資料被轉換成高效的同步順序(基於日誌檔案系統的記錄區域)。這些修改再通過隨機寫而非同步回放到適當資料結構。總的結構是面向元資料操作(如檔案建立和檔案刪除)效能的提高。

小結

    檔案系統持久駐留在外存上,外存設計成可以持久地容納大量資料。最常用的外存介質是磁碟。

    物理磁碟可分成區,以控制介質的使用和允許在同一磁碟上支援多個可能不同的檔案系統。這些檔案系統安裝在邏輯檔案系統上,然後才可以使用。檔案系統通常按層結構或模組結構來加以實現:底層處理儲存裝置的物理屬性,高層處理符號檔名和檔案邏輯屬性,中間層將邏輯檔案概念對映到物理裝置屬性。

    每個檔案系統型別都有其結構和演算法。VFS層允許上層統一地處理每個檔案系統型別。即使遠端檔案系統也能整合到檔案系統目錄結構中,通過VFS介面採用標準系統呼叫進行操作。

    檔案在磁碟上有三種不同空間分配方法:連續的,連結的或索引分配。連續分配有外部碎片問題,連結分配的直接訪問效率低,索引分配可能因其索引塊而浪費一定空間。連續分配可採用區域來擴充套件,以增加靈活性和降低外部碎片。索引分配需要為索引塊提供大量的額外開銷。這些演算法可以用多種方式進行優化。連續分配的空間可以通過擴充套件來增大,從而增加靈活性和減少外部碎片。索引分配可按簇(為多個塊)來進行,以增加吞吐量和降低所需索引條目的數量。按大簇的索引分配與採用區域的連續分配相似。

    空閒空間分配方法也影響磁碟使用效率,檔案系統性能,外存可靠性。所使用的方法包括位向量和連結串列。優化方法包括組合,計數和FAT(將連結串列放在一個連續區域內)。

    目錄管理程式必須考慮效率,效能和可靠性。雜湊表是最為常用的方法;它快速且高效。然而,表損壞和系統崩潰可能導致目錄資訊與磁碟內容不一致。一致性檢查程式可用來修補損壞。作業系統備份工具允許磁碟資料複製到磁帶,使得使用者可以恢復資料甚至整個磁碟(因硬體失敗,作業系統錯誤或使用者錯誤)。

    由於檔案系統在系統操作中的重要位置,其效能和可靠性十分關鍵。日誌結構和快取等技術可幫助改善效能,日誌結構和RAID可提高可靠性。