公司最近開發的系統中偶爾會發生檔案的損壞和目錄的丟失,在調查的過程中發現使用自己不了解的東西總是要付出代價的。這裡記錄下調查的過程:
首先在測試環境了作了以下兩個實驗:
①長時間連續讀寫檔案
②寫檔案中斷電
實驗①在15小時的連續讀取中沒有發生檔案損壞及目錄丟失、實驗②20次的斷電實驗中也沒有發生即存檔案的損壞,這是唯一的乙個好訊息,說明這個問題發生的機率很低。
既然實驗不行那就只能理論分析了,這次使用的儲存介質時nand flash。flash儲存器 以頁面(page)的形式進行讀寫訪問,它具有速度快、成本低等很多優點。但是由於製作工藝的原因
,每個塊的最大擦寫次數是100萬次,並且會發生位反轉的問題。 nand的**商建議使用nand快閃儲存器的時候,同時使用edc/ecc演算法。還好我們這次的讀寫晶元sm3251支援內建的ecc校驗。
雖然ecc校驗能搞糾正單bit的錯誤,但是當多個錯誤同時發生時就無能為力了。並且nand flash的唯讀資料在訪問100,000次後也容易發生異常。qnx為了解決這個問題設計了etfs檔案系統,此檔案系統會跟蹤nand flash每個資料塊的讀寫次數,並提前作出處理。並且此系統能夠延長nand flash的使用壽命。但是悲劇的是由於硬體設計問題導致此系統中並不能使用etfs檔案系統。
退而求其次,決定使用power safe的qnx6檔案系統,此檔案系統號稱使用了copy-on-write技術能夠很好的預防在系統崩潰時發生的檔案損壞問題。雖然qnx6檔案系統不能解決nand flash的讀寫壽命問題,但是也如能夠增強斷電時的系統穩定性那也還說得過去。悲劇再次發生,諮詢qnx公司的結論是qnx6檔案系統的copy-on-write機能只支援硬碟而不支援flash。已經沒有第三種選擇了,最終還是使用了qnx6檔案系統。
但是問題總是要解決的啊,於是技術大拿出場。在多方求證後猜測檔案的損壞是因為寫檔案過程中的斷電,而導致的檔案損壞。並且提出了對應的解決方案:取消qnx6檔案系統中的快取機制。其實在qnx中寫檔案並不會直接寫入磁碟,而是會先快取到記憶體中,並由os決定何時真正何時寫入磁碟(通常在5分鐘內)。這不僅能夠提公升os的讀寫效率還能減少磁碟中的檔案碎片。這樣看這是好事啊,幹嗎關啊?
qnx中的如果使用shutdown -b命令關閉系統就會發現,os並不會切斷電源。系統關閉了但是硬體還是保持啟動狀態。為了解決這個問題,我們系統在關閉時是直接呼叫cpu的斷電指令的。這就導致os的快取寫入磁碟的時機就可能發生在斷電的時候,而如果不使用快取,在系統關閉之前,系統中的檔案操作肯定已經結束了,這就降低了系統中檔案損壞的機率。
但是這種方案只是解決了正常執行中的檔案損壞,而系統突然斷電的檔案損壞並沒有解決。不過還好幾率比較低。
QNX的檔案系統
qnx支援多種檔案系統。多數檔案系統都是掛在指定路徑下的資源管理器。qnx的檔案系統有如下特點 檔案系統能夠動態啟動和終了 多個檔案系統可能同時執行 提供給程式乙個與配置和檔案系統數無關的 統一的路徑空間和介面 乙個點上的檔案系統對於其他點時透明的?一 簡介 1 filesystem的種類 imag...
關於檔案系統
使用 fdisk 與mkfs 進行分割槽與格式化。分割槽 就是將磁碟分為乙個乙個的區域,可以方便歸類使用。格式化 就是在乙個個已經分好的區域上建立檔案系統。以下命令是對第二塊磁碟進行分割槽操作 fdisk dev sdb 以下命令是對第二塊磁碟進行格式化檔案系統的操作,檔案系統為xfs,xfs是li...
檔案系統 檔案系統的架構
vfs是具體檔案系統的抽象,依靠超級塊 inode dentry以及檔案這些結構來發揮作用,檔案系統的架構就體現在這些結構的使用方式中。1 超級塊作用分析 1 2 所有的dentry都指向乙個dentry hashtable dentry hashtable是乙個樹組,每乙個樹組成員都是hash鍊錶...