저는 임베디드 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 구성에서 UBIFS 크기를 어떻게 계획합니까(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 볼륨 크기를 보다 세밀하게 조정/계획하는 데 유용합니다.