Linux 日誌檔案系統

2022-07-11 16:57:08 字數 1928 閱讀 8344

檔案系統要解決的乙個關鍵問題是怎樣防止掉電或系統崩潰造成資料損壞

在此類意外事件中,導致檔案系統損壞的根本原因在於寫檔案不是原子操作

因為寫檔案涉及的不僅僅是使用者資料,還涉及元資料(metadata)包括 superblock、inode bitmap、inode、data block bitmap等

所以寫操作無法一步完成,如果其中任何乙個步驟被打斷,就會造成資料的不一致或損壞。

舉乙個簡化的例子,我們對乙個檔案進行寫操作,要涉及以下步驟:

從data block bitmap中分配乙個資料塊;

在inode中新增指向資料塊的指標;

把使用者資料寫入資料塊。

日誌檔案系統(journal file system)就是為解決上述問題而誕生的。

它的原理是在進行寫操作之前,把即將進行的各個步驟(稱為transaction)事先記錄下來,儲存在檔案系統上單獨開闢的一塊空間上,這就是所謂的日誌(journal),也被稱為write-ahead logging

日誌儲存成功之後才進行真正的寫操作、把檔案系統的元資料和使用者資料寫進硬碟(稱為checkpoint)

這樣萬一寫操作的過程中掉電,下次掛載檔案系統之前把儲存好的日誌重新執行一遍就行了(術語叫做replay),避免了前述的資料損壞場景。

有人問如果儲存日誌的過程中掉電怎麼辦?

最初始的想法是把一條日誌的資料一次性寫入硬碟,相當於乙個原子操作

然而這並不可行,因為硬碟通常以512位元組為單位進行操作,日誌資料一超過512位元組就不可能一次性寫入了

所以實際上是這麼做的:給每一條日誌設定乙個結束符,只有在日誌寫入成功之後才寫結束符,如果一條日誌沒有對應的結束符就會被視為無效日誌,直接丟棄,這樣就保證了日誌裡的資料是完整的。

一條日誌在它對應的寫操作完成之後就沒用了,占用的硬碟空間就可以釋放。

儲存日誌的硬碟空間大小是有限的,被迴圈使用,所以日誌也被稱為circular log。

至此可以總結一下日誌檔案系統的工作步驟了:

journal write : 把transaction寫入日誌中;

journal commit : 在一條日誌儲存好之後,寫入結束符;

checkpoint : 進行真正的寫操作,把元資料(metadata)和使用者資料(user data)寫入檔案系統;

free : **日誌占用的硬碟空間。

以上方式把使用者資料(user data)也記錄在日誌中,稱為data journaling,linux ext3檔案系統就支援這種方式,這種方式存在效率問題:

就是每乙個寫操作涉及的元資料(metadata)和使用者資料(user data)實際上都要在硬碟上寫兩次

一次寫在日誌裡,一次寫在檔案系統上

元資料倒也罷了,使用者資料通常比較大,拷貝幾個gb的電影檔案也要乘以2實在是降低了效率。

乙個更高效的方式是metadata journaling

不把使用者資料(user data)記錄在日誌中,它防止資料損壞的方法是先寫入使用者資料(user data)、再寫日誌,即在上述」journal write」之前先寫使用者資料

這樣就保證了只要日誌是有效的,那麼它對應的使用者資料也是有效的

一旦發生掉電故障,最壞的結果也就是最後一條日誌沒記完,那麼對應的使用者資料也會丟,效果與data journaling丟棄日誌一樣,重要的是檔案系統的一致性和完整性是***的。

metadata journaling又叫ordered journaling,大多數檔案系統都採用這種方式。像linux ext3檔案系統也是可以選擇data journaling還是ordered journaling的。

Linux檔案系統與日誌

lsof檢視系統裡所有程序的檔案開啟數 ulimts n linux檔案系統與日誌 root wangna ls lhi total 28k 265490 drwxr xr x 2 root root 4.0k oct 26 22 01 aa 265485 rw 1 root root 1.2k o...

Linux 檔案系統與日誌分析

檔案資料報括元資訊與實際資料 檔案儲存在硬碟上,硬碟最小儲存單位事 扇區 每個扇區儲存512位元組 block 塊 連續的八個扇區組成乙個block 是檔案訪問的最小單位 inode 索引節點 中文譯名為 索引節點 也叫i節點 用於儲存檔案元資訊 inode包含檔案的元資訊 檔案的位元組數 檔案擁有...

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

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