작은 ubif 볼륨을 생성할 때 오버헤드가 놀라울 정도로 높음

작은 ubif 볼륨을 생성할 때 오버헤드가 놀라울 정도로 높음

39개의 삭제 블록(= 4.9MiB)이 있는 mtd 파티션에서 ubif 포맷을 시도했습니다. 예약된 블록이 가능한 가장 작은 블록 1로 줄어들면(이것은 좋지 않다는 것을 알고 있습니다) 결과 파일 시스템에는 압축되지 않은 데이터를 위한 2.2M의 여유 공간이 있습니다. 이는 공간의 45%만 데이터에 사용할 수 있음을 의미합니다.

jffs2로 포맷된 동일한 영역을 사용하면 4.6MB의 데이터를 쓸 수 있었는데, 이는 ubifs 설정 크기의 93% 이상입니다.

문제는 64바이트 OOB 크기가 다음과 같은 BCH8 및 JFFS2 OBB 데이터에 충분한 공간을 제공하지 않기 때문에 jffs2를 사용할 수 없다는 것입니다.TI 경고.

FAQ 장을 읽었습니다. 내 UBIFS 볼륨의 용량이 동급 JFFS2 볼륨보다 훨씬 적은 이유는 무엇입니까? 그리고 df가 여유 공간을 너무 적게 보고하는 이유는 무엇입니까? 하지만 아직도 그 비용이 얼마나 되는지 믿을 수 없습니다.

(쓰기 가능한) ubifs 볼륨에서 사용 가능한 공간을 늘리기 위해 할 수 있는 일이 있나요?

ubi0과 ubi1을 병합하면 공간이 절약되나요? (예약된 블록보다 더 많은가요?)

이것은 내 설정입니다.

$ mtdinfo -a

mtd10
Name:                           NAND.userdata
Type:                           nand
Eraseblock size:                131072 bytes, 128.0 KiB
Amount of eraseblocks:          39 (5111808 bytes, 4.9 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size:                  512 bytes
OOB size:                       64 bytes
Character device major/minor:   90:20
Bad blocks are allowed:         true
Device is writable:             true

$ ubinfo -a

ubi1
Volumes count:                           1
Logical eraseblock size:                 129024 bytes, 126.0 KiB
Total amount of logical eraseblocks:     39 (5031936 bytes, 4.8 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:  1
Current maximum erase counter value:     2
Minimum input/output unit size:          2048 bytes
Character device major/minor:            249:0
Present volumes:                         0

Volume ID:   0 (on ubi1)
Type:        dynamic
Alignment:   1
Size:        34 LEBs (4386816 bytes, 4.2 MiB)
State:       OK
Name:        userdata
Character device major/minor: 249:1

dmesg:
[    1.340937] nand: device found, Manufacturer ID: 0x2c, Chip ID: 0xf1
[    1.347903] nand: Micron MT29F1G08ABADAH4
[    1.352108] nand: 128 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
[    1.359782] nand: using OMAP_ECC_BCH8_CODE_HW ECC scheme

uname -a:
Linux 4.1.18-g543c284-dirty #3 PREEMPT Mon Jun 27 17:02:46 CEST 2016 armv7l GNU/Linux

ubif 생성 및 테스트:

# flash_erase /dev/mtd10 0 0
Erasing 128 Kibyte @ 4c0000 -- 100 % complete 
# ubiformat /dev/mtd10 -s 512 -O 512
ubiformat: mtd10 (nand), size 5111808 bytes (4.9 MiB), 39 eraseblocks of 131072 bytes (128.0 KiB), min. I/O size 2048 bytes
libscan: scanning eraseblock 38 -- 100 % complete  
ubiformat: 39 eraseblocks are supposedly empty
ubiformat: formatting eraseblock 38 -- 100 % complete  
# ubiattach -d1 -m10 -b 1
UBI device number 1, total 39 LEBs (5031936 bytes, 4.8 MiB), available 34 LEBs (4386816 bytes, 4.2 MiB), LEB size 129024 bytes (126.0 KiB)
# ubimkvol /dev/ubi1 -N userdata -m
Set volume size to 4386816
Volume ID 0, size 34 LEBs (4386816 bytes, 4.2 MiB), LEB size 129024 bytes (126.0 KiB), dynamic, name "userdata", alignment 1
# mount -t ubifs ubi1:userdata /tmp/1
# df -h /tmp/1
Filesystem      Size  Used Avail Use% Mounted on
-               2.1M   20K  2.0M   2% /tmp/1
# dd if=/dev/urandom of=/tmp/1/bigfile bs=4096
dd: error writing '/tmp/1/bigfile': No space left on device
550+0 records in
549+0 records out
2248704 bytes (2.2 MB) copied, 1.66865 s, 1.3 MB/s
# ls -l /tmp/1/bigfile
-rw-r--r-- 1 root root 2248704 Jan  1 00:07 /tmp/1/bigfile
# sync
# df -h /tmp/1
Filesystem      Size  Used Avail Use% Mounted on
-               2.1M  2.1M     0 100% /tmp/1

jffs2를 생성하고 테스트합니다:

# mkdir /tmp/empty.d
# mkfs.jffs2 -s 2048 -r /tmp/empty.d -o /tmp/empty.jffs2
# flash_erase /dev/mtd10 0 0
Erasing 128 Kibyte @ 4c0000 -- 100 % complete 
# nandwrite /dev/mtd10 /tmp/empty.jffs2
Writing data to block 0 at offset 0x0
# mount -t jffs2 /dev/mtdblock10 /tmp/1
# df -h /tmp/1
Filesystem      Size  Used Avail Use% Mounted on
-               4.9M  384K  4.5M   8% /tmp/1
# dd if=/dev/urandom of=/tmp/1/bigfile bs=4096
dd: error writing '/tmp/1/bigfile': No space left on device
1129+0 records in
1128+0 records out
4620288 bytes (4.6 MB) copied, 4.54715 s, 1.0 MB/s
# ls -l /tmp/1/bigfile
-rw-r--r-- 1 root root 4620288 Jan  1 00:20 /tmp/1/bigfile
# sync
# df -h /tmp/1
Filesystem      Size  Used Avail Use% Mounted on
-               4.9M  4.9M     0 100% /tmp/1

고쳐 쓰다:

몇 가지 품질 측정을 수행한 결과 아래 그래프가 나타났습니다. 여기에 이미지 설명을 입력하세요.

이제 내 질문을 좀 더 구체적으로 설명할 수 있습니다.

이 "공식"은 다음과 같습니다.usable_size_mb = (raw_size_mb - 2.3831) * 0.89423077

즉, 내 mtd가 아무리 크더라도 볼륨이 아무리 크더라도 항상 2.38MB를 잃습니다.이는 19개의 삭제 블록 크기입니다.. 나머지는 사용자 데이터에 대한 10.6% 파일 시스템 오버헤드인데, 이는 높은 값이지만 ubif의 경우 예상치 못한 것은 아닙니다.

그런데. 테스트하는 동안 최소 17개의 삭제 블록(= 2.176MB)이 필요하다는 커널 경고가 표시됩니다. 그러나 테스트를 성공적으로 통과한 가장 작은 mtd는 22블록(2.816MB)이었습니다.

답변1

숫자가 일치하지 않는 이유

"최소 17개 지우기 블록" 경고는 UBIFS 파일 시스템 자체에 필요한 블록 수를 계산합니다. 17개 삭제 블록 중 14개는 UBIFS 오버헤드이고 3개는 여유 파일 시스템 공간입니다. 아래의 기본 UBI 레이어도 5개의 삭제 블록의 오버헤드를 사용합니다.

더 많은 공간을 확보하세요

단일 UBI 파티션과 단일 UBIFS 파일 시스템이 더 적은 오버헤드를 사용하도록 만들 수 있는 방법은 없습니다.

그러나 동일한 MTD 장치에 여러 개의 UBI 파티션이 있는 경우 병합하는 것이 좋습니다. UBI는 필요에 따라 물리적 삭제 블록을 논리적 삭제 블록에 매핑할 수 있는 더 많은 옵션을 갖게 되므로 5개의 삭제 블록을 확보할 수 있을 뿐만 아니라 마모 평준화 및 불량 블록 처리도 향상됩니다.

(오버헤드를 무시하고 각각 두 개의 블록이 있는 두 개의 파티션을 상상해 보십시오. 그 중 하나는 불량입니다. 이제 파티션에는 블록이 하나만 남아 있고 웨어 레벨링이 불가능합니다. 하지만 두 개를 병합하면 좋은 세 개가 남습니다. 필요에 따라 두 파일 시스템 간에 공유할 블록).

두 개의 인접한 UBI 파티션을 병합합니다.

  • MTD 파티션 테이블을 업데이트하여 두 개의 파티션을 하나의 더 큰 파티션으로 바꾸세요.
  • ubiformat큰 파티션에서 실행하세요.
  • 를 사용하거나 수동으로 지정하여 ubimkvol적절한 파티션 이름과 크기를 제공하여 두 번 실행합니다 .-s-S

UBI+UBIFS 간접비 회계

첫째, UBI 레이어는 5개의 삭제 블록 오버헤드를 차지합니다.

  • 2는 볼륨 테이블입니다.
  • 1개는 웨어 레벨링 알고리즘용으로 예약되어 있습니다.
  • 1 논리적 삭제 블록의 안정적인 내부 업데이트를 허용하는 "Atomic LEB Change" 기능용으로 예약됨
  • 1(이상적으로는 그 이상)은 잘못된 물리적 삭제 블록을 처리하기 위해 예약되어 있습니다.

다음으로, UBIFS 레이어에는 파일 시스템 메타데이터에 대한 최소 삭제 블록 수가 있습니다.

  • 1은 볼륨을 유효한 UBIFS로 식별하고 파일 시스템 매개변수를 저장하는 파일 시스템 슈퍼블록을 나타냅니다.
  • 2는 마스터 노드 영역(중복 복사본)이며 파일 시스템 조회에 사용되는 트리의 루트입니다.
  • 로그 영역은 2개 이상(여유 공간으로 계산)
  • 2는 각 논리적 삭제 블록이 사용되는 방식을 추적하는 LEB 속성 트리입니다.
  • 고아 영역의 경우 1개 이상(불순한 제거 후 적절하게 정리할 수 있도록 삭제된 파일을 추적하는 데 사용됨)
  • 8 파일 시스템 메타데이터용으로 예약됨(가비지 수집, 삭제, 새싹, 색인)
  • 로그에 없는 커밋된 데이터(여유 공간)에 대해 1개 이상.

인용하다

UBI 오버헤드의 경우 linux-mtd 사이트에는간단한 설명.

UBIFS 오버헤드를 위해 더 많은 발굴 작업을 수행해야 합니다. 이것mtd-utils의 소스 코드삭제 블록의 절대 최소 개수를 계산하고 각 블록의 목적을 언급합니다. 그 의미를 이해하기 위해서는,UBIFS 백서굉장히 유용하다.

관련 정보