I'm trying to use a compressed squashfs ubi volume as my root file system. The idea is to have two ubi volumes. Volume one contains a read-only squashfs file system. Volume two is re-sizable and uses the remaining flash space. It contains a writable ubifs file system. These two ubi volumes are to be overlayed using overlayfs after booting so that I have a writable file system with the ability to restore to factory state by formatting the second (ubifs) volume.
I know squashfs works only on block devices, so I'm using gluebi driver to emulate them on top of ubi volumes (this creates mtdx and mtdblockx for each ubi volume):
CONFIG_SQUASHFS=y CONFIG_SQUASHFS_LZO=y CONFIG_MTD=y CONFIG_MTD_BLOCK=y CONFIG_MTD_UBI=y CONFIG_MTD_UBI_GLUEBI=y CONFIG_UBIFS_FS=y
Here's my ubinize.conf file to create the ubi image:
[rom] mode=ubi image=rootfs.squashfs-lzo vol_id=0 vol_type=static vol_name=ubi_vol_rom [overlay] mode=ubi vol_id=1 vol_type=dynamic vol_name=ubi_vol_overlay vol_size=1KiB vol_flags=autoresize
I'm using these MTD partitions for testing:
mtd18: 03a00000 00040000 "sys_back" mtd19: 058c0000 00040000 "system"
I flashed the ubi image to mtd18 (
sys_back), attached it to ubi, mounted the resulting mtdblock and everything worked as intended, so I presume my ubi volume and squashfs file system are correct.
# ubiattach -m 18 # mount /dev/mtdblock23 /mnt/ # mount /dev/mtdblock23 on /mnt type squashfs (ro,relatime)
So, I wanted to try the final configuration. I flashed the ubi image to mtd19 (
system) and modified my kernel parameters to contain this:
ubi.mtd=system root=mtd:ubi_vol_rom rootfstype=squashfs
However, mounting the root file system failed:
[ 3.334908] ubi0: attaching mtd19 [ 3.725841] ubi0: scanning is finished [ 3.751239] gluebi (pid 1): gluebi_resized: got update notification for unknown UBI device 0 volume 1 [ 3.759465] ubi0: volume 1 ("ubi_vol_overlay") re-sized from 1 to 203 LEBs [ 3.767111] ubi0: attached mtd19 (name "system", size 88 MiB) [ 3.772007] ubi0: PEB size: 262144 bytes (256 KiB), LEB size: 253952 bytes [ 3.778938] ubi0: min./max. I/O unit sizes: 4096/4096, sub-page size 4096 [ 3.785670] ubi0: VID header offset: 4096 (aligned 4096), data offset: 8192 [ 3.792583] ubi0: good PEBs: 355, bad PEBs: 0, corrupted PEBs: 0 [ 3.798604] ubi0: user volume: 2, internal volumes: 1, max. volumes count: 128 [ 3.805807] ubi0: max/mean erase counter: 3/1, WL threshold: 4096, image sequence number: 1328192 [ 3.814929] ubi0: available PEBs: 0, total reserved PEBs: 355, PEBs reserved for bad PEB handling: 40 [ 3.823843] ubi0: background thread "ubi_bgt0d" started, PID 148 [ 4.639909] UBIFS error (pid: 1): cannot open "mtd:ubi_vol_rom", error -22 List of all partitions: [ 4.647770] 1f00 2560 mtdblock0 (driver?) [ 4.652783] 1f01 2560 mtdblock1 (driver?) [ 4.657822] 1f02 22528 mtdblock2 (driver?) [ 4.662851] 1f03 5120 mtdblock3 (driver?) [ 4.667886] 1f04 3072 mtdblock4 (driver?) [ 4.672925] 1f05 1280 mtdblock5 (driver?) [ 4.677956] 1f06 1536 mtdblock6 (driver?) [ 4.682994] 1f07 1280 mtdblock7 (driver?) [ 4.688030] 1f08 9216 mtdblock8 (driver?) [ 4.693059] 1f09 9216 mtdblock9 (driver?) [ 4.698094] 1f0a 6400 mtdblock10 (driver?) [ 4.703214] 1f0b 14336 mtdblock11 (driver?) [ 4.708339] 1f0c 16896 mtdblock12 (driver?) [ 4.713458] 1f0d 61440 mtdblock13 (driver?) [ 4.718582] 1f0e 1280 mtdblock14 (driver?) [ 4.723701] 1f0f 30720 mtdblock15 (driver?) [ 4.728826] 1f10 57344 mtdblock16 (driver?) [ 4.733945] 1f11 127232 mtdblock17 (driver?) [ 4.739069] 1f12 59392 mtdblock18 (driver?) [ 4.744228] 1f13 90880 mtdblock19 (driver?) [ 4.749313] 1f14 26676 mtdblock20 (driver?) [ 4.754471] 1f15 50344 mtdblock21 (driver?) [ 4.759552] No filesystem could mount root, tried: ubifs [ 4.764942] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) [ 5.837944] Rebooting in 5 seconds..
So from the log I can tell that ubi attached to mtd19 as expected, resized the second partition (
ubi_vol_overlay), created two mtd partitions from the ubi volumes
mtd21), and created two block devices on top of these (
However, mounting the squashfs filesystem (
mtdblock20) failed. The log says it tried mounting with as ubifs even though I explicitly said to use squashfs via the
At first I thought that maybe the name of the device wasn't resolving correctly in the
root= parameter, so I've tried using
/dev/mtdblock20 but it resulted in the same.
How can I force the kernel to mount it with squashfs instead of ubifs?