知乎日報:斷電的一瞬間電腦硬盤裡會發生什麼?

  這事說起來挺複雜的,不同檔案系統,不同裝置,不同介質,效果都是有區別的。

  斷電的一瞬間,很多事情是無法確定的:

  1. 你無法確定你試圖向裝置驅動傳送的寫指令是否成功,驅動程式本身一般都有快取;

  2. 即使寫指令正常返回,你也無法確定裝置實際上是否寫成功,因為裝置本身可能也有快取。目前沒有裝置能保證寫指令返回的情況下,所有資料一定成功的儲存在介質上(但部分廠商能保證少量資料一定能成功寫入),對儲存裝置的flush 操作並非絕對可靠;

  3. 哪些成功哪些失敗可能是亂序的,換句話說,如果先發送寫請求 A,再發送寫請求 B,並且都成功返回,掉電時請求 A 可能丟失,但 B 成功(NCQ 功能);

  4. 機械式磁碟可能會出現丟失半截資料的情況(比如,一個 512 位元組扇區只寫入了 100 位元組,也就是題主說的 bit 級錯誤),但這種一般都會透過校驗位檢測出來。

  因為有以上這麼多的限制,實際上檔案系統一般沒辦法保證資料一定不丟失,甚至哪些丟失哪些能恢復也是不確定的。

  一般來說,檔案系統有以下的幾種策略:

  1. 完全不管錯誤的事情,錯了就錯了;

  2. 打標記位的方式,如果懷疑有錯,透過磁碟檢測功能恢復;

  3. 在設計上保證檔案系統結構上可恢復,但不保證使用者資料可恢復;

  4. 能在使用者資料層面上保證資料的絕對正確。

  第一種和第二種策略現在比較少見,FAT 檔案系統算是屬於這類;主流檔案系統基本上都能保證第三種,比如 NTFS 之類的;第四種比較難,一般都要配合儲存驅動一起,多見於 Flash 介質的專屬檔案系統。

  保證資料不損壞,具體的方案一般有:

  方案 1:Copy-On-Write,寫資料的時候不在原來的位置寫,而是先讀一份,然後寫到另外一個位置,當確認寫成功時,把檔案系統的指標指向新的位置。如下圖:

  實際應用中,比這個情況複雜,因為 Data2 寫入的過程中,File1 本身的一些資訊(修改時間等)也發生了變化,所以 CopyOnWrite 產生的影響不止這一個塊,而是很多。

  方案 2:日誌(Journal)技術。使用日誌記錄 meta-data 甚至是資料塊的變化情況(NTFS 就是這種策略),一旦出現掉電情況,在日誌中反推到一個正確的狀態上,就可以保證 meta-data 不損壞。

  常見的方案就這兩種,當然還有別的更復雜的技術,可以參考這個連結(Comparison of file systems),但不管用什麼方案,本質上都是以犧牲效能為代價換取結構上的穩定。

  最後回到題主的問題,檔案系統如何保證資料的正確性?如果是指檔案的資料部分,是無法保證的,因為檔案系統無法確定資料到底寫沒寫進去,絕大多數檔案系統只能保證自身結構是正確的,但這個正確可能是回滾之後的狀態,具體回滾多少內容,檔案系統自己也不能保證。

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 1268 字。

轉載請註明: 知乎日報:斷電的一瞬間電腦硬盤裡會發生什麼? - 楠木軒