在檔案系統方面,linux® 可以算得上作業系統中的 「瑞士軍刀」。linux 支援許多種檔案系統,從日誌型檔案系統到集群檔案系統和加密檔案系統。對於使用標準的和比較奇特的檔案系統以及開發檔案系統來說,linux 是極好的平台。本文討論 linux 核心中的虛擬檔案系統(vfs,有時候稱為虛擬檔案系統交換器),然後介紹將檔案系統連線在一起的主要結構。
基本的檔案系統體系結構
linux 檔案系統體系結構是乙個對複雜系統進行抽象化的有趣例子。通過使用一組通用的 api 函式,linux 可以在許多種儲存裝置上支援許多種檔案系統。例如,read
函式呼叫可以從指定的檔案描述符讀取一定數量的位元組。read
函式不了解檔案系統的型別,比如 ext3 或 nfs。它也不了解檔案系統所在的儲存**,比如 at attachment packet inte***ce(atapi)磁碟、serial-attached scsi(sas)磁碟或 serial advanced technology attachment(sata)磁碟。但是,當通過呼叫read
函式讀取乙個檔案時,資料會正常返回。本文講解這個機制的實現方法並介紹 linux 檔案系統層的主要結構。
什麼是檔案系統?
首先回答最常見的問題,「什麼是檔案系統」。檔案系統是對乙個儲存裝置上的資料和元資料進行組織的機制。由於定義如此寬泛,支援它的**會很有意思。正如前 面提到的,有許多種檔案系統和**。由於存在這麼多型別,可以預料到 linux 檔案系統介面實現為分層的體系結構,從而將使用者介面層、檔案系統實現和操作儲存裝置的驅動程式分隔開。
檔案系統作為協議
另一種看待檔案系統的方式是把它看作乙個協議。網路協議(比如 ip)規定了網際網路上傳輸的資料流的意義,同樣,檔案系統會給出特定儲存**上資料的意義。
掛裝在 linux 中將乙個檔案系統與乙個儲存裝置關聯起來的過程稱為掛裝(mount)。使用mount
命令將乙個檔案系統附著到當前檔案系統層次結構中(根)。在執行掛裝時,要提供檔案系統型別、檔案系統和乙個掛裝點。
為了說明 linux 檔案系統層的功能(以及掛裝的方法),我們在當前檔案系統的乙個檔案中建立乙個檔案系統。實現的方法是,首先用dd
命令建立乙個指定大小的檔案(使用 /dev/zero 作為源進行檔案複製)—— 換句話說,乙個用零進行初始化的檔案,見清單 1。
清單 1. 建立乙個經過初始化的檔案
$ dd if=/dev/zero of=file.img bs=1k count=10000
10000+0 records in
10000+0 records out
$
現在有了乙個 10mb 的 file.img 檔案。使用losetup
命令將乙個迴圈裝置與這個檔案關聯起來,讓它看起來像乙個塊裝置,而不是檔案系統中的常規檔案:
$ losetup /dev/loop0 file.img$
這個檔案現在作為乙個塊裝置出現(由 /dev/loop0 表示)。然後用mke2fs
在這個裝置上建立乙個檔案系統。這個命令建立乙個指定大小的新的 ext2 檔案系統,見清單 2。
清單 2. 用迴圈裝置建立 ext2 檔案系統
$ mke2fs -c /dev/loop0 10000
mke2fs 1.35 (28-feb-2004)
max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39
filesystem label=
os type: linux
block size=1024 (log=0)
fragment size=1024 (log=0)
2512 inodes, 10000 blocks
500 blocks (5.00%) reserved for the super user
...$
使用mount
命令將迴圈裝置(/dev/loop0
)所表示的 file.img 檔案掛裝到掛裝點 /mnt/point1。注意,檔案系統型別指定為ext2
。掛裝之後,就可以將這個掛裝點當作乙個新的檔案系統,比如使用ls
命令,見清單 3。
清單 3. 建立掛裝點並通過迴圈裝置掛裝檔案系統
$ mkdir /mnt/point1
$ mount -t ext2 /dev/loop0 /mnt/point1
$ ls /mnt/point1
lost+found
$
如清單 4 所示,還可以繼續這個過程:在剛才掛裝的檔案系統中建立乙個新檔案,將它與乙個迴圈裝置關聯起來,再在上面建立另乙個檔案系統。
清單 4. 在迴圈檔案系統中建立乙個新的迴圈檔案系統
$ dd if=/dev/zero of=/mnt/point1/file.img bs=1k count=1000
1000+0 records in
1000+0 records out
$ losetup /dev/loop1 /mnt/point1/file.img
$ mke2fs -c /dev/loop1 1000
mke2fs 1.35 (28-feb-2004)
max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3
filesystem label=
...$ mkdir /mnt/point2
$mount -t ext2 /dev/loop1 /mnt/point2
$ ls /mnt/point2
lost+found
$ ls /mnt/point1
file.img lost+found
$
通過這個簡單的演示很容易體會到 linux 檔案系統(和迴圈裝置)是多麼強大。可以按照相同的方法在檔案上用迴圈裝置建立加密的檔案系統。可以在需要時使用迴圈裝置臨時掛裝檔案,這有助於保護資料。
Linux檔案系統刪除檔案深入剖析
與dos windows不同,unix檔案被刪除後很難恢復,這是由unix獨特 的檔案系統結構決定的。unix檔案目錄不像dos windows那樣,文 件即使被刪除之後仍儲存有完整的檔名 檔案長度 始簇號 即 檔案占有的第乙個磁碟塊號 等重要資訊 相反,它的檔案資訊全部 依靠一種被稱為i節點的資料...
Android檔案系統深入剖析
1 android檔案系統的結構 android原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中,ramdisk.img是emulator的檔案系統,system.img包括了主要的包 庫等檔案,userdata.img包括了一些使用者資料,emu...
Seq file檔案系統例項剖析
seq file file system 針對proc檔案的不足而誕生了seq file。seq file的實現基於proc檔案。使用seq file,使用者必須抽象出乙個鏈結物件,然後可以依次遍歷這個鏈結物件。這個鏈結物件可以是鍊錶,陣列,雜湊表等等。程式設計介面 seq file必須實現四個操作...