日誌檔案系統

日誌檔案系統(英語: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).