Linux檔案系統基礎

2021-08-13 10:39:52 字數 3166 閱讀 8618

一、檔案系統層次分析

由上而下主要分為使用者層、vfs層、檔案系統層、快取層、塊裝置層、磁碟驅動層、磁碟物理層

使用者層:最上面使用者層就是我們日常使用的各種程式,需要的介面主要是檔案的建立、刪除、開啟、關閉、寫、讀等。

vfs層:我們知道linux分為使用者態和核心態,使用者態請求硬體資源需要呼叫system call通過核心態去實現。使用者的這些檔案相關操作都有對應的system call函式介面,介面呼叫 vfs對應的函式。

檔案系統層:不同的檔案系統實現了vfs的這些函式,通過指標註冊到vfs裡面。所以,使用者的操作通過vfs轉到各種檔案系統。檔案系統把檔案讀寫命令轉化為對磁碟lba的操作,起了乙個翻譯和磁碟管理的作用。

快取層:檔案系統底下有快取,page cache,加速效能。對磁碟lba的讀寫資料快取到這裡。

塊裝置層:塊裝置介面block device是用來訪問磁碟lba的層級,讀寫命令組合之後插入到命令佇列,磁碟的驅動從佇列讀命令執行。linux設計了電梯演算法等對很多lba的讀寫進行優化排序,盡量把連續位址放在一起。

磁碟驅動層:磁碟的驅動程式把對lba的讀寫命令轉化為各自的協議,比如變成ata命令,scsi命令,或者是自己硬體可以識別的自定義命令,傳送給磁碟控制器。host based ssd甚至在塊裝置層和磁碟驅動層實現了ftl,變成對flash晶元的操作。

磁碟物理層:讀寫物理資料到磁碟介質。

二、檔案系統結構與工作原理(主要以ext4為例)

我們都知道,windows檔案系統主要有fat、ntfs等,而linux檔案系統則種類多的很,主要有vfs做了乙個軟體抽象層,向上提供檔案操作介面,向下提供標準介面供不同檔案系統對接,下面主要就以ext4檔案系統為例,講解下檔案系統結構與工作原理:

上面兩個圖大體呈現了ext4檔案系統的結構,從中也相信能夠初步的領悟到檔案系統讀寫的邏輯過程。下面對上圖裡邊的構成元素做個簡單的講解:

引導塊:為磁碟分割槽的第乙個塊,記錄檔案系統分割槽的一些資訊,,引導載入當前分割槽的程式和資料被儲存在這個塊中。一般占用2kb,

超級塊:

超級塊用於儲存檔案系統全域性的配置引數(譬如:塊大小,總的塊數和inode數)和動態資訊(譬如:當前空閒塊數和inode數),其處於檔案系統開始位置的1k處,所佔大小為1k。為了系統的健壯性,最初每個塊組都有超級塊和組描述符表(以下將用gdt)的乙個拷貝,但是當檔案系統很大時,這樣浪費了很多塊(尤其是gdt占用的塊多),後來採用了一種稀疏的方式來儲存這些拷貝,只有塊組號是3, 5 ,7的冪的塊組(譬如說1,3,5,7,9,25,49…)才備份這個拷貝。通常情況下,只有主拷貝(第0塊塊組)的超級塊資訊被檔案系統使用,其它拷貝只有在主拷貝被破壞的情況下才使用。

塊組描述符:

gdt用於儲存塊組描述符,其占用乙個或者多個資料塊,具體取決於檔案系統的大小。它主要包含塊點陣圖,inode點陣圖和inode表位置,當前空閒塊數,inode數以及使用的目錄數(用於平衡各個塊組目錄數),具體定義可以參見ext3_fs.h檔案中struct ext3_group_desc。每個塊組都對應這樣乙個描述符,目前該結構占用32個位元組,因此對於塊大小為4k的檔案系統來說,每個塊可以儲存128個塊組描述符。由於gdt對於定位檔案系統的元資料非常重要,因此和超級塊一樣,也對其進行了備份。gdt在每個塊組(如果有備份)中內容都是一樣的,其所佔塊數也是相同的。從上面的介紹可以看出塊組中的元資料譬如塊點陣圖,inode點陣圖,inode表其位置不是固定的,當然預設情況下,檔案系統在建立時其位置在每個塊組中都是一樣的,如圖2所示(假設按照稀疏方式儲存,且n不是3,5,7的冪)

塊組:

每個塊組包含乙個塊位圖塊,乙個 inode 位圖塊,乙個或多個塊用於描述 inode 表和用於儲存檔案資料的資料塊,除此之外,還有可能包含超級塊和所有塊組描述符表(取決於塊組號和檔案系統建立時使用的引數)。下面將對這些元資料作一些簡要介紹。

塊點陣圖:

塊點陣圖用於描述該塊組所管理的塊的分配狀態。如果某個塊對應的位未置位,那麼代表該塊未分配,可以用於儲存資料;否則,代表該塊已經用於儲存資料或者該塊不能夠使用(譬如該塊物理上不存在)。由於塊位圖僅佔乙個塊,因此這也就決定了塊組的大小。

inode點陣圖:

inode點陣圖用於描述該塊組所管理的inode的分配狀態。我們知道inode是用於描述檔案的元資料,每個inode對應檔案系統中唯一的乙個號,如果inode點陣圖中相應位置位,那麼代表該inode已經分配出去;否則可以使用。由於其僅占用乙個塊,因此這也限制了乙個塊組中所能夠使用的最大inode數量。

inode表:

inode表用於儲存inode資訊。它占用乙個或多個塊(為了有效的利用空間,多個inode儲存在乙個塊中),其大小取決於檔案系統建立時的引數,由於inode點陣圖的限制,決定了其最大所占用的空間。

以上這幾個構成元素所處的磁碟塊成為檔案系統的元資料塊,剩餘的部分則用來儲存真正的檔案內容,稱為資料塊,而資料塊其實也包含資料和目錄。

了解了檔案系統的結構後,接下來我們來看看作業系統是如何讀取乙個檔案的:

大體過程如下:

1、根據檔案所在目錄的inode資訊,找到目錄檔案對應資料塊

2、根據檔名從資料塊中找到對應的inode節點資訊

3、從檔案inode節點資訊中找到檔案內容所在資料塊塊號

4、讀取資料塊內容

到這裡,相信很多人會有乙個疑問,我們知道乙個檔案只有乙個inode節點來存放它的屬性資訊,那麼你可能會想如果乙個大檔案,那它的block一定是多個的,且可能不連續的,那麼inode怎麼來表示呢,下面的圖告訴你答案:

也就是說,如果檔案內容太大,對應資料塊數量過多,inode節點本身提供的儲存空間不夠,會使用其他的間接資料塊來儲存資料塊位置資訊,最多可以有**定址結構。

到這裡,應該都已經非常清楚檔案讀取的過程了,那麼下面再丟擲兩個疑問:

1、檔案的拷貝、剪下的底層過程是怎樣的?

2、軟連線和硬連線分別是如何實現的?

下面來結合stat命令動手操作一下,便知真相:

linux基礎命令 檔案系統

檔案系統 作業系統是通過檔案系統區操作檔案,磁碟或分割槽需要建立檔案系歐諾統後才能被作業系統使用,建立檔案系統的過程叫做格式化 常見檔案系統 fat32,ntfs window的主流檔案系統 ext2,ext3 紅帽4的主要的檔案系統 ext4 紅帽5的主要檔案系統 其中ext3,ext4都是日誌型...

linux檔案系統基礎 檔案系統與根檔案系統

要不我們就統一簡稱為fs和rfs 檔案系統 file system fs 根檔案系統 root file system rfs。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?因為這種 根檔案系統 承載著某些 特殊的功能 其實 檔案系統...

linux 檔案系統 Linux 檔案系統結構介紹

ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...