.img의 한 파티션을 다른 파티션으로 교체

.img의 한 파티션을 다른 파티션으로 교체

2개의 .img 파일(각각 2개의 파티션(부팅 파티션과 rootfs)이 있는 내장형 Linux 이미지)이 있습니다. 파티션 중 하나의 rootfs 파티션을 다른 파티션으로 교체해야 합니다.

내가 이걸 어떻게 할 수 있지?

  1. .imgs에서 직접
  2. .imgs를 SD 카드에 씁니다.

답변에 명령이 포함되어 있으면 감사하겠습니다.

답변1

먼저 교체해야 하는 파티션이 복사하려는 파티션과 최소한 동일한 크기인지 확인하세요. 이미지 파일이 다음과 같은 경우아니요압축 후에는 사용할 수 있습니다 kpartx.

디스크 이미지 간에 파일 시스템 복사

제대로 작동하려면 LVM2가 필요합니다. Let disk1.imgdisk2.img, 다음 예에서는 두 이미지가 정확히 동일한 크기라고 가정합니다.

# Let device mapper detect partitions on disk images
kpartx -a disk1.img
kpartx -a disk2.img

# Unmount source and destination file systems
umount /dev/mapper/loop?p?

# Copy source file system to destination
dd if=/dev/loop1p2 of=/dev/loop0p2 bs=512
# or:
# cat dev/loop1p2 > /dev/loop0p2

# Remove device nodes
kpartx -d disk1.img
kpartx -d disk2.img

소스 파일 시스템이 더 작은 경우 /dev/mapper/loop0p2사용해야 합니다 resize2fs.목적지파일 시스템이 더 작은 경우 소스 파일 시스템을 축소해야 합니다.치수가 완전 똑같네요대상이 선택한 파티셔닝 도구를 사용하고 있기 때문입니다. 나는 추천할 것이다 fdisk.

편집하다: SD 카드가 감지되면 (예를 들어 대상이 SD 카드의 두 번째 파티션이라고 가정) SD 카드의 두 번째 파티션 /dev/mmcblk0에 파일 시스템을 복사하기만 하면 됩니다 (예를 들어) ./dev/mapper/loop0p2/dev/mmcblk0p2

편집하다: 대상 파일 시스템이 더 작은 경우 소스 파일 시스템을 대상 파티션에 맞게 축소해야 합니다.

소스 파일 시스템 축소

루프 장치가 추가되었다고 가정 kpartx -a하고설치되지 않음:

# Check file systems block count and size
tune2fs -l /dev/mapper/loop0p2 | grep -E 'Block (count|size)'
tune2fs -l /dev/mapper/loop1p2 | grep -E 'Block (count|size)'

# Shrink source file system to fit the destination
# (FS check is mandatory before shrinking)
fsck -f /dev/mapper/loop1p2
resize2fs /dev/mapper/loop1p2 <loop0p2 block count>

# Proceed with file system copy...

resize2fs요청된 크기를 충족할 만큼 청크가 충분하지 않으면 실패합니다(비록 저는 이런 일을 겪은 적이 없습니다). 블록 크기가 다른 경우 새 파일 시스템 크기를 전달할 때 결과를 곱하고 <block count>추가 할 수 있습니다 .<block size>B

# Example: 123456 blocks, 4096 bytes per block
resize2fs /dev/mapper/loop1p2 $((123456*4096))B

소스 파일 시스템을 최소 크기로 축소한 다음 계산 없이 대상 파일 시스템을 해당 파티션에 맞게 확장하도록 선택할 수 있습니다.

resize2fs -M /dev/mapper/loop1p2
# Do the copy ...
resize2fs /dev/mapper/loop0p2

작업이 불가능한 경우에만 실패합니다.

원본 파티션의 크기가 아직 조정되지 않았기 때문에 복사 작업이 끝나면 오류가 발생할 가능성이 높습니다. 커널은 할당된 대상 파티션의 끝을 지나서 쓰기를 허용하지 않기 때문에 일반적으로 아무런 해를 끼치지 않습니다.

dd매우 주의해서 대상 파티션 크기에 복사되는 데이터 양에 대한 제한을 사용하는 것이 좋습니다 (블록 크기 bs및 "개수" 참고). 당신은 이미 교육받은 추측을 하는 데 필요한 모든 것을 갖추고 있으므로 명령과 인수는 당신에게 맡기겠습니다 ;-).

관련 정보