Linux檔案系統掛裝與高層體系結構

才智咖 人氣:1.37W

Windows XP高昂的價格和升級收費政策使更多企業和個人使用者轉向自由開放的Linux作業系統,目標僱主群會迅速增長。下面是小編整理的關於Linux檔案系統掛裝與高層體系結構,希望大家認真閱讀!

Linux檔案系統掛裝與高層體系結構

檔案系統體系結構

既然已經看到了檔案系統的構造方法,現在就看看Linux檔案系統層的體系結構。本文從兩個角度考察Linux檔案系統。首先採用高層體系結構的角度。然後進行深層次討論,介紹實現檔案系統層的主要結構。

高層體系結構

儘管大多數檔案系統程式碼在核心中(後面討論的使用者空間檔案系統除外),但是圖 1 所示的體系結構顯示了使用者空間和核心中與檔案系統相關的主要元件之間的關係。

圖 x檔案系統元件的體系結構

使用者空間包含一些應用程式(例如,檔案系統的使用者)和 GNU C 庫(glibc),它們為檔案系統呼叫(開啟、讀取、寫和關閉)提供使用者介面。系統呼叫介面的作用就像是交換器,它將系統呼叫從使用者空間傳送到核心空間中的適當端點。

VFS 是底層檔案系統的主要介面。這個元件匯出一組介面,然後將它們抽象到各個檔案系統,各個檔案系統的行為可能差異很大。有兩個針對檔案系統物件的快取(inode 和 dentry)。它們快取最近使用過的檔案系統物件。

每個檔案系統實現(比如 ext2、JFS 等等)匯出一組通用介面,供 VFS 使用。緩衝區快取會快取檔案系統和相關塊裝置之間的請求。例如,對底層裝置驅動程式的讀寫請求會通過緩衝區快取來傳遞。這就允許在其中快取請求,減少訪問物理裝置的次數,加快訪問速度。以最近使用(LRU)列表的形式管理緩衝區快取。注意,可以使用 sync 命令將緩衝區快取中的請求傳送到儲存媒體(迫使所有未寫的資料傳送到裝置驅動程式,進而傳送到儲存裝置)。

這就是 VFS 和檔案系統元件的高層情況。現在,討論實現這個子系統的主要結構。

主要結構

Linux 以一組通用物件的角度看待所有檔案系統。這些物件是超級塊(superblock)、inode、dentry 和檔案。超級塊在每個檔案系統的根上,超級塊描述和維護檔案系統的狀態。檔案系統中管理的每個物件(檔案或目錄)在Linux中表示為一個 inode。inode 包含管理檔案系統中的物件所需的所有元資料(包括可以在物件上執行的操作)。另一組結構稱為 dentry,它們用來實現名稱和 inode 之間的對映,有一個目錄快取用來儲存最近使用的 dentry。dentry 還維護目錄和檔案之間的關係,從而支援在檔案系統中移動。最後,VFS 檔案表示一個開啟的檔案(儲存開啟的檔案的狀態,比如寫偏移量等等)。

基本的檔案系統體系結構

Linux 檔案系統體系結構是一個對複雜系統進行抽象化的有趣例子。通過使用一組通用的 API 函式,Linux 可以在許多種儲存裝置上支援許多種檔案系統。例如,read 函式呼叫可以從指定的檔案描述符讀取一定數量的位元組。read 函式不瞭解檔案系統的型別,比如 ext3 或 NFS。它也不瞭解檔案系統所在的儲存媒體,比如 AT Attachment Packet Interface(ATAPI)磁碟、Serial-Attached SCSI(SAS)磁碟或 Serial Advanced Technology Attachment(SATA)磁碟。但是,當通過呼叫 read 函式讀取一個檔案時,資料會正常返回。本文講解這個機制的實現方法並介紹Linux檔案系統層的主要結構。

什麼是檔案系統?

首先回答最常見的問題,“什麼是檔案系統”。檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。由於定義如此寬泛,支援它的程式碼會很有意思。正如前面提到的,有許多種檔案系統和媒體。由於存在這麼多型別,可以預料到Linux檔案系統介面實現為分層的.體系結構,從而將使用者介面層、檔案系統實現和操作儲存裝置的驅動程式分隔開。

掛裝

在Linux中將一個檔案系統與一個儲存裝置關聯起來的過程稱為掛裝(mount)。使用 mount 命令將一個檔案系統附著到當前檔案系統層次結構中(根)。在執行掛裝時,要提供檔案系統型別、檔案系統和一個掛裝點。

為了說明Linux檔案系統層的功能(以及掛裝的方法),我們在當前檔案系統的一個檔案中建立一個檔案系統。實現的方法是,首先用 dd 命令建立一個指定大小的檔案(使用 /dev/zero 作為源進行檔案複製)-- 換句話說,一個用零進行初始化的檔案,見清單 1。

清單 1. 建立一個經過初始化的檔案

1.$ dd if=/dev/zero of= bs=1k count=10000

2.10000+0 records in

3.10000+0 records out

4.$

現在有了一個 10MB 的 檔案。使用 losetup 命令將一個迴圈裝置與這個檔案關聯起來,讓它看起來像一個塊裝置,而不是檔案系統中的常規檔案:

1.$ losetup /dev/loop0

2.$

這個檔案現在作為一個塊裝置出現(由 /dev/loop0 表示)。然後用 mke2fs 在這個裝置上建立一個檔案系統。這個命令建立一個指定大小的新的 ext2 檔案系統,見清單 2。

清單 2. 用迴圈裝置建立 ext2 檔案系統

1.$ mke2fs -c /dev/loop0 10000

2fs 1.35 (28-Feb-2004)

_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39

system label=

type: Linux

k size=1024 (log=0)

ment size=1024 (log=0)

8.2512 inodes, 10000 blocks

9.500 blocks (5.00%) reserved for the super user

10....

11.$

使用 mount 命令將迴圈裝置(/dev/loop0)所表示的 檔案掛裝到掛裝點 /mnt/point1。注意,檔案系統型別指定為 ext2。掛裝之後,就可以將這個掛裝點當作一個新的檔案系統,比如使用 ls 命令,見清單 3。