ubifs根檔案系統掛載失敗可能原因

坚持梦想的蜗牛發表於2024-05-03

ubifs作為根檔案系統掛載時,遇到了一些不同型別的錯誤,整理一下問題的排查思路

UBIFS (ubi0:0): Mounting in unauthenticated mode
UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 1054
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 error: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read 126976 bytes

(1)首先檢查linux核心讀寫nand是否正常
主要是檢查linux核心的裝置樹、menuconfig裡的nand設定是否正確。
要注意一點,能啟動linux並不代表配置正確,因為uboot能正常讀寫nand就能啟動linux核心。

有一個很好的驗證方式,那就是換個檔案系統(比如yaffs2、jffs)能正常讀寫nand,
那就說明linux核心的nand設定沒有問題

(2)mkfs時,檢查LEB設定是否正常,一般比PEB小兩個頁大小

(3)如果出現了第一次能掛載,但重啟第二次掛載就失敗,多半原因是mkfs時沒有加-F引數,
具體原因google一搜便知,參考連結:
http://www.linux-mtd.infradead.org/faq/ubifs.html#L_free_space_fixup

(4)mkfs時,-c引數可以寫大一點,不用糾結怎麼計算,第一次ubi掛載後會自動計算

參考程式碼如下(頁大小2KB,塊大小128KB,總容量128MB):

> mkfs.ubifs -d rootfs -e 0x1f000 -c 2047 -m 0x800 -x none -F -o rootfs.ubifs

(5)ubinize時,若nand沒有subpage,-s引數要寫與頁大小一樣的值(或者乾脆不填)
參考如下:

ubinize -o rootfs.img -m 0x800 -p 0x20000  ubinize.cfg

(6)uibinize時,其config檔案不用填vol_size欄位, vol_flags設為autoresize即可,
不用計算,非常方便。ubinize.cfg檔案內容參考如下:

[ubifs]
mode=ubi
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_alignment=1
vol_flags=autoresize
image=rootfs.ubifs

(7)如果還是有問題,可以先用其它檔案系統把linux啟動起來,然後再使用mtd-utils
對nand進行ubiformat、ubiattach,mount進逐步排查,檢查的參考步驟如下:
(一定要確保以下每一步驟均無錯誤)

> flash_erase /dev/mtd4 0 0
> ubiformat /dev/mtd4 -f rootfs.img
> ubiattach -p /dev/mtd4
> mount -t ubifs /dev/ubi0_0 /mnt
> cp /bin /mnt/ -r
> ls /mnt
> rm /mnt/* -r

如果這些步驟都沒問題,且正常掛載、正常讀寫多個較大的檔案(一定要檢查能正常讀寫),說明生成的ubi映象沒有問題,
那原因就只有兩個:

  • 燒寫工具有問題,燒寫壞塊處理不當
  • mkfs時沒有加-F引數。

相關文章