ubi 위에 squashfs를 루트 파일 시스템으로 사용

ubi 위에 squashfs를 루트 파일 시스템으로 사용

압축된 squashfs ubi 볼륨을 루트 파일 시스템으로 사용하려고 합니다. 아이디어는 두 개의 ubi 볼륨을 갖는 것입니다. 첫 번째 볼륨에는 읽기 전용 squashfs 파일 시스템이 포함되어 있습니다. 두 번째 볼륨의 크기를 조정하고 남은 플래시 공간을 사용할 수 있습니다. 여기에는 쓰기 가능한 ubifs 파일 시스템이 포함되어 있습니다. 두 개의 ubi 볼륨은 부팅 후 overridefs로 덮어쓰기되어 두 번째(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에 연결되고 두 번째 파티션( ubi_vol_overlay)의 크기를 조정하고 ubi 볼륨 (mtd20및 ) 에서 두 개의 mtd 파티션을 생성하고 mtd21이 위에 두 개를 더 생성한 것을 볼 수 있습니다(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 볼륨을 사용하고 시뮬레이션된 블록 장치를 생성합니다. 그런 다음 이를 사용하여 루트를 마운트할 수 있습니다.

관련 정보