MTDの残りのスペースを活用するためにUBIFSイメージを構築する方法は?

MTDの残りのスペースを活用するためにUBIFSイメージを構築する方法は?

私は組み込みLinuxシステム(kernel-5.24)を開発していますが、開発ホストはWindows上でWSL2を実行しています。

組み込みシステムには128MB NAND FLASHがあります(PEBは128KiB、ページサイズは4096バイト、1024個のPEBがあります)。 ubinizeを使用して最後のMTDパーティションで、サイズ0x7700000(119MiB)のMTD2にUBIFSボリュームを作成しようとしています。

これは私が使っているubinize.cfgです。

[ubifs]
mode=ubi
image=ubifs.rootfs
vol_id=0
vol_size=119MiB
vol_type=dynamic
vol_alignment=1
vol_name=rootfs
vol_flags=autoresize

コマンドは次のとおりです。

ubinize -m 2048 -p 128KiB -s 512 -O 2048 ./ubinize.cfg -v -o ubi.img

その後、生成されたubi.imgを展開しましたが、システムの起動時に次のエラーが発生しました。

[    2.138286] ubi0: attaching mtd2
[    2.315180] ubi0: scanning is finished
[    2.322753] ubi0 error: vtbl_check: too large reserved_pebs 983, good PEBs 952
[    2.330258] ubi0 error: vtbl_check: volume table check failed: record 0, error 9
[    2.337904] Volume table record 0 dump:
[    2.341878]  reserved_pebs   983
[    2.345202]  alignment       1
[    2.348354]  data_pad        0
[    2.351515]  vol_type        1
[    2.354663]  upd_marker      0
[    2.357812]  name_len        6
[    2.360976]  name            rootfs
[    2.364572]  crc             0xd6e9ec58
[    2.368727] ubi0 error: ubi_attach_mtd_dev: failed to attach mtd2, error -22
[    2.376054] UBI error: cannot attach mtd2

そのため、オンラインで確認してみると、完全なMTD2パーティションを活用するために、次のようvol_sizeな設定をせずにubinize.cfgを修正したことがわかりました。

[ubifs]
mode=ubi
image=system.ubifs
vol_id=0
vol_type=dynamic
vol_alignment=1
vol_name=rootfs
vol_flags=autoresize

これにより、カーネルが起動し、rootfsが正しくマウントされ、ubinfo次のようになります。

# ubinfo -a
UBI version:                    1
Count of UBI devices:           1
UBI control device major/minor: 10:63
Present UBI devices:            ubi0

ubi0
Volumes count:                           1
Logical eraseblock size:                 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks:     952 (120881152 bytes, 115.2 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  20
Current maximum erase counter value:     2
Minimum input/output unit size:          2048 bytes
Character device major/minor:            248:0
Present volumes:                         0

Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        928 LEBs (117833728 bytes, 112.3 MiB)
State:       OK
Name:        rootfs
Character device major/minor: 248:1

次の問題があります。合計952個のLEBがありますが、ubinfo -a928個のLEBが使用中としてマークされます。完全な119MBパーティションをすべて使用していますか?
この構成で使用できるLEBの最大数は何ですか?
このNAND構成でUBIBSサイズをどのように計画しますか(PEB 1024、最大不良ブロック20、摩耗レベリングを考慮)。

答え1

読書としてFLASH スペースオーバーヘッドテストしてみたところ、以下のようにubinize.cfgの数値の意味と設定がわかりました。

まず、vol_sizeUBIボリュームの実際のデータLEBサイズをubinize.cfgで指定します。 4つのPEB(LEB)のオーバーヘッドは計算されません。したがって、vol_size=119MiBデータLEBのサイズを超えるため、仕様が正しくありません。

私の場合には合計952個のPEBが残っているrootfsが、そのうち20個のPEBは不良ブロック用に予約されており、4個のPEBはオーバーヘッド用なので実際のデータブロック(LEB)用に残ったPEBは928個だけなので実際のサイズは928*126976=117833728、の結果と一致しますubinfo -a

次に、autoresize=1ubinizeを設定すると、自動的にUBIボリュームのサイズが変更さvol_size=106MiBれ、上記のサイズ(928 LEB)が得られます。そうでない場合、autoresize=1結果は以下のようになり、上記とは異なります。

# ubinfo -a
UBI version:                    1
Count of UBI devices:           1
UBI control device major/minor: 10:63
Present UBI devices:            ubi0

ubi0
Volumes count:                           1
Logical eraseblock size:                 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks:     952 (120881152 bytes, 115.2 MiB)
Amount of available logical eraseblocks: 52 (6602752 bytes, 6.2 MiB)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  20
Current maximum erase counter value:     2
Minimum input/output unit size:          2048 bytes
Character device major/minor:            248:0
Present volumes:                         0

Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        876 LEBs (111230976 bytes, 106.0 MiB)
State:       OK

106MiBは876個のLEBで構成され、これは上記の計算と一致します。

最後に、単位はvol_sizeKiBである可能性があり、これはUBIのボリュームサイズをより細かく調整/計画するのに役立ちます。

関連情報