1. 程式人生 > >ext4日誌系統分析(二)

ext4日誌系統分析(二)

一、背景

上篇部落格介紹了jbd2模組的安裝與解除安裝。同時也講了安裝時初始化函式會在/proc/fs下建立一個jbd2目錄。這篇部落格打算介紹一下在jbd2模組被安裝後核心是如何對日誌系統進行初始化的,以及jbd2目錄下的檔案是從哪裡來的。這裡所涉及的東西較多,所以我只挑重點功能函式來講。

二、jbd2目錄

不知道大家還記得嗎,上一篇部落格我提到在安裝jbd2模組時,核心會在/proc/fs下建立一個jbd2目錄。這個目錄具體做什麼用到我並沒有講到。現在我們來看一下這個目錄中有什麼東西。
這裡寫圖片描述
這個sda1-8目錄表示日誌儲存在這個目錄中,它位於分割槽sda1的inode號為8的檔案中。進到該目錄中。
這裡寫圖片描述


這裡有個info檔案。開啟看看內容。
這裡寫圖片描述
這個檔案中都是關於日誌的基本資訊。我們現在就通過原始碼來分析下這些資訊從何而來。

三、原始碼分析

我們首先來看一下ext4_load_journal函式:
這裡寫圖片描述
這裡寫圖片描述
這個函式是在ext4_fill_super函式中被呼叫的。這兩個函式都位於fs/ext4/super.c檔案中。我們知道,這個檔案中都是與超級塊相關的函式,ext4_fill_super是檔案系統為每個分割槽初始化super_block時呼叫的。而ext4_load_journal函式則是用來裝載日誌系統的。這個函式的重點我用紅線標出。分別是初始化日誌目錄與初始化日誌分割槽。
這是由於ext4檔案系統可以使用目錄作為日誌,也可以使用一個分割槽來作為目錄。一般的個人電腦linux都是用目錄作為日誌的。比如我的linux:
這裡寫圖片描述


jbd2目錄下有一個目錄sda1-8。指的是日誌儲存於sda1分割槽的inode為8的檔案中。如果沒有inode號,指的是該檔案系統用一個分割槽來作為日誌。
由於我的linux中的日誌是由在目錄中記錄的,那麼我就來看看第一個函式(函式定義在fs/ext4/super.c中):
這裡寫圖片描述
這裡大部分的程式碼都是在檢查錯誤,比如inode是否在磁碟上,是否可用。重點在於被紅線標出的部分,此函式用於初始化日誌inode。我們來看看這個函式(函式被定義在fs/jbd2/journal.c中):
這裡寫圖片描述
我看到了一個熟悉的函式jbd2_stats_proc_init,顧名思義,這個函式應該就是用來初始化jbd2目錄中的檔案的。進去看看(該函式被定義在fs/jbd2/journal.c中):
這裡寫圖片描述

可以看到,這裡info被建立,且是一個只讀檔案。我們再進被標出的結構體。
這裡寫圖片描述
可以看到,這裡定義了對檔案的操作函式。由於我們主要用的是開啟和讀取檔案操作。所以我們可以進我們感興趣的函式中一窺。這裡看一下jbd2_seq_info_open函式。
這裡寫圖片描述
然後看一下開啟操作的結構體。
這裡寫圖片描述
這裡重點在被紅線標出的函式。進去看一下。
這裡寫圖片描述
此函式把日誌的統計資訊寫到開啟檔案的private_data指向的seq_file裡。
上面的這些結構體和函式都是在fs/jbd2/journal.c中。
看完了開啟操作,大家可以自己再看一下讀操作。我這裡就不展示了。
上面我在各函式間跳的比較多,可能大家看的眼花繚亂的。我這裡製作一張圖來展示一下上面介紹的這些函式之間的呼叫關係。
這裡寫圖片描述
我這篇部落格講的是左邊的這條線。右邊的是分割槽作為日誌的路線。當然我這裡講的比較粗線條,只是大概講了一下info中的資訊是從哪裡來的。更細的東西還得繼續深入分析原始碼才行。

四、總結

本篇部落格主要分析了jbd2目錄下的檔案資訊的來源。