私は組み込み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 -a
928個のLEBが使用中としてマークされます。完全な119MBパーティションをすべて使用していますか?
この構成で使用できるLEBの最大数は何ですか?
このNAND構成でUBIBSサイズをどのように計画しますか(PEB 1024、最大不良ブロック20、摩耗レベリングを考慮)。
答え1
読書としてFLASH スペースオーバーヘッドテストしてみたところ、以下のようにubinize.cfgの数値の意味と設定がわかりました。
まず、vol_size
UBIボリュームの実際のデータ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=1
ubinizeを設定すると、自動的に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_size
KiBである可能性があり、これはUBIのボリュームサイズをより細かく調整/計画するのに役立ちます。