由于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时用到的数据没有被破坏。而直到使用到被破坏数据时才出现这种错误。