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