文件系統(七):文件系統崩潰一致性、方法、原理與局限

来源:https://www.cnblogs.com/liwen01/p/18251716
-Advertisement-
Play Games

liwen01 2024.06.16 前言 先提幾個問題:什麼是文件系統崩潰一致性?為什麼會出現文件系統崩潰一致性問題?有哪些方法可以解這個問題?它們各自又有哪些局限性? window系統電腦異常後會藍屏、手機死機卡頓後我們會手動給它重啟,大部分設備的系統在遇到不可修複的嚴重異常後都會嘗試通過重啟來 ...


liwen01 2024.06.16

前言

先提幾個問題:什麼是文件系統崩潰一致性?為什麼會出現文件系統崩潰一致性問題?有哪些方法可以解這個問題?它們各自又有哪些局限性?

window系統電腦異常後會藍屏、手機死機卡頓後我們會手動給它重啟,大部分設備的系統在遇到不可修複的嚴重異常後都會嘗試通過重啟來恢復,因為系統重啟之後,系統整體比較"乾凈"。

其中有一例外,就是我們希望磁碟存儲的數據無論在系統出現何種異常的情況下,都能夠保存好原來的數據,系統恢復後可以再找到異常前的所有數據。

文件系統崩潰一致性(Crash Consistency)是指在文件系統發生崩潰、斷電或其它不可預見的故障後,文件系統能夠保證數據的一致性和完整性,並能夠恢復到一個合法且可操作的狀態,確保系統重新啟動或恢復之後,數據不會出現損壞、丟失或不一致的情況。

(一)一致性的複雜性

以ext4 文件系統舉例,當我們創建一個文件系統的時候,有下麵4個步驟:

  1. 查找空閑 inode:通過檢查 inode bitmap找到一個空閑的 inode,併在 inode bitmap中標記為已使用。
  2. 分配數據塊:通過檢查block bitmap找到空閑的數據塊,併在block bitmap中標記為已使用。
  3. 更新 inode:將新文件的元數據寫入 inode table中的相應位置。
  4. 更新目錄項:在目標目錄的 inode 數據塊中添加一個新的目錄項,包含文件名和對應的 inode 號。

因為磁碟是以扇區為最小單位,所以上面4個步驟不可能一次全部寫入到磁碟中去,在1到4步驟中間的任意一個時間點系統突然崩潰,都會導致文件系統不一致。比如在2~3步驟中間斷電,就會造成inode bitmap、block bitmap中標記已經使用,但是沒有實際的文件與之對應,如果不回收,那麼這幾個塊就可能永遠不會被使用。

在實際使用的時候,情況會更加地複雜,因為系統為了提升文件系統的讀寫檢索性能,在掛載文件系統的時候,系統會將文件系統的元數據緩存到記憶體上。如下圖《圖1.1 記憶體與存儲結構》

圖1.1 記憶體與存儲結構

在有緩存的情況下,數據一般是定時寫入磁碟,或者是手動保存才會寫入磁碟,一次完成批量數據的寫入。如果在這個過程中突然異常,丟失的數據可能會更加多。

有多少人經歷過電腦突然斷電,辛辛苦苦寫的內容全部被丟失。系統崩了,內心也崩了。

關於ext4 文件系統的詳細介紹,可以查看文章《文件系統(六):一文看懂linux ext4文件系統工作原理

解決文件系統一致性的問題,常用的方法有:日誌、寫時複製、Soft Update、日誌文件系統,它們各有優缺點,目前並沒有哪種方案可以適用所有場景。

(二)文件系統日誌

(1)日誌工作原理

在ext4文件系統中,有一個獨立的日誌數據區,它的基本思想是:先將一組操作記錄到日誌區(日誌提交完成),然後再去實現這些操作(應用事務完成),實現結束之後再把日誌擦除(日誌清理完成)。

日誌處理時序流程圖

事務開始:文件系統開始一組更新操作,並開啟一個新的事務

收集日誌:收集所有即將修改的數據(以及在 Journal 模式下的數據)

提交日誌:更新日誌頭,標記該事務已經提交(commit)

應用事務:將日誌中的修改應用到文件系統,將數據和元數據寫入最終位置

清理日誌:事務完成後,日誌系統清理已提交的日誌記錄

(2)通過日誌進行恢復

文件系統有了日誌功能之後,在文件系統崩潰或是突然斷電後就可以通過日誌保持文件系統的一致性。基本的流程是,文件系統掛載後,系統會去掃描日誌區域,看是否有未完成的事務,如果有,則判斷該事件是否有提交:

  • 如果未提交,本次修改操作就直接丟棄
  • 如果有提交,根據日誌記錄的信息,重新執行修改操作
日誌恢復流程

(3)優缺點

文件系統的日誌功能,它的主要優點有兩個:

  • 可以保持一致性: 不會因為某些異常導致整個文件系統異常
  • 可以減少文件系統檢查時間: 傳統使用fsck去掃描整個磁碟進行檢查,非常耗時,有了日誌功能後,直接掃描日誌信息就可以了。

文件系統引入日誌之後,明顯的缺點有:

  • 影響性能: 所有的操作都需要先寫日誌,再執行具體的操作,在高負載的情況下會導致IO壓力增加,從而降低系統的整體性能。
  • 寫熱點: 因為日誌區會頻繁的寫入和擦除,對於有擦寫次數限制的flash來說,比較容易把日誌區域寫穿。

(4)ext4 的日誌模式

ext4 文件系統用JBD2實現的日誌有三種模式:Writeback、Ordered、Journal

Writeback模式

在這種模式下,元數據變更會被記錄到日誌中,但數據的變更不會被記錄。數據寫入磁碟的順序不受元數據更新的順序影響。

優點:性能較高,因為減少了日誌記錄的數據量。

缺點:數據一致性較差,在崩潰後,文件可能會包含新元數據指向的舊數據。

Ordered模式

這是ext4文件系統的預設日誌模式。元數據變更會被記錄到日誌中,數據的變更雖然不記錄,但數據寫入磁碟的順序必須在相應的元數據更新之前。

優點:在性能和數據一致性之間提供了平衡。崩潰後,文件不會包含新元數據指向的舊數據,因為數據寫入總是在元數據更新之前完成。

缺點:性能比writeback模式略低,因為需要保證數據先於元數據寫入。

Journal模式

在這種模式下,所有數據和元數據的變更都會被記錄到日誌中。數據和元數據都被完整地寫入日誌,然後再寫入主文件系統。

優點:提供最高的數據一致性保障。在崩潰恢復時,所有已提交的數據和元數據變更都可以被恢復。

缺點:性能較低,因為所有數據都需要寫兩次,一次寫入日誌,一次寫入主文件系統

(三)寫時複製(Copy on Write)

Copy-on-Write(COW,寫時複製)在在電腦中應用非常多,比較常見的是在記憶體中的寫時複製。文件系統中的寫時複製與記憶體中的寫時複製有些不一樣。在文件系統崩潰一致性中,COW它的基本原理是,在需要修改數據時,不直接在原數據位置進行修改,而是將數據複製到新位置進行修改,只有在修改完成後,才更新指針或元數據指向新的數據位置。

(1)基本原理

COW技術的核心思想是推遲實際數據寫入的時間,直到必須進行修改為止。具體步驟如下:

  1. 讀取數據:當需要讀取數據時,直接從現有的數據塊讀取。
  2. 寫入數據:當需要寫入數據時,不直接修改現有的數據塊,而是複製一份數據塊到新位置。
  3. 修改數據:在新的數據塊上進行修改操作。
  4. 更新元數據:在確保新數據塊寫入成功後,更新指向數據塊的元數據,使其指向新的數據位置。
  5. 釋放舊數據:如果舊的數據塊不再被引用,則可以將其標記為可用空間。

(2)工作流程

以Btrfs為例,COW的工作流程如下:

  1. 當用戶修改文件時,Btrfs首先在新位置分配一個新的數據塊。
  2. 將舊數據塊中的內容複製到新數據塊。
  3. 在新數據塊上應用用戶的修改。
  4. 修改完成後,更新Btrfs的元數據,將指針從舊數據塊指向新數據塊。
  5. 在確保所有元數據更新都完成後,舊數據塊可以被標記為可用空間。

(3)應用實例

Btrfs和ZFS:Btrfs(B-tree文件系統)和ZFS(Zettabyte文件系統)是兩種廣泛使用的支持COW的文件系統。它們利用COW技術來提高數據一致性和完整性。

快照和克隆:COW允許高效地創建數據快照和克隆。例如,在Btrfs中,可以通過COW技術快速創建文件系統的快照,而無需複製實際數據。

事務性操作:通過COW,文件系統中的修改可以被視為事務性操作。只有當所有修改都成功完成後,才會更新元數據指針,這確保了在崩潰發生時,文件系統處於一致的狀態。

(4)優勢

數據一致性:由於數據修改是在新位置進行的,系統崩潰時舊數據仍然保持不變,確保數據一致性。

崩潰恢復:在崩潰恢復過程中,通過檢查元數據,可以快速確定哪些數據塊是有效的,哪些是未完成的修改。

高效快照:COW技術允許文件系統高效地創建和管理快照,因為快照只需複製元數據指針,而不需要複製實際數據。

(5)缺點

性能開銷

  1. 寫放大效應:COW會導致寫放大效應,因為每次寫入操作都需要分配新的數據塊,並將數據複製到新位置。這可能會增加寫操作的延遲,尤其在寫入頻繁的場景下
  2. 額外的元數據更新:由於每次寫入都需要更新元數據指針,這會增加文件系統的元數據操作負擔,影響整體性能。

磁碟空間利用效率

  1. 磁碟空間碎片化:COW技術會導致磁碟空間碎片化,因為每次寫入都會創建新的數據塊。這可能會導致文件系統中的空閑空間變得不連續,從而降低磁碟空間利用效率。
  2. 空間消耗:由於每次寫入需要新的數據塊,因此在頻繁的寫操作下,磁碟空間的消耗速度會加快,尤其是在快照和克隆操作頻繁的情況下。

數據恢復和修複複雜性

  1. 數據恢復時間:在發生系統崩潰或其他故障時,儘管COW能確保數據一致性,但恢復過程可能會較為複雜,需要檢查和重建元數據。
  2. 修複工具的複雜性:文件系統需要複雜的修複工具來處理和修複COW帶來的元數據和數據問題,這增加了系統維護的複雜性。

硬體依賴性

  1. 對存儲硬體的要求:COW技術對存儲硬體的性能有較高要求,尤其是在頻繁寫操作或快照操作的情況下。使用慢速存儲設備可能會顯著降低系統性能。

(四)Soft Updates

Soft Updates 是通過有序地更新元數據以確保文件系統的一致性,同時儘可能減少性能開銷。與日誌和Copy-on-Write(COW)技術相比,Soft Updates 提供了一種不同的路徑來實現崩潰一致性。

(1)基本原理

Soft Updates 的核心思想是控制文件系統元數據更新的順序,以確保即使在系統崩潰時,文件系統仍然保持一致性。具體方法包括以下幾個步驟:

  1. 依賴關係跟蹤:記錄元數據更新之間的依賴關係,確保更新順序滿足一致性要求。
  2. 延遲寫入:延遲寫入元數據的某些更新,直到所有相關依賴關係得到滿足為止。
  3. 批量處理:將多個相關的元數據更新批量處理,以減少磁碟I/O操作次數。

(2)工作流程

創建和刪除文件

  1. 在創建文件時,首先更新目錄條目,然後更新文件的inode。
  2. 在刪除文件時,先更新文件的inode,再更新目錄條目。這確保了即使系統崩潰,仍然不會出現目錄指向已刪除文件的情況。

分配和釋放數據塊

  1. 分配數據塊時,先更新inode中的指針,再標記數據塊為已使用。
  2. 釋放數據塊時,先標記數據塊為未使用,再更新inode中的指針。這防止系統崩潰後出現數據塊被多次分配的情況。

更新元數據

  1. 所有元數據更新操作都在記憶體中進行排序,確保在寫入磁碟時滿足依賴關係。
  2. 在寫入磁碟之前,檢查所有依賴關係,確保更新順序正確。

(3)優勢

  1. 提高性能:由於不需要像日誌功能那樣記錄每次操作的日誌,Soft Updates 在一定程度上減少了磁碟I/O操作,從而提高了性能。
  2. 一致性保證:通過有序的元數據更新,確保文件系統即使在崩潰後也能保持一致性。
  3. 減少寫放大效應:相比COW,Soft Updates 通過批量處理和延遲寫入減少了寫放大效應,節省了磁碟空間和I/O操作。

(4)缺點

  1. 實現複雜性:Soft Updates 的實現需要精確跟蹤和管理元數據更新之間的依賴關係,增加了文件系統的複雜性。
  2. 記憶體消耗:為了管理依賴關係和批量處理更新,Soft Updates 需要在記憶體中維護大量的狀態信息,可能增加記憶體消耗。
  3. 有限的應用範圍:Soft Updates 主要適用於元數據更新頻繁的場景,對於數據更新頻繁的場景,其優勢不明顯。

(五)日誌文件系統(Log-structured File System)

這裡介紹的日誌文件系統(Log-structured File System,LFS),與上面介紹的ext4的日誌功能不是同一個東西,LFS採用了完全不同的方法來管理數據和元數據,以提高性能和崩潰一致性。

(1)基本原理

日誌文件系統(LFS)的核心思想是將所有數據和元數據的更新操作記錄到一個連續的日誌結構中,而不是直接在原數據塊上進行寫操作。其基本原理如下:

  1. 日誌結構:LFS將所有寫操作都追加(append)到一個稱為日誌(log)的連續區域中,而不是覆蓋現有的數據塊。
  2. 數據和元數據更新:當有寫操作時,LFS將更新操作追加到日誌中,併在日誌中記錄新的數據塊或更新的元數據。
  3. 後臺回收:為了保持文件系統性能,LFS周期性地執行後臺任務,將日誌中的更新整理併合併成新的數據塊,然後釋放不再使用的舊數據塊。
  4. 崩潰一致性:由於所有的更新都是追加到日誌中,而不是直接在原始數據位置上修改,當系統崩潰時,可以通過重放日誌來恢覆文件系統狀態,從而確保數據的一致性。

(2)工作流程

寫操作

  1. 當文件系統執行寫操作時,LFS將新的數據或更新的元數據追加到日誌中。
  2. 日誌中的寫入是順序的,因此可以通過順序寫入優化性能。

後臺合併

  1. 定期或在需要時,LFS執行後臺任務,將日誌中的更新合併成新的數據塊。
  2. 合併過程中可以優化數據的排列順序,並釋放不再需要的舊數據塊。

崩潰恢復

  1. 在系統崩潰或重新啟動時,LFS通過重放日誌中的操作來恢覆文件系統的狀態。
  2. 因為所有更新都是追加的,可以確保文件系統在崩潰後仍然保持一致性,避免數據損壞或丟失。

(3)優勢

  1. 崩潰一致性:通過日誌追加和重放機制,確保系統崩潰後可以快速恢復到一致狀態。
  2. 寫性能:順序寫入日誌結構可以顯著提高寫入性能,特別是在高負載和隨機寫入場景下。
  3. 數據恢復:由於數據和元數據的更新都是追加到日誌中的,即使發生意外的系統崩潰,也可以通過重放日誌來恢複數據,而不會丟失已經提交的更新。

(4)缺點

  1. 讀操作性能:由於數據的讀取可能分散在不同的日誌塊中,可能導致隨機讀取性能下降,尤其是在較大的文件系統上。
  2. 空間利用率:由於數據是追加到日誌中的,可能會產生碎片化的數據存儲,從而影響磁碟空間的有效利用。
  3. 實現複雜性:設計和實現一個高效的日誌文件系統需要處理複雜的數據結構和演算法,這可能增加系統的開發和維護成本。

(5)應用

在嵌入式設備中, 經常使用jffs2文件系統進行參數保存,雖然jffs2 是專門為快閃記憶體設計的文件系統,但它的設計也是LFS的原理來設計的。

結尾

上面介紹了日誌、寫時複製、Soft Update、日誌文件系統的方法來解決文件系統的一致性問題,這裡還有一個問題,我們經常使用的U盤或是SD卡,它並沒有使用上面的任何一種機制,為什麼我們在實際使用的時候,很少能感覺到丟數據呢?甚至還經常直接熱拔插它們。這個問題我們在下一篇中解釋。

---------------------------End---------------------------
如需獲取更多內容
請關註 liwen01 公眾號

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文是IMX6ULL開發板spi OLED驅動學習筆記,方便後面查看時快速的回顧,而不需要一點點的看視頻 視頻地址: https://www.bilibili.com/video/BV1Yb4y1t7Uj?p=144&spm_id_from=pageDriver&vd_source=1d93d6a5 ...
  • 在嵌入式Linux設備中,經常使用jffs2文件系統來作為參數區的文件系統格式。至於為什麼要使用jffs2來作為參數區的文件系統,我猜大部分人都沒有做過多的思考。 jffs2在2001年被設計出來,距今已過二十多年,現在在嵌入式設備中它還在被大量使用、說明這套設計本身是沒有問題。 但是,你是否有... ...
  • 為了更好的閱讀體驗,請點擊這裡 先學習一下 zsh 的配置吧~ 參考資料 從 0 開始:教你如何配置 zsh powerlevel10k 如何給 Xshell 配置呢 當我安裝完 oh-my-zsh、powerlevel10k、fast-syntax-highlighting、以及若幹(powerl ...
  • 腳本工具可以幫助我們完成一些需要重覆勞動的工作; 基礎語法: "#"為註釋符號 1:#指定腳本運行環境為 /bin/bash #! /bin/bash 2:輸入參數,xxx為變數名,多個變數名用空格隔開read xxx 輸出參數echo xxx 3: 變數和運算符的定義:這是每個編程語言必不缺少的部 ...
  • 在伺服器linux系統環境下,想要上傳和下載文件到本地PC通常是比較麻煩的, 在這個過程中,將層級複雜的文件夾壓縮成壓縮包再進行上傳/下載更為方便, 其中常用到的linux指令就是 zip / unzip, 文件壓縮指令 zip 個人認為,在日常科研中,常用的參數有兩個: -q 不顯示指令執行過程( ...
  • 0、思考與回答 0.1、思考一 為什麼要增加時間片輪詢? 目前的 RTOS 內核已經支持搶占優先順序,即高優先順序的任務會搶占低優先順序的任務得到執行,但是對於同等優先順序的任務,如果不支持時間片輪詢,則只能有一個任務運行,並且由於優先順序相同所以除延時阻塞到期外也不會發生任務調度,因此需要增加時間片輪詢保證 ...
  • 本文介紹在Linux Ubuntu操作系統的電腦中,安裝Anaconda環境與Python語言的方法。 在之前的文章Anaconda與Python環境在Windows中的部署中,我們介紹了在Win10電腦中,安裝Anaconda環境與Python語言的方法;而在本文中,我們就詳細介紹一下在Linux ...
  • 0、思考與回答 0.1、思考一 如何處理進入阻塞狀態的任務? 為了讓 RTOS 支持多優先順序,我們創建了多個就緒鏈表(數組形式),用每一個就緒鏈表表示一個優先順序,對於阻塞狀態的任務顯然要從就緒鏈表中移除,但是阻塞狀態的任務並不是永久阻塞了,等待一段時間後應該從阻塞狀態恢復,所以我們需要創建一個阻塞鏈 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...