嵌入系統squashfs掛載常見問題總結


由於squahsfs的一些優點,嵌入系統常常直接使用squashfs作為initrd掛載到/dev/ram,作為rootfs。這里對常見的一些問題進行一些分析。

1. kernel啟動出現錯誤

RAMDISK: Couldn't find valid RAM disk image starting at 0.

kernel沒有找到文件系統,不能mount到/dev/ram。這不管是squanshfs,還是其他的文件系統作為rootfs,都可能出現。一般原因是bootloader指定載入rootfs的內存地址和kernel的命令行initrd參數指定的內存地址不符。這樣kernel找不到superblock,報出這樣的錯誤。

 

2. kernel已經找到文件系統,但在掛載是出現錯誤

squashfs: SQUASHFS error: unable to read xattr id index table

一個squashfs文件系統最多由九個部分組成,按字節對齊方式組合。如下所示:

  ---------------
 |  superblock  |
 |---------------|
 |  compression  |
 |    options    |
 |---------------|
 |  datablocks   |
 |  & fragments  |
 |---------------|
 |  inode table |
 |---------------|
 |   directory |
 |     table     |
 |---------------|
 |   fragment |
 |    table      |
 |---------------|
 |    export     |
 |    table      |
 |---------------|
 |    uid/gid |
 |  lookup table |
 |---------------|
 |     xattr     |
 |     table |
  ---------------

可以看到xattr(擴展屬性)表處於整個文件系統的最末尾。出現錯誤無法讀取擴展屬性表一般是因為載入的initrd不完整。可能由於bootloader的load指令引起。比如load指令的-max參數不對,或者-max參數有缺省值,缺省值不夠大。如果不顯式指定的話,可能導致讀入的文件不完整。所以最好指定,比如

load -raw -nz -addr=0x00680000 -max=100000000 usbdisk0:rootfs.squashfs

再一個也有可能是kernel的initrd的大小參數不正確。第一個參數指定initrd在內存中的起始地址,第二個參數指定initrd的大小,比如

initrd=0x00680000,100000000

 

3. 掛載時出現

SQUASHFS error: zlib decompression failed, data probably corrupt
SQUASHFS error: squashfs_read_data failed to read block 0x97eb83
SQUASHFS error: Unable to read fragment cache entry [97eb83]

根據squashfs使用的壓縮方法不用,這里可能出現zlib,xz或者其他的壓縮方式解壓縮失敗。出現這種錯誤一般是因為文件系統數據被破壞了。有可能是因為保存squashfs的介質,比如flash損壞了,自然載入的數據不正確。還有一種情況是,bootloader用load命令把squashfs載入內存時選擇的地址不對。squashfs文件系統載入的內存不能和bootloader自身使用的內存地址范圍有交叉。還有后面載入內核,以及其他一些操作,比如載入dtb,都有可覆蓋squashfs載入的數據導致出現類似的錯誤。有時候這種錯誤很隱蔽,系統啟動掛載時不出現任何錯誤,而在系統運行中某個時候才出現。因為你不知道squashfs哪一部分數據被破壞,很可能mount時用到的數據沒有被破壞。而直到使用到被破壞數據時才出現這種錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM