저는 임베디드 목적으로 Linux 파일 시스템에 저수준 메모리 쓰기 작업을 하고 있습니다. 다음 프로세스를 사용하여 파티션 이미지를 만들었습니다.
- 4GiB 빈 이미지 파일을 생성합니다. 예:
dd if=/dev/null of=example.img bs=1M seek=4096
- 파일 시스템 추가(ext4)
mkfs.ext4 -F example.img
- 로컬 컴퓨터에 설치
mkdir /mnt/example.img
mount -t ext4 -o loop exmaple.img /mnt/exampleimg
- 마운트된 파티션 이미지에 파일 시스템 복사
cp -r rootfs/* /mnt/exampleimg/
- 이미지 제거
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의 부트 로더를 재구성하십시오.
- 리눅스를 종료하세요