dd로 만든 img 파일의 크기를 조정하는 방법은 무엇입니까? 두 파티션은 약 800MB

두 개의 파티션이있는 4GB SD 카드의 DD 이미지가 있는데이 두 파티션은 약 800MB 만 사용하므로 이미지 크기를 줄이려고합니다.

누구든지 img 파일에서 “여유 공간”을 제거하는 방법을 알고 있습니까?



답변

먼저 여유 공간이 실제로 비어 있고 삭제 된 파일이 남아 있지 않은지 확인하십시오. 이 작업을 수행하는 가장 쉬운 방법은 디스크에 널 바이트 만 포함 된 큰 파일을 만든 다음 삭제하는 것입니다.

# losetup --find --partscan foo.img
# lsblk
NAME      MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
loop0       7:0    0   4096M  0 loop
├─loop0p1 259:0    0   2048M  0 loop
└─loop0p2 259:1    0   2048M  0 loop
# for part in /dev/loop0p*; do
    mount $part /mnt
    dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
    rm /mnt/filler
    umount /mnt
  done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0

그런 다음 gzip또는 과 같은 도구로 압축하십시오 xz. 가장 낮은 압축 수준에서도 긴 일련의 0은 잘 압축됩니다.

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

이미지를 디스크에 다시 쓸 때는 압축을 풀어야합니다. 이렇게하면 ‘실시간’압축이 풀립니다.

# cat foo.img.gz | gunzip | dd of=/dev/sda

출력 장치 (sda) 원본 이미지 에 맞도록 충분한 크기 여야합니다 . 그렇지 않으면 데이터가 손실되거나 손상됩니다.


이미지를 계속 사용하려는 경우 (예 : 가상 머신에서) 다른 방법은 원시 이미지를 가상화 소프트웨어에서 사용하는 이미지 형식 중 하나로 변환하는 것입니다. 예 : qemu의 경우 qcow2, VirtualBox의 경우 VDI 또는 VMware의 경우 VMDK

이 있습니다 아직 위의 방법을 사용하여 여유 공간을 청소하여 이미지를 준비하는 당신을 필요로합니다.

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow

# qemu-img convert -f raw -O vmdk foo.img foo.vmdk

그러나 실제 디스크에 다시 쓰려면 다시 원시 이미지로 변환해야합니다.


답변

사용 resize2fs이 훨씬 쉽다

resize2fs -M xxx.img

먼저 e2fsck를 요청 받게됩니다.

e2fsck -f -y xxx.img

(이미지를 마운트하지 않아야합니다!)

참고 : 이미지가 단일 파티션 인 경우에만 작동합니다. 다양한 파티션이있는 전체 블록 장치 인 경우 위의 답변을 참조하십시오 …


답변

나는 또한 qemu-img으로 시도했고 매력처럼 작동했습니다.

qemu-img resize test.img 2G

우리는 2G (2GB) test.img로 만들기 위해 크기를 조정하고 있습니다.

나를 위해 완벽하게 일했습니다.


답변

Ubuntu 16.10 컴퓨터에서 gparted 방식을 사용했습니다.

1) losetup위와 같이 이전 게시물에서 설명한 대로을 사용하여 img 파일을 사용 가능한 다음 루프 파티션에 매핑합니다.

2) lsblk이미지 파일이 어떤 루프 드라이브에 매핑되어 있는지 확인하십시오 . 예 :/dev/loop0

3) 실행 sudo gparted /dev/loop0

4) 적절한 것으로 루프 파티션을 줄입니다. 이 파티션을 마운트 해제했는지 확인하십시오.

5)을 실행 fdisk /dev/loop0한 다음 Enter 키를 누르면 p다양한 파티션의 블록 크기와 끝 블록 번호가 표시됩니다.

6) 실행 dd if=/dev/loop0 of=shrunk_image_file.img, 그 명령에 옵션을 적용 bs=[BlockSize]하고 count=[EndBlockNumberOfLastLoopPartition+1]당신은 수축과 rightsized 이미지 파일이있을 것이다.


답변