日誌文件系統

日誌文件系統(英語:Journaling file system)是一種文件系統。在發生變化時,它先把相關的信息寫入一個被稱為日誌的區域,然後再把變化寫入主文件系統。在文件系統發生故障(如內核崩潰或突然停電)時,日誌文件系統更容易保持一致性,並且可以較快恢復。[1]

概述

對文件系統進行修改時,需要進行很多操作。這些操作可能中途被打斷,也就是說,這些操作不是「不可中斷」(atomic)的。如果操作被打斷,就可能造成文件系統出現不一致的狀態。[1]

例如:刪除文件時,先要從目錄樹中移除文件的標示,然後收回文件占用的空間。如果在這兩步之間操作被打斷,文件占用的空間就無法收回。文件系統認為它是被占用的,但實際上目錄樹中已經找不到使用它的文件了。

在非日誌文件系統中,要檢查並修復類似的錯誤就必須對整個文件系統的數據結構進行檢查。一般在掛載文件系統前,操作系統會檢查它上次是否被成功卸載,如果沒有,就會對其進行檢查。如果文件系統很大或者I/O帶寬有限,這個操作可能會花費很長時間。

為了避免這樣的問題,日誌文件系統分配了一個稱為日誌(journal)的區域來提前記錄要對文件系統做的更改。在崩潰後,只要讀取日誌重新執行未完成的操作,文件系統就可以恢復一致。這種恢復是原子的,因為只存在幾種情況:

  • 不需要重新執行:這個事務被標記為已經完成
  • 成功重新執行:根據日誌,這個事務被重新執行
  • 無法重新執行:這個事務會被撤銷,就如同這個事務從來沒有發生過
  • 日誌本身不完整:事務還沒有被完全寫入日誌,它會被簡單忽略

日誌的三個級別

在很多日誌文件系統(如:ext3ReiserFS)中,可以選擇三個級別的日誌:回寫(writeback)、順序(ordered)和數據(data)。

回寫

在回寫模式中,只有元數據被記錄到日誌中,數據會被直接寫入主文件系統。這種模式能提供較好的性能,不過有較大的風險。例如:在增大文件時,數據還未寫入就發生崩潰,那麼文件系統恢復後,文件後面就可能出現垃圾數據。

順序

在順序模式中,只有元數據被記錄到日誌中,但在日誌被標記為提交前,數據會被寫入文件系統。在這種模式下,如果在增大文件時,數據還未寫入就發生崩潰,那麼在恢復時這個事務會被簡單的撤銷,文件保持原來的狀態。

數據

在數據模式中,元數據和文件內容都先被寫入日誌中,然後在提交到主文件系統。這提高了安全性,但損失性能,因為所有數據要寫入兩次[1]。在這種模式下,如果在增大文件時,發生崩潰,那麼可能有兩種情況:

  • 日誌完整:這時事務會被重新執行,修改會被提交到主文件系統
  • 日誌不完整:這時主文件系統還未被修改,只需要簡單放棄這個事務

常見的日誌文件系統

  • JFSIBM的 Journaled File System,最早的日誌文件系統[1]
  • Ext4/Ext3文件系統:由Ext2文件系統演化而成的日誌文件系統,廣泛用於Linux系統。
  • XFS檔案系統:廣泛用於Linux系統,自 Red Hat Enterprise Linux 7 起取代Ext4成為Red Hat Enterprise Linux的默認文件系統(包括其衍生版及CentOS[2]
  • ReiserFS:用B+樹作為數據結構的日誌文件系統,在處理小文件時有較好的性能。
  • Btrfs:用B樹作為數據結構,被認為是下一代Linux文件系統[3]
  • NTFS微軟NTFS也是日誌文件系統,也是Windows下最常用的文件系統。
  • HFS+蘋果公司發展的OS X作業系統下主要使用的文件系統。

參見

參考資料

  1. ^ 1.0 1.1 1.2 1.3 M. Tim Jones. Linux 日志文件系统剖析. IBM. 2008-07-07 [2011-01-15]. (原始內容存檔於2020-03-28). 
  2. ^ Chapter 4. File Systems Red Hat Enterprise Linux 7. Red Hat Customer Portal. [2022-03-18]. (原始內容存檔於2022-03-01) (英語). 
  3. ^ 劉明. 新一代 Linux 文件系统 btrfs 简介. IBM. 2010-09-20 [2010-01-15]. (原始內容存檔於2010-01-25).