2013-12-12 452 views
4

我正在使用嵌入式ARM平臺和內置的NAND閃存。我的屋頂隔斷是squashfs。 u-boot和內核都使用OMAP_ECC_BCH8_CODE_HW。問題在於一些電路板(不僅僅是一個)在停電後停止工作(它們被使用約2個月)。SQUASHFS錯誤:無法讀取頁面,...,大小

這些錯誤可以同時啓動可以看出:

[ 8.270507] end_request: I/O error, dev mtdblock9, sector 25184 
[ 8.278930] SQUASHFS error: squashfs_read_data failed to read block 0xc40396 
[ 8.286376] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.293579] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.300628] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.307647] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.314819] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.321838] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.328887] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.335906] SQUASHFS error: Unable to read page, block c40396, size d696 
[ 8.343017] SQUASHFS error: Unable to read fragment cache entry [c40396] 
[ 8.350006] SQUASHFS error: Unable to read page, block c40396, size d696 
/usr/sbin/lighttpd: '/usr/lib/libpcre.so.1' is not an ELF file 
/usr/sbin/lighttpd: can't load library 'libpcre.so.1' 

我應該如何調試呢?我沒有擦除閃存,所以仍然可以對其進行一些測試。

什麼我迄今所做的:

  1. 我用nanddump(使用-o,讀OOB數據)上的壞分區,我注意到3個ECC校正警告。當我將這個轉儲寫入另一個電路板時,它可以毫無問題地啓動。

  2. 當我用附加選項-n(--noecc,Read without errors correction)使用nanddump並將其寫入另一個板(使用nandwrite -n)時,第二塊板無法啓動。

在我看來,這些錯誤是可以恢復的,這就是爲什麼nanddump在第一種情況下糾正了它們。我比較了這2個轉儲和他們只有三個差異(由nanddump報道3個ECC糾錯?)

# diff mtd_without_ecc.hex mtd_with_ecc.hex 

486347c486347 
< 076bca0: 59d2 d8bc 3e89 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs 
--- 
> 076bca0: 59d2 d8bc 3e09 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs 
783769c783769 
< 0bf5980: e31e f50a e5b5 6ae5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. 
--- 
> 0bf5980: e31e f50a e5b5 6aa5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. 
1315929c1315929 
< 1414580: a9ec ef89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A 
--- 
> 1414580: a9ec af89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A 

的問題是:爲什麼這些錯誤不是由系統自動修正?是否因爲squashfs不是「mtd-aware」文件系統,而不應該在mtd設備上使用它?如果是這樣,我應該使用squashfs而不是UBI嗎?那麼內核怎麼樣(據我所知它必須是原始映像才能從u-boot啓動)?

感謝您的幫助!

回答

0

事實上,Linux MTD層不會對NAND/NOR內存進行任何維護。

例如,當你的NAND發生bitflip時,它會被ECC糾正。 MTD層意識到這一點,但它沒有做任何事情。它只是返回錯誤。

因此,您需要MTD上的另一層來照顧這一點。

一個解決方案是使用UBI,它旨在解決這類問題。看看linux-mtd上的UBI documentation。如果你想堅持使用squashfs,可以在UBI(gluebi)之上添加另一個MTD抽象,然後在其上運行squashfs。結果看起來像這樣:

--------------------- 
|  SquashFS  | 
--------------------- 
|  MTD block  | 
--------------------- 
| MTD API (gluebi) | 
--------------------- 
|  UBI  | 
--------------------- 
|  MTD driver | 
--------------------- 
|  Flash Chip | 
--------------------- 

它使一個可怕的畫面,但它工作得很好;)

看一看this slides from free-electrons更多信息(圖片來自第47頁)。

關於內核,我不確定,但我認爲U-Boot確實支持UBI。從來沒有嘗試過,但...