本章描述Linux如何維護它支持的文件系統中的文件。描述了虛擬文件系統(Virtual File System
VFS)並解釋了Linux核心中真實的文件系統如何被支持
Linux的一個最重要的特點之一使它可以支持許多不同的文件系統。這讓它非常靈活,可以和許多其他操作系統共存。在寫作本章的時候,Linux可一直支持15種文件系統:ext、ext2、xia、minix、umsdos、msdos、vfat、proc、smb、ncp、iso9660、sysv、hpfs、affs和ufs,而且不容置疑,隨著時間流逝,會加入更多的文件系統。
在Linux中,象Unix一樣,系統可以使用的不同的文件系統不是通過設備標識符(例如驅動器編號或設備名稱)訪問,而是連接成一個單一的樹型的結構,用一個統一的單個實體表示文件系統。Linux在文件系統安裝的時候把它加到這個單一的文件系統樹上。所有的文件系統,不管什麼類型,都安裝在一個目錄,安裝的文件系統的文件掩蓋了這個目錄原來存在的內容。這個目錄叫做安裝目錄或安裝點。當這個文件系統卸載的時候,安裝目錄自己的文件又可以顯現出來。
當磁盤初始化的時候(比如用fdisk),利用一個分區結構把物理磁盤劃分成一組邏輯分區。每一個分區可以放一個文件系統,例如一個EXT2文件系統。文件系統在物理設備的塊上通過目錄、軟鏈接等把文件組織成邏輯的樹型結構。可以包括文件系統的設備是塊設備。系統中的第一個IDE磁盤驅動器的第一個分區,IDE磁盤分區/dev/hda1,是一個塊設備。Linux文件系統把這些塊設備看成簡單的線性的塊的組合,不知道也不去關心底層的物理磁盤的尺寸。把對設備的特定的塊的讀的請求映射到對於設備有意義的術語:這個塊保存在硬盤上的磁道、扇區和柱面,這是每一個塊設備驅動程序的任務。一個文件系統不管它保存在什麼設備上,都應該用同樣的方式工作,有同樣的觀感。另外,使用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文件系統。本例中(實際是我家中的Linux系統),/E是次IDE控制器上的master IDE磁盤。第一個IDE控制器是PCI控制器,而第二個是ISA控制器,也控制著IDE CDROM,這些也都無關緊要。我可以用一個modem和PPP網絡協議撥號到我工作的網絡,這時,我可以遠程安裝我的Alpha AXP Linux系統的文件系統到/mnt/remote。
文件系統中的文件包含了數據的集合:包含本章源的文件是一個ASCII文件,叫做filesystems.tex。一個文件系統不僅保存它包括的文件的數據,也保存文件系統的結構。它保存了Linux用戶和進程看到的所有的信息,例如文件、目錄、軟鏈接、文件保護信息等等。另外,它必須安全地保存這些信息,操作系統的基本的一致性依靠於它的文件系統。沒有人可以使用一個隨機丟失數據和文件的操作系統(不知道是否有,雖然我曾經被擁有的律師比Linux開發者還多的操作系統傷害過)。
Minix是Linux的第一個文件系統,有相當的局限,性能比較差。它的文件名不能長於14個字符(這仍然比8.3文件名要好),最大的文集大小是64M字節。第一眼看去,64M字節似乎足夠大,但是設置中等的數據庫需要更大的文件大小。第一個專為Linux設計的文件系統,擴展文件系統或EXT(Extend File System),在1992年4月引入,解決了許多問題,但是仍然感到性能低。所以,1993年,增加了擴展文件系統第二版,或EXT2。這種文件系統在本章稍後具體描述。
當EXT文件系統增加到Linux的時候進行了一個重要的開發。真實的文件系統通過一個接口層從操作系統和系統服務中分離出來,這個接口叫做虛擬文件系統或VFS。VFS答應Linux支持許多(通常是不同的)文件系統,每一個都向VFS表現一個通用的軟件接口。Linux文件系統的所有細節都通過軟件進行轉換,所以所有的文件系統對於Linux核心的其余部分和系統中運行的程序顯得一樣。Linux的虛擬文件系統層答應你同時透明地安裝許多不同的文件系統。
Linux虛擬文件系統的實現使得對於它的文件的訪問盡可能的快速和有效。它也必須保證文件和文件數據正確地存放。這兩個要求相互可能不平等。Linux VFS在安裝和使用每一個文件系統的時候都在內存中高速緩存信息。在文件和目錄創建、寫和刪除的時候這些高速緩存的數據被改動,必須非常小心才能正確地更新文件系統。假如你能看到運行的核心中的文件系統的數據結構,你就能夠看到文件系統讀寫數據塊,描述正在訪問的文件和目錄的數據結構會被創建和破壞,同時設備驅動程序會不停地運轉,獲取和保存數據。這些高速緩存中最重要的是Buffer Cache,在文件系統訪問它們底層的塊設備的時候結合進來。當塊被訪問的時候它們被放到Buffer Cache,根據它們的狀態放在不同的隊列中。Buffer Cache不僅緩存數據緩沖區,它也幫助治理塊設備驅動程序的異步接口。
9.1 The Second Extended File System (EXT2)
EXT2被發明(Remy Card)作為Linux一個可擴展和強大的文件系統。它至少在Linux社區中是最成功的文件系統,是所有當前的Linux發布版的基礎。EXT2文件系統,象所有多數文件系統一樣,建立在文件的數據存放在數據塊中的前提下。這些數據塊都是相同長度,雖然不同的EXT2文件系統的塊長度可以不同,但是對於一個特定的EXT2文件系統,它的塊長度在創建的時候就確定了(使用mke2fs)。每一個文件的長度都按照塊取整。假如塊大小是1024字節,一個1025字節的文件會占用兩個1024字節的塊。不幸的是這一意味著平均你每一個文件浪費半個塊。通常計算中你會用磁盤利用來交換CPU對於內存的使用,這種情況下,Linux象大多數操作系統一樣,為了較少CPU的負載,使用相對低效率的磁盤利用率來交換。不是文件系統中所有的塊都包含數據,一些塊必須用於放置描述文件系統結構的信息。EXT2用一個inode數據結構描述系統中的每一個文件,定義了系統的拓撲結構。一個inode描述了一個文件中的數據占用了哪些塊以及文件的訪問權限、文件的修改時間和文件的類型。EXT2文件系統中的每一個文件都用一個inode描述,而每一個inode都用一個獨一無二的數字標識。文件系統的inode都放在一起,在inode表中。EXT2的目錄是簡單的非凡文件(它們也使用inode描述),包括它們目錄條目的inode的指針。
圖9.1顯示了一個EXT2文件系統占用了一個塊結構的設備上一系列的塊。只要提到文件系統,塊設備都可以看作一系列能夠讀寫的塊。文件系統不需要關心自身要放在物理介質的哪一個塊上,這是設備驅動程序的工作。當一個文件系統需要從包括它的塊設備上讀取信息或數據的時候,它請求對它支撐的設備驅動程序讀取整數數目的塊。EXT2文件系統把它占用的邏輯分區劃分成塊組(Block Group)。每一個組除了當作信息和數據塊來存放真實的文件和目錄之外,還復制對於文件系統一致性至關重要的信息。這種復制的信息對於發生災難,文件系統需要恢復的時候是必要的。下面對於每一個塊組的內容進行了具體的描述。
9.1.1 The EXT2 Inode(EXT2 I節點)
在EXT2文件系統中,I節點是建設的基石:文件系統中的每一個文件和目錄都用一個且只用一個inode描述。每一個塊組的EXT2的inode都放在inode表中,還有一個位圖,讓系統跟蹤分配和未分配的I節點。圖9.2顯示了一個EXT2 inode的格式,在其他信息中,它包括一些域:
參見include/linux/ext2_fs_i.h
mode 包括兩組信息:這個inode描述了什麼和用戶對於它的權限。對於EXT2,一個inode可以描述一個文件、目錄、符號鏈接、塊設備、字符設備或FIFO。
Owner Information 這個文件或目錄的數據的用戶和組標識符。這答應文件系統正確地進行文件訪問權限控制
Size 文件的大小(字節)
Timestamps 這個inode創建的時間和它上次被修改的時間。
Datablocks 指向這個inode描述的數據的塊的指針。最初的12個是指向這個inode描述的數據的物理塊,最後的3個指針包括更多級的間接的數據塊。例如,兩級的間接塊指針指向一個指向數據塊的塊指針的塊指針。的這意味著小於或等於12數據塊大小的文件比更大的文件的訪問更快。
你應該注重EXT2 inode可以描述非凡設備文件。這些不是真正的文件,程序可以用於訪問設備。/dev下所有的設備文件都是為了答應程序訪問Linux的設備。例如mount程序用它希望安裝的設備文件作為參數。
9.1.2 The EXT2 Superblock(EXT2超級塊)
超級塊包括這個文件系統基本大小和外形的描述。它裡面的信息答應文件系統治理程序用於維護文件系統。通常文件系統安裝時只有塊組0中的超級塊被讀取,但是每一個塊組中都包含一個復制的拷貝,用於系統崩潰的時候。除了其他一些信息,它包括:
參見include/linux/ext2_fs_sb.h