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


19

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

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


원하는 결과를 추가 할 수 있습니다. 즉, 이미지를 카드에 다시 넣고 CD에 저장합니다.
Wayne

답변:


8

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

# 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

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


1
현재 파티션에 저장된 모든 파일이 실제로 디스크에 흩어져 있지 않은지 어떻게 확인할 수 있습니까?
Valerio Santinelli

파일이 디스크에 순차적으로 기록되지 않는다고 가정하고 파일이 스토리지의 끝에 있으면 크기를 줄이면 해당 파일의 내용이 손실됩니다.
Valerio Santinelli

OP는 데이터 손실없이 디스크 이미지를 축소하는 방법을 묻고 있습니다. 특정 크기로 이미지를 자르면 데이터가 보존 될지 확신 할 수 없습니다.
Valerio Santinelli 2016 년

@ ValerioSantinelli : 이미지를 정확히 자르는 것이 좋습니다.
user1686 2016 년

1
@ValerioSantinelli : 파일 시스템에 적합한 파일 시스템 크기 조정 도구를 사용하여 ( 예 : resize2fs또는 ntfsresize(Linux에는 FAT에 대한 도구가 없음)) 작은 장치에 쓰거나 새로운 파일 시스템을 만들고 파일을 복사합니다.
user1686 2016 년

22

사용 resize2fs이 훨씬 쉽다

resize2fs -M xxx.img

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

e2fsck -f -y xxx.img

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

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


참고 : 여러 파티션의 losetup --find --partscan xxx.img경우 이미지 파일을 루프 장치로 설정하는 데 사용 하십시오. 그런 다음 lsblk루프 장치의 파티션을 찾기 위해 실행 하십시오.
Yihui Xiong

운영 체제가 포함 된 ISO 이미지에서는 작동하지 않는 것 같습니다. 시스템 크기를 조정 한 후 부팅되지 않습니다.
SR

@SR Linux 운영 체제?
Rolf

1
이것은 매우 좋은 대답이지만 유형 파티션 resize2fs에만 해당 extN됩니다. 다른 유형의 파티션에는 다른 도구가 필요합니다.
Rolf

2

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

qemu-img resize test.img 2G

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

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


1
굉장하고 나도 완벽하게 일하면서 Raspbian 이미지를 압축했습니다. 완전히 작동!
ffleandro

글쎄, 모든 것이 작동하지만 부팅 후 running df -h은 원래 크기를 보여줍니다. 이것이 어떻게 가능한지?
ffleandro 2016 년

분명히 qemu-img는 파티션 테이블이 아니므로 어떻게 .img를 압축합니까?
ffleandro

.img 디스크의 크기를 1M로 조정하여 디스크 이미지를 확실히 손상시킬 수 있습니다. 크기 조정을보다 안전하게하는 아이디어가 있습니까?
lesca

1

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 이미지 파일이있을 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.