linux基礎學習-16.6-文件系統

一、文件系統的介紹

系統分區完成後,將要將分區格式化文件系統(文件系統是個管理軟件,存到磁盤分區的某個位置,文件系統不是整個分區)可是文件系統上的數據是在這個分區上的,因此說文件系統是一個管理軟件。node

文件系統把磁盤分爲兩片:元數據存儲區**(metadata)**(inode位圖、塊位圖、inode條目等等)、數據存儲區(數據存儲區又分爲多個邏輯存儲單元叫作磁盤塊(是邏輯概念))linux

任何文件系統中的數據分爲數據和元數據(metadata)。數據是指普通文件中的實際數據,而元數據指用來描述一個文件的特徵的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分佈信息(inode...)等等。可是元數據中★不包含文件名★文件名存放在磁盤塊上的。git

二、文件系統層次分析

由上而下主要分爲用戶層、VFS層、文件系統層、緩存層、塊設備層、磁盤驅動層、磁盤物理層github

用戶層:最上面用戶層就是咱們平常使用的各類程序,須要的接口主要是文件的建立、刪除、打開、關閉、寫、讀等。算法

VFS層:咱們知道Linux分爲用戶態和內核態,用戶態請求硬件資源須要調用System Call經過內核態去實現。用戶的這些文件相關操做都有對應的System Call函數接口,接口調用 VFS對應的函數。windows

文件系統層:不一樣的文件系統實現了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,

1)超級塊:

超級塊用於存儲文件系統全局的配置參數(譬如:塊大小,總的塊數和inode數)和動態信息(譬如:當前空閒塊數和inode數),其處於文件系統開始位置的1k處,所佔大小爲1k。爲了系統的健壯性,最初每一個塊組都有超級塊和組描述符表(如下將用GDT)的一個拷貝,可是當文件系統很大時,這樣浪費了不少塊(尤爲是GDT佔用的塊多),後來採用了一種稀疏的方式來存儲這些拷貝,只有塊組號是3, 5 ,7的冪的塊組(譬如說1,3,5,7,9,25,49…)才備份這個拷貝。一般狀況下,只有主拷貝(第0塊塊組)的超級塊信息被文件系統使用,其它拷貝只有在主拷貝被破壞的狀況下才使用。

2)塊組描述符:

GDT用於存儲塊組描述符,其佔用一個或者多個數據塊,具體取決於文件系統的大小。它主要包含塊位圖,inode位圖和inode表位置,當前空閒塊數,inode數以及使用的目錄數(用於平衡各個塊組目錄數),具體定義能夠參見ext3_fs.h文件中struct ext3_group_desc。每一個塊組都對應這樣一個描述符,目前該結構佔用32個字節,所以對於塊大小爲4k的文件系統來講,每一個塊能夠存儲128個塊組描述符。因爲GDT對於定位文件系統的元數據很是重要,所以和超級塊同樣,也對其進行了備份。GDT在每一個塊組(若是有備份)中內容都是同樣的,其所佔塊數也是相同的。從上面的介紹能夠看出塊組中的元數據譬如塊位圖,inode位圖,inode表其位置不是固定的,固然默認狀況下,文件系統在建立時其位置在每一個塊組中都是同樣的,如圖2所示(假設按照稀疏方式存儲,且n不是3,5,7的冪)

3)塊組:

每一個塊組包含一個塊位圖塊,一個 inode 位圖塊,一個或多個塊用於描述 inode 表和用於存儲文件數據的數據塊,除此以外,還有可能包含超級塊和全部塊組描述符表(取決於塊組號和文件系統建立時使用的參數)。下面將對這些元數據做一些簡要介紹。

4)塊位圖:

塊位圖用於描述該塊組所管理的塊的分配狀態。若是某個塊對應的位未置位,那麼表明該塊未分配,能夠用於存儲數據;不然,表明該塊已經用於存儲數據或者該塊不可以使用(譬如該塊物理上不存在)。因爲塊位圖僅佔一個塊,所以這也就決定了塊組的大小。

5)Inode位圖:

Inode位圖用於描述該塊組所管理的inode的分配狀態。咱們知道inode是用於描述文件的元數據,每一個inode對應文件系統中惟一的一個號,若是inode位圖中相應位置位,那麼表明該inode已經分配出去;不然可使用。因爲其僅佔用一個塊,所以這也限制了一個塊組中所可以使用的最大inode數量。

6)Inode表:

Inode表用於存儲inode信息。它佔用一個或多個塊(爲了有效的利用空間,多個inode存儲在一個塊中),其大小取決於文件系統建立時的參數,因爲inode位圖的限制,決定了其最大所佔用的空間。

以上這幾個構成元素所處的磁盤塊成爲文件系統的元數據塊,剩餘的部分則用來存儲真正的文件內容,稱爲數據塊,而數據塊其實也包含數據和目錄。

瞭解了文件系統的結構後,接下來咱們來看看操做系統是如何讀取一個文件的:

大致過程以下:

1)根據文件所在目錄的inode信息,找到目錄文件對應數據塊

2)根據文件名從數據塊中找到對應的inode節點信息

3)從文件inode節點信息中找到文件內容所在數據塊塊號

4)讀取數據塊內容

到這裏,相信不少人會有一個疑問,咱們知道一個文件只有一個Inode節點來存放它的屬性信息,那麼你可能會想若是一個大文件,那它的block必定是多個的,且可能不連續的,那麼inode怎麼來表示呢,下面的圖告訴你答案:

也就是說,若是文件內容太大,對應數據塊數量過多,inode節點自己提供的存儲空間不夠,會使用其餘的間接數據塊來存儲數據塊位置信息,最多能夠有三級尋址結構。

到這裏,應該都已經很是清楚文件讀取的過程了,那麼下面再拋出兩個疑問:

1)文件的拷貝、剪切的底層過程是怎樣的?

2)軟鏈接和硬鏈接分別是如何實現的?

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

1)拷貝文件:建立一個新的inode節點,而且拷貝數據塊內容

2)剪切文件:同個分區裏邊mv,inode節點不變,只是更新目錄文件對應數據塊裏邊的文件名和inode對應關係;跨分區mv,則跟拷貝一個道理,須要建立新的inode,由於inode節點不一樣分區是不能共享的。

3)軟鏈接:建立軟鏈接會建立一個新的inode節點,其對應數據塊內容存儲所連接的文件名信息,這樣原文件即使刪除了,從新創建一個同名的文件,軟鏈接依然可以生效。

4)硬連接:建立硬連接,並不會新建inode節點,只是links加1,還有再目錄文件對應數據塊上增長一條文件名和inode對應關係記錄;只有將硬連接和原文件都刪除以後,文件纔會真正刪除,即links爲0才真正刪除。

練習題:

一、什麼是文件系統

二、文件系統結構與工做原理

相關文章
相關標籤/搜索