ubiの上にsquashfsをルートファイルシステムとして使用する

ubiの上にsquashfsをルートファイルシステムとして使用する

圧縮されたsquashfs ubiボリュームをルートファイルシステムとして使用しようとしています。アイデアは2つのubiボリュームを持つことです。最初のボリュームには読み取り専用の squashfs ファイルシステムが含まれています。 2番目のボリュームのサイズを変更し、残りのフラッシュスペースを使用できます。これには、書き込み可能なubifsファイルシステムが含まれています。 2 つの ubi ボリュームはブート後に overridefs で上書きされ、2 番目の (ubifs) ボリュームをフォーマットして工場出荷時の状態に復元できる書き込み可能なファイルシステムを持ちます。

私はsquashfsがブロックデバイスでのみ動作することを知っているので、Glubiドライバを使用して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ボリューム(mtd20と)に2つのmtdパーティションを作成し、mtd21その上にさらに2つを作成したことがわかります(Aブロックデバイス、素晴らしいです。mtdblock20mtdblock21

ただし、squashfsファイルシステム(mtdblock20)のマウントは失敗します。引数を介してsquashfsを使用するように明示的に言ったにもかかわらず、ログにはubifsを使用してインストールしようとしていることが示されていますrootfstype

最初は、パラメータのデバイス名が正しく解析されない可能性があると考えてみましたroot=/dev/mtdblock20、結果は同じでした。

カーネルがubifの代わりにsquashfsを使用してマウントするように強制する方法は?

ベストアンサー1

Squashfsを実行するにはブロックデバイスが必要なため、UBIを介したブロックエミュレーションが必要です。まず、カーネルで有効になっていることを確認してください。

実行中のシステムでubiblockコマンドを使用してそれをテストできます。たとえば、実行するとubiblock -c /dev/ubi0_0devnode /dev/ubiblock0_0 が生成されます。

依存関係がある場合は、次のようにコマンドラインでUBIブロックを有効にできます。

ubi.mtd=2 ubi.block=0,ubi_vol_rom root=/dev/ubiblock0_0

ubi_vol_romという名前のUBIボリュームを使用し、シミュレートされたブロックデバイスを作成します。その後、それを使用してルートをマウントできます。

おすすめ記事