Linux 檔案系統剖析

2021-04-15 11:32:14 字數 3440 閱讀 2215

在檔案系統方面,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必須實現四個操作...