談一談如何處理檔案系統損壞的問題

2021-10-12 17:35:34 字數 1295 閱讀 9918

在嵌入式的裝置上,乙個無法避免的問題是,如果裝置突然掉電,可能會引起一系列的連鎖反應(這也是pc不建議直接扣電池的原因),其中有一項就是,突然掉電可能會引起檔案系統損壞,這可是要命的!一般來說,如果只是檔案損壞,那也沒啥,最多壞乙個或者幾個檔案,但要是檔案系統損壞,那可能意味著所有資料的丟失(當然,如果你捨得花錢,還是可以找回來的, 只是成本問題),對使用者體驗的影響會是致命的,我們要如何解決這個問題呢?

首先從測試說起:

測試: 選用fat32檔案系統,自己寫指令碼做寫入檔案時隨機斷電的壓力測試,發現:

問題一:檔案系統沒有損壞,但最後寫入的檔案有乙個或者多個損壞

問題二:檔案系統損壞,比如檔案系統變成read-only(最常見的問題),有時也會有檔案系統損壞

分析:針對問題一,有一下兩種case可能造成多個檔案損壞(我們能接受的只有最後乙個file壞掉,但其他的file必須是好的)

case #1: 乙個物理的block可能包含多個檔案系統的block file,這樣造成寫乙個file的時候可能把不相干的file擦除,造成其他檔案損壞。

case #2: 乙個物理的block可能包含多個檔案系統的block file,這樣造成寫乙個file的時候可能把不相干的file擦除,造成其他檔案損壞。

針對問題二:

fat32不是日誌型檔案,檔案系統只是記錄一些index,而且寫入的時候沒有備份,這就意味著,如果寫index的時候斷電,那檔案系統可能就出問題。

解決方法:

針對case #1:這個可以通過調整file system的block size來解決,確保乙個block裡面只放乙個file,這就要求檔案系統的block size必須大於或者等於儲存介質的block size,而且必須是儲存介質block size的倍數關係,一般我們設定成一樣的即可。因為fs的block size越大,浪費也越嚴重。

針對case #2:因為作業系統快取的關係,在斷電的瞬間還是可能造成多個檔案損壞(因為這些檔案快取在記憶體),但檔案系統不會損壞。如果想避免出現多個file同事損壞,可以使用fsync(), fdatasync()函式在寫完重要的資料後強制sync。

針對問題而,可以選中ext4 檔案系統,

ext4是日誌型檔案系統,每次寫入資料的時候,會先將meta data的部分寫到乙個back up區域,back up區域寫完再往目標位址copy,這樣:

如果斷電的時候back up區域沒寫完,重新開機後檔案會找不到

如果斷電的時候back up區域已經寫完,但是目標位址沒寫完,重新開機後系統會自動把back up區域的meta data copy到目標位址,從而找到檔案

如果目標位址也寫完了,那檔案自然沒有問題。

說說在 Python 中如何處理檔案系統路徑

在 windows 作業系統中,檔案路徑以倒斜槓作為資料夾之間的分隔符。但在 osx 和 linux 上,使用的則是正斜槓作為路徑分隔符。如果希望讓程式適配所有作業系統,就會用到 os.path.join 函式。import os path os.path.join usr local sbin p...

如何實現乙個檔案系統(六)

1 1 請參見 operation systems internals and design principles 一書第12章 2 2 扇區是磁碟的最小定址單元,而檔案塊是核心操作檔案的最小單位,乙個塊可以包含乙個或數個扇區。這些磁碟塊被讀入記憶體後即刻被存入緩衝中,同樣,檔案塊被寫出也要通過緩衝...

如何在wince下實現乙個檔案系統驅動

如何在wince下實現乙個檔案系統驅動 應用程式操作檔案是通過wince 檔案系統提供的介面進行操作,如 可以通過createfile函式,開啟或建立乙個檔案。接下來,系統是如何去完成這個任務的呢?比如我們要操作sd卡上的檔案,sd卡上也有自己的檔案系統,用於組織和管理檔案,wince檔案系統是如果...