日志文件系统
Journaling filesystem
基本原理
更新文件系统以反映文件和目录的更改通常需要许多单独的写入操作。这使得写入之间可能发生中断(例如电源故障或系统崩溃),从而使数据结构处于无效的中间状态。[1]
例如,删除 Unix 文件系统上的文件涉及三个步骤:[7]
- 删除其目录条目。(Removing its directory entry.)
- 将索引节点释放到空闲索引节点池中。(Releasing the inode to the pool of free inodes.)
- 将所有磁盘块返回到空闲磁盘块池。(Returning all disk blocks to the pool of free disk blocks.)
如果在步骤1之后和步骤2之前发生崩溃,就会出现孤立的inode,从而导致存储泄漏;如果在步骤2和步骤3之间发生崩溃,则该文件先前使用的块将无法用于新文件,从而有效地减少了文件系统的存储容量。重新安排步骤也无济于事。如果步骤 3 在步骤 1 之前,则它们之间的崩溃可能允许文件的块重新用于新文件,这意味着部分删除的文件将包含另一个文件的部分内容,并且对任一文件的修改都会显示在两个文件中。另一方面,如果步骤 2 在步骤 1 之前,则它们之间的崩溃将导致文件无法访问,尽管该文件看起来存在。
检测此类不一致并从中恢复通常需要完整地检查其数据结构,例如通过fsck(文件系统检查器)等工具。[2] 这通常必须在下次安装文件系统以进行读写访问之前完成。如果文件系统很大并且 I/O 带宽相对较小,则这可能会花费很长时间,并且如果它阻止系统的其余部分恢复联机,则会导致更长的停机时间。
为了防止这种情况,日志文件系统分配一个特殊区域——日志——在其中记录它将提前进行的更改。崩溃后,恢复只需从文件系统读取日志并重播该日志中的更改,直到文件系统再次保持一致。因此,这些更改被认为是原子的(不可整除),因为它们要么成功(最初成功或在恢复期间完全重播),要么根本不重播(被跳过,因为它们在之前尚未完全写入日志)发生崩溃)。
JFS(1990)->NTFS(1993)->XFS(1994)->Apple HFS Plus(1998)->ext3(2001)->ext4(2008)
ext和ext2文件系统不是日志文件系统
- 日誌式檔案系統 (Journaling filesystem)
為了避免上述提到的檔案系統不一致的情況發生,因此我們的前輩們想到一個方式, 如果在我們的 filesystem 當中規劃出一個區塊,該區塊專門在記錄寫入或修訂檔案時的步驟, 那不就可以簡化一致性檢查的步驟了?也就是說:
- 預備:當系統要寫入一個檔案時,會先在日誌記錄區塊中紀錄某個檔案準備要寫入的資訊;
- 實際寫入:開始寫入檔案的權限與資料;開始更新 metadata 的資料;
- 結束:完成資料與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的紀錄。
在這樣的程序當中,萬一資料的紀錄過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄區塊, 就可以知道哪個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 這樣就可以達到快速修復 filesystem 的能力了!這就是日誌式檔案最基礎的功能囉~
那麼我們的 ext2 可達到這樣的功能嗎?當然可以啊! 就透過 ext3/ext4 即可! ext3/ext4 是 ext2 的升級版本,並且可向下相容 ext2 版本呢! 所以囉,目前我們才建議大家,可以直接使用 ext4 這個 filesystem 啊! 如果你還記得 dumpe2fs 輸出的訊息,可以發現 superblock 裡面含有底下這樣的資訊:
Journal inode: 8 Journal backup: inode blocks Journal features: (none) Journal size: 32M Journal length: 8192 Journal sequence: 0x00000001
看到了吧!透過 inode 8 號記錄 journal 區塊的 block 指向,而且具有 32MB 的容量在處理日誌呢! 這樣對於所謂的日誌式檔案系統有沒有比較有概念一點呢?^_^。
XFS:
与ext家族一样,都包括inode/data block/superblock等资料
大容量磁盘格式化速度比ext家族快
观察superblock用xfs_info(ext家族用dump2fs)
文件系统只支持增长(xfs_growth),不支持收缩

评论
发表评论