ルートファイルシステムとして、圧縮されたsquashfs ubiボリュームを使用しようとしています。アイデアは、2つのubiボリュームを持つことです。第1巻には、読み取り専用のsquashfsファイルシステムが含まれています。ボリューム2はサイズ変更可能で、残りのフラッシュスペースを使用します。書き込み可能なubifsファイルシステムが含まれています。これらの2つのubiボリュームは、起動後にoverlayfsを使用してオーバーレイされるため、2番目の(ubifs)ボリュームをフォーマットすることで工場出荷時の状態に復元できる書き込み可能なファイルシステムがあります。
Squashfsはブロックデバイスでのみ機能することを知っているので、gluebiドライバーを使用してubiボリューム上でそれらをエミュレートしています(これにより、ubiボリュームごとにmtdxとmtdblockxが作成されます):
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
これが、ubiイメージを作成するためのubinize.confファイルです。
[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
これらのMTDパーティションをテストに使用しています。
mtd18: 03a00000 00040000 "sys_back"
mtd19: 058c0000 00040000 "system"
Ubiイメージをmtd18(sys_back
)にフラッシュし、ubiにアタッチし、結果のmtdblockをマウントし、すべてが意図したとおりに機能したので、ubiボリュームとsquashfsファイルシステムは正しいと思います。
# ubiattach -m 18
# mount /dev/mtdblock23 /mnt/
# mount
/dev/mtdblock23 on /mnt type squashfs (ro,relatime)
そこで、最終的な構成を試してみたかったのです。 ubiイメージをmtd19(system
)にフラッシュし、カーネルパラメーターを変更してこれを含めました。
ubi.mtd=system root=mtd:ubi_vol_rom rootfstype=squashfs
ただし、ルートファイルシステムのマウントは失敗しました。
[ 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..
したがって、ログから、ubiがmtd19に期待どおりに接続され、2番目のパーティション(ubi_vol_overlay
)のサイズを変更し、ubiボリュームから2つのmtdパーティションを作成し、(mtd20
とmtd21
)、これらの上に2つのブロックデバイス(mtdblock20
とmtdblock21
)があります。
ただし、squashfsファイルシステム(mtdblock20
)のマウントに失敗しました。ログには、rootfstype
引数を介してsquashfsを明示的に使用するように言ったにもかかわらず、ubifsとしてマウントしようとしたことが示されています.
最初は、デバイスの名前がroot=
パラメータで正しく解決されていないと思ったので、/dev/mtdblock20
を使用してみましたが、結果は同じでした。
カーネルにubifsではなくsquashfsでマウントするように強制するにはどうすればよいですか?
Squashfsを実行するにはブロックデバイスが必要なので、UBIを介したブロックエミュレーションが必要です。まず、カーネルで有効になっていることを確認してください。
これは、実行中のシステムでubiblockコマンドを使用してテストできます。たとえば、ubiblock -c /dev/ubi0_0
を実行すると、devnode/dev/ubiblock0_0が作成されます。
依存関係を取得したら、次のようにコマンドラインでUBIブロックを有効にできます。
ubi.mtd=2 ubi.block=0,ubi_vol_rom root=/dev/ubiblock0_0
これにより、ubi_vol_romという名前のUBIボリュームが使用され、エミュレートされたブロックデバイスが作成されます。次に、それを使用してルートをマウントできます。