日志檔案系統

本页使用了标题或全文手工转换,现处于香港繁体模式
求聞百科,共筆求聞

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

概述

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

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

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

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

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

日志的三個級別

在很多日志檔案系統(如:ext3, ReiserFS)中,可以選擇三個級別的日志:回寫(writeback)、順序(ordered)和數據(data)。

回寫

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

順序

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

數據

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

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

常見的日志檔案系統

  • JFSIBM的 Journaled File System, 最早的日志檔案系統[1]
  • Ext4/Ext3檔案系統:由Ext2檔案系統演化而成的日志檔案系統,廣泛用於Linux系統。
  • XFS檔案系統:廣泛用於Linux系統,取代了Ext4[來源請求]
  • ReiserFS:用B+樹作為數據結構的日志檔案系統,在處理小檔案時有較好的效能。
  • Btrfs:用B樹作為數據結構,被認為是下一代Linux檔案系統[2]
  • 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]. 
  2. 劉明. 新一代 Linux 文件系统 btrfs 简介. IBM. 2010-09-20 [2010-01-15].