由於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時用到的數據沒有被破壞。而直到使用到被破壞數據時才出現這種錯誤。