1. 程式人生 > >Linux學習第十四篇--檔案系統和目錄樹的關係

Linux學習第十四篇--檔案系統和目錄樹的關係

使用dumpe2fs命令檢視檔案系統的屬性

我們使用man dumpe2fs命令檢視該命令的描述,發現該命令的作用主要是輸出超級塊和塊組(BlockGroup)的資訊.
個人認為裡面比較有用的選項有兩個,一個是-b 用它來查詢壞道,另一個是-h 這個命令只打印superBlock的資訊. 接下來我們試一下這個命令. 首先我們使用df命令檢視當前使用的檔案系統,.
然後我們使用命令 dumpe2fs  -h /dev/xvad1 來檢視當前使用的檔案系統的超級塊中儲存的資訊.
查出來的資料,基本都可以通過名稱得到其含義,故此處不再進行過多的解釋.同樣我們可以通過dumpe2fs /dev/xvda1 來檢視包含了BlockGroup的資訊. 關於BlockGroup的資訊根據描述也能比較直觀的瞭解,故不再解釋.

檔案系統和目錄樹的關係

通過之前的學習我們瞭解到每一個檔案/目錄都會且僅會佔用一個inode節點,然後根據檔案的大小去分配使用的block.

那麼,我們的檔案系統又是如何同目錄結合到一起的呢?

目錄

當我們建立目錄的時候,檔案系統會分配一個inode節點給這個目錄,同是還會分配至少一塊block給這個目錄. 這個inode節點記錄了這個目錄的許可權以及檔案屬性等,而這個block則記錄了該目錄下的檔名稱及其對應的inode節點.
通過上圖,我們也可以理解,為什麼檔案的增刪改需要目錄的w許可權了,因為檔名稱是存放在目錄對應的資料塊中的.

檔案

當我們建立檔案的時候,檔案系統會分配一個inode節點給該檔案,同時分配至少一個數據塊給該檔案.

目錄樹的讀取

既然我們瞭解了目錄和檔案的儲存結構,那麼系統又是如何讀取目錄樹的呢? 當我們需要讀取一個檔案的時候,比如/tmp/panda/default. 系統首先通過掛在資訊找到掛載點的inode(通常情況下為2)
然後根據該inode讀取對應block中檔名資料,找到tmp/以及其對應的inode節點,依次類推.就能夠找到我們需要的資料了. 當然其中每一步都還有其他操作的,比如驗證使用者許可權.

建立新檔案的步驟

當我們建立一個新的檔案時,通常會經過一下幾個步驟: 1.首先判斷使用者對需要新建檔案的目錄有沒有wx許可權, 2.然後獲取空白Inode節點,寫入許可權等資訊. 3.獲取可用block,寫入實際資料. 4.更新InodeMap和BlockMap及SuperBlock. 5.檔案建立完畢.

上圖就是檔案建立的簡單流程,我們注意一下紅框的部分,如果紅框中操作執行過程,突然中斷,就會造成資料不一致. 早期的EXT2檔案系統中,出現這種狀況會根據superBlock中的是否掛在和檔案系統的狀態來決定是否比對整個硬碟的資料,一旦比對的話,是一件非常耗時的操作, 於是在EXT3中,專門規劃出了一個區塊,用來專門記錄檔案的增改操作,這就是日誌式檔案系統.

日誌式檔案系統

當我們需要建立或者修改檔案的時候,首先會在日誌檔案系統中記錄某個檔案及其準備要寫入的資訊.然後開始寫入許可權和資料,然後更新inodeMap,blockMap以及SuperBlock. 之後在記錄該檔案的操作已經完成. 如果,這時候再發生資料不一致的情況時,根據檔案作業系統,可以有針對性的修改檔案.
附加知識點
我們知道只有將資料載入到記憶體中,CPU才可以對其進行處理,但是硬碟的讀寫速度和記憶體的讀寫速度,相差很多,難道我們每次使用資料的時候,都要因為硬碟讀寫速度man而等待嗎?那麼linux又是如何處理的呢? 在linux中,採用非同步方式對檔案進行操作,當系統載入了某一檔案後,會給該檔案新增一個標記,預設為clean,當該檔案被修改時,標記變更dirty,系統則會不定時的講dirty標記的資料寫入硬碟. 經過剛才的瞭解,我們知道檔案系統必須要掛載到目錄樹上才能被使用,那麼什麼叫做掛載呢? 掛載:將檔案系統和目錄樹結合的動作叫做掛載. 有一點需要注意的是,掛載點必須是目錄,這個目錄就是這個檔案系統的入口.