第九章 文件系統
本章主要描敘Linux核心對文件系統的支持,虛擬文件系統(VFS)以
及Linux核心對實際文件系統的支持。
Linux的最重要特征之一就是支持多種文件系統。這樣它更加靈活並
可以和許多其它種操作系統共存。在本文寫作時Linux已經支持15種
文件系統:ext,ext2,xia,minix,umsdos,msdos,vfat,proc,smb,ncp,
iso9660,sysv,hpfs,affs以及ufs。毫無疑問,今後支持的文件系統類
型還將增加。
Linux和Unix並不使用設備標志符(如設備號或驅動器名稱)來訪問獨
立文件系統,而是通過一個將整個文件系統表示成單一實體的層次樹
結構來訪問它。Linux每安裝(mount)一個文件系統時都會其加入到文
件系統層次樹中。不管是文件系統屬於什麼類型,都被連接到一個目
錄上且此文件系統上的文件將取代此目錄中已存在的文件。這個目錄
被稱為安裝點或者安裝目錄。當卸載此文件系統時這個安裝目錄中原
有的文件將再次出現。
當磁盤初始化時(使用fdisk),磁盤中將添加一個描敘物理磁盤邏輯
構成的分區結構。每個分區可以擁有一個獨立文件系統如EXT2。文件
系統將文件組織成包含目錄,軟連接等存在於物理塊設備中的邏輯層
次結構。包含文件系統的設備叫塊設備。Linux文件系統認為這些塊設
備是簡單的線性塊集合,它並不關心或理解底層的物理磁盤結構。這個
工作由塊設備驅動來完成,由它將對某個特定塊的請求映射到正確的
設備上去;此塊所在硬盤的對應磁道、扇區及柱面數都被保存起來。不
管哪個設備持有這個塊,文件系統都必須使用相同的方式來尋找並操縱
此塊。Linux文件系統不管(至少對系統用戶來說)系統中有哪些不同
的控制器控制著哪些不同的物理介質且這些物理介質上有幾個不同的文
件系統。文件系統甚至還可以不在本地系統而在通過網絡連接的遠程硬
盤上。設有一個根目錄內容如下的SCSI硬盤:
A E boot etc lib opt tmp usr
C F cdrom fd proc root var sbin
D bin dev home mnt lost+found
此時不管是用戶還是程序都無需知道他們現在操縱的這些文件中的/C實
際上是位於系統第一個IDE硬盤上並已安裝VFAT文件系統。在此例中/E表
示系統中第二個IDE控制器上的主IDE硬盤。至於第一個IDE控制器是PCI
控制器和第二個則是控制IDE CDROM的ISA控制器無關緊要。當使用modem
通過PPP網絡協議來撥入網絡時,可以將Alpha AXP Linux文件系統安裝到
/mnt/remote目錄下。
文件系統中的文件是數據的集合;包含本章內容的文件是一個名叫
filesystems.tex的ASCII文件。文件系統不僅包含著文件中的數據而且還
有文件系統的結構。所有Linux用戶和程序看到的文件、目錄、軟連接及
文件保護信息等都存儲在其中。此外文件系統中必須包含安全信息以便
保持操作系統的基本完整性。沒人願意使用一個動不動就丟失數據和文件
的操作系統。
Linux最早的文件系統是Minix,它受限甚大且性能低下。其文件名最長不
能超過14個字符(雖然比8.3文件名要好)且最大文件大小為64M字節。64M
字節看上去很大,但實際上一個中等的數據庫將超過這個尺寸。第一個專
門為Linux設計的文件系統被稱為擴展文件系統(Extended File System)
或EXT。它出現於1992年四月,雖然能夠解決一些問題但性能依舊不好。
1993年擴展文件系統第二版或EXT2被設計出來並添加到Linux中。它是本
章將詳細討論的文件系統。
將EXT文件系統添加入Linux產生了重大影響。每個實際文件系統從操作系
統和系統服務中分離出來,它們之間通過一個接口層:虛擬文件系統或VFS
來通訊。
VFS使得Linux可以支持多個不同的文件系統,每個表示一個VFS的通用接口。
由於軟件將Linux文件系統的所有細節進行了轉換,所以Linux核心的其它部
分及系統中運行的程序將看到統一的文件系統。Linux的虛擬文件系統允許
用戶同時能透明地安裝許多不同的文件系統。
虛擬文件系統的設計目標是為Linux用戶提供快速且高效的文件訪問服務。
同時它必須保證文件及其數據的正確性。這兩個目標相互間可能存在沖突。
當安裝一個文件系統並使用時,Linux VFS為其緩存相關信息。此緩存中數
據在創建、寫入和刪除文件與目錄時如果被修改,則必須謹慎地更新文件
系統中對應內容。如果能夠在運行核心內看到文件系統的數據結構,那麼
就可以看到那些正被文件系統讀寫的數據塊。描敘文件與目錄的數據結構
被不斷的創建與刪除而設備驅動將不停地讀取與寫入數據。這些緩存中最
重要的是Buffer Cache,它被集成到獨立文件系統訪問底層塊設備的例程
中。當進行塊存取時數據塊首先將被放入Buffer Cache裡並根據其狀態保
存在各個隊列中。此Buffer Cache不僅緩存數據而且幫助管理塊設備驅動
中的異步接口。
9.1 第二代擴展文件系統(EXT2)
第二代擴展文件系統由Rey
Card設計,其目標是為Linux提供一個強大的可擴展文件系統。它同時也
是Linux界中設計最成功的文件系統。
象很多文件系統一樣,EXT2建立在數據被保存在數據塊中的文件內這個前
提下。這些數據塊長度相等且這個長度可以變化,某個EXT2文件系統的塊
大小在創建(使用mke2fs)時設置。每個文件的大小和剛好大於它的塊大
小正數倍相等。如果塊大小為1024字節而一個1025字節長的文件將占據兩
個1024字節大小的塊。這樣你不得不浪費差不多一般的空間。我們通常需
要在CPU的內存利用率和磁盤空間使用上進行折中。而大多數操作系統,包
括Linux在內,為了減少CPU的工作負載而被迫選擇相對較低的磁盤空間利
用率。並不是文件中每個塊都包含數據,其中有些塊被用來包含描敘此文
件系統結構的信息。EXT2通過一個inode結構來描敘文件系統中文件並確定
此文件系統的拓撲結構。inode結構描敘文件中數據占據哪個塊以及文件的
存取權限、文件修改時間及文件類型。EXT2文件系統中的每個文件用一個
inode來表示且每個inode有唯一的編號。文件系統中所有的inode都被保存
在inode表中。EXT2目錄僅是一個包含指向其目錄入口指針的特殊文件
(也用inode表示)。
占用一系列數據塊的EXT2文件系統的布局。對文件系統而言文件僅是一
系列可讀寫的數據塊。文件系統並不需要了解數據塊應該放置到物理介質
上什麼位置,這些都是設備驅動的任務。無論何時只要文件系統需要從包
含它的塊設備中讀取信息或數據,它將請求底層的設備驅動讀取一個基本
塊大小整數倍的數據塊。EXT2文件系統將它所使用的邏輯分區劃分成數據
塊組。每個數據塊組將那些對文件系統完整性最重要的信息復制出來,同時
將實際文件和目錄看作信息與數據塊。為了發生災難性事件時文件系統的
修復,這些復制非常有必要。以下一節將著重描敘每個數據塊組的內容。
9.1.1 The EXT2 Inode
在EXT2文件系統中inode是基本塊;文件系統中的每個文件與目錄由唯一的
inode來描敘。每個數據塊組的EXT2inode被保存在inode表中,同時還有一
個位圖被系統用來跟蹤已分配和未分配的inode。
inode的格式,它包含以下幾個域:
mode
它包含兩類信息;inode描敘的內容以及用戶使用權限。EXT2中的
inode可以表示一個文件、目錄、符號連接、塊設備、字符設備或FIFO。
Owner Information
表示此文件或目錄所有者的用戶和組標志符。文件系統根據它可以
進行正確的存取。
Size 以字節計算的文件尺寸。
Timestamps
inode創建及最後一次被修改的時間。
Datablocks
指向此inode描敘的包含數據的塊指針。前12個指針指向包含由inode
描敘的物理塊,最後三個指針包含多級間接指針。例如兩級間接指針
指向一塊指針,而這些指針又指向一些數據塊。這意味著訪問文件尺
寸小於或等於12個數據塊的文件將比訪問大文件快得多。
EXT2 inode還可以描敘特殊設備文件。雖然它們不是真正的文件,但可以通
過它們訪問設備。所有那些位於/dev中的設備文件可用來存取Linux設備。
例如mount程序可把設備文件作為參數。
9.1.2 EXT2 超塊
超塊中包含了描敘文件系統基本尺寸和形態的信息。文件系統管理器利用
它們來使用和維護文件系統。通常安裝文件系統時只讀取數據塊組0中的超
塊,但是為了防止文件系統被破壞,每個數據塊組都包含了復制拷貝。超塊
包含如下信息:
Magic Number
文件系統安裝軟件用來檢驗是否是一個真正的EXT2文件系統超塊。當
前EXT2版本中為0xEF53。
Revision Level
這個主從修訂版本號讓安裝代碼能判斷此文件系統是否支持只存在於
某個特定版本文件系統中的屬性。同時它還是特性兼容標志以幫助安
裝代碼判斷此文件系統的新特性是否可以安全使用。
Mount Count and Maximum Mount Count
系統使用它們來決定是否應對此文件
裝代碼判斷此文件系統的新特性是否可以安全使用。
Mount Count and Maximum Mount Count
系統使用它們來決定是否應對此文件