답변:
먼저 여유 공간이 실제로 비어 있고 삭제 된 파일이 남아 있지 않은지 확인하십시오. 이 작업을 수행하는 가장 쉬운 방법은 디스크에 널 바이트 만 포함 된 큰 파일을 만든 다음 삭제하는 것입니다.
# 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
또는 ntfsresize
(Linux에는 FAT에 대한 도구가 없음)) 작은 장치에 쓰거나 새로운 파일 시스템을 만들고 파일을 복사합니다.
사용 resize2fs
이 훨씬 쉽다
resize2fs -M xxx.img
먼저 e2fsck를 요청 받게됩니다.
e2fsck -f -y xxx.img
(이미지를 마운트하지 않아야합니다!)
참고 : 이미지가 단일 파티션 인 경우에만 작동합니다. 다양한 파티션이있는 전체 블록 장치 인 경우 위의 답변을 참조하십시오 ...
losetup --find --partscan xxx.img
경우 이미지 파일을 루프 장치로 설정하는 데 사용 하십시오. 그런 다음 lsblk
루프 장치의 파티션을 찾기 위해 실행 하십시오.
resize2fs
에만 해당 extN
됩니다. 다른 유형의 파티션에는 다른 도구가 필요합니다.
나는 또한 qemu-img으로 시도했고 매력처럼 작동했습니다.
qemu-img resize test.img 2G
우리는 2G (2GB) test.img
로 만들기 위해 크기를 조정하고 있습니다.
나를 위해 완벽하게 일했습니다.
df -h
은 원래 크기를 보여줍니다. 이것이 어떻게 가능한지?
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 이미지 파일이있을 것이다.