대형 ext4 파티션의 작은 이미지를 생성하는 방법은 무엇입니까?

대형 ext4 파티션의 작은 이미지를 생성하는 방법은 무엇입니까?

저는 임베디드 목적으로 Linux 파일 시스템에 저수준 메모리 쓰기 작업을 하고 있습니다. 다음 프로세스를 사용하여 파티션 이미지를 만들었습니다.

  1. 4GiB 빈 이미지 파일을 생성합니다. 예: dd if=/dev/null of=example.img bs=1M seek=4096
  2. 파일 시스템 추가(ext4) mkfs.ext4 -F example.img
  3. 로컬 컴퓨터에 설치 mkdir /mnt/example.img mount -t ext4 -o loop exmaple.img /mnt/exampleimg
  4. 마운트된 파티션 이미지에 파일 시스템 복사 cp -r rootfs/* /mnt/exampleimg/
  5. 이미지 제거 umount /mnt/exampleimg

생성된 이미지를 교체해야 하는 파티션의 첫 번째 섹터에 쓴 후 모든 것이 잘 작동하고 데이터에 액세스할 수 있습니다. 문제는 전체 16GB 파티션을 복사해야 하는데 그 안에 데이터가 2GB만 있다는 것입니다. 시간이 많이 걸립니다.

동일한 데이터로 더 작은 이미지를 생성했는데 작동하지만 파티션 이미지의 고정 크기를 초과할 수 없습니다. 시스템에서는 파티션 크기가 여전히 큰 것으로 확인됩니다(fdisk -l /dev/mmcblok0, 섹터 개수는 /sys/class/block/mmcblkop2/size에 있음). 아마도 파티션 테이블이 아직 변경되지 않았기 때문일 것입니다. 파일 복사가 이미지의 사용 가능한 공간보다 큽니다(파티션의 실제 크기가 아님). cp: write error: No space left on device가 표시됩니다.

대상 Linux에서 사용한 후에는 파티션 크기를 수정할 수 없습니다. 이는 Linux가 실행 중인 루트 파일 시스템의 파티션이기 때문입니다. 불필요한 제한 없이 가짜 크기/이미지를 만들 수 있는 방법이 있습니까? 데이터가 포함된 16GB 파티션의 이미지를 가져오고 싶지만 이미지 크기는 16GB 미만입니다.

답변1

모든 작업을 기존대로 수행합니다(예: 작은 이미지 만들기, 있는 그대로 복사). 하지만 마지막 단계는 다음과 같습니다.

resize2fs -p /dev/mmcblok0

답변2

대상 Linux에서 사용한 후에는 파티션 크기를 수정할 수 없습니다. 이는 Linux가 실행 중인 루트 파일 시스템의 파티션이기 때문입니다.

파일 시스템을 확장하는 경우에는 그렇지 않습니다. 이것resize2fs 매뉴얼설명하다:

파일 시스템이 마운트된 경우 커널이 온라인 크기 조정을 지원한다는 가정 하에 마운트된 파일 시스템의 크기를 확장하는 데 사용할 수 있습니다. (이 글을 쓰는 시점에서 Linux 2.6 커널은 ext3 및 ext4를 사용하여 마운트된 파일 시스템의 온라인 크기 조정을 지원합니다.)

따라서 더 작은 이미지를 만들어 장치에 복사한 다음 resize2fs를 사용하여 파일 시스템을 확장할 수 있습니다.

resize2fs /dev/mmcblok0

사용 중인 하드웨어에 따라 다른 방법이 있습니다. 복잡하므로 기술에 대한 개요를 제공할 수 있지만 이를 사용하는 정확한 단계를 작성하는 것은 생략하겠습니다.

재구성된 부트로더를 사용하여 이미지를 생성하는 기술입니다.
SD 카드에서 직접 실행되도록 설계되었습니다. 부트로더는 Linux를 시작하고 (일반 스크립트 대신 /sbin/init) 스크립트를 직접 실행하라고 지시합니다. 그런 다음 스크립트는 다음과 같습니다.

  • 내부 플래시 메모리 포맷
  • 내부 플래시를 /mnt에 마운트
  • SD 카드의 모든 파일을 /mnt에 복사합니다.
  • 스크립트 대신 /sbin/init를 실행하도록 /mnt/boot의 부트 로더를 재구성하십시오.
  • 리눅스를 종료하세요

관련 정보