VirtualBox의 VDI 파일 크기를 압축하는 방법은 무엇입니까?


301

매우 큰 하드 디스크 크기 (호스트보다 큰)를 구성한 VirtualBox VM이 있습니다. 실수로 VM의 프로그램이 많은 로그 파일을 생성했으며 호스트에 공간이 없을 때까지 VDI 파일 크기가 계속 커집니다.

이제 로그 파일을 삭제했지만 사용 후 VDI 파일 크기가 작아지지 않습니다. VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

VDI 파일 크기를 실제로 압축하는 방법이 있습니까? 감사!

답변:


507

다음 단계를 수행해야합니다.

  1. 게스트에서 조각 모음 실행 (Windows 만 해당)
  2. 여유 공간을 무효화하십시오.

    Linux 게스트를 사용하여 다음을 실행하십시오.

    dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
    

    또는:

    telinit 1
    mount -o remount,ro /dev/sda1
    zerofree -v /dev/sda1
    

    A를 윈도우 게스트 다운로드 SDelete을 시스 인 터널에서 이것을 실행

    sdelete.exe c: -z
    

    (C :를 VDI의 드라이브 문자로 바꾸십시오)

  3. 게스트 VM 종료

  4. 이제 다음 옵션을 modifymedium사용하여 VBoxManage의 명령을 실행 하십시오 --compact.

    Linux 호스트를 사용하여 다음을 실행하십시오.

    vboxmanage modifymedium --compact /path/to/thedisk.vdi
    

    Windows 호스트를 사용하여 다음을 실행하십시오.

    VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
    

    Mac 호스트를 사용하여 다음을 실행하십시오.

    VBoxManage modifymedium --compact /path/to/thedisk.vdi
    

이것은 vdi 크기를 줄입니다.


14
다음 사람의 경우 내 명령은 "C : \ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe"modifyhd "C : \ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi"- 소형
다니엘

36
zerofree Linux 유틸리티 맨 페이지 ( manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html )에 따르면 zerofree는 이 작업에서 dd 보다 낫습니다 . dd 는 "느리게", "디스크 이미지가 일시적으로 최대 크기까지 커지도록", "일시적으로 디스크의 모든 여유 공간을 사용하므로 다른 동시 쓰기 작업이 실패 할 수 있으므로"권장되지 않습니다. Zerofree는 apt 를 통해 Ubuntu Linux에서 사용 가능 하거나 직접 컴파일 할 수 있습니다.
다카 틴

27
그것은의 맨 페이지 것을 재미 zerofree이 함께한다고 DD 실패합니다 다른 동시 쓰기,하지만 읽기 전용으로 마운트 할 파일 시스템을 zerofree 필요 해요! * duh *
Madarco

7
팁 : 다음과 같이 두 명령을 한 줄에 넣으십시오. 그러면 완료를 dd ...; rm /bigfile기다리지 않는 경우 전체 디스크 사용 시간이 최소화 dd됩니다.
jlh

21
@Dakatine VirtualBox 4.3.10을 사용하면 디스크 이미지 파일이 최대 크기까지 커지지 않았습니다 . VirtualBox는 모든 제로 블록을 실제 디스크에 쓰는 것을 방해하지 않을만큼 영리합니다.
jlh

12

Windows 게스트가있는 Windows 7 호스트에 있습니다. 다음은 폴더 트리의 모든 VDI를 압축하기 위해 작성한 배치 파일입니다.

echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal. 
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx

:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file 

Title Compacting Free space on Virtual Machine VMs

:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401

Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ... 
:: Notice that within the for loop we use !variable! instead of %variable%.

For /R %CD% %%G IN (*.vdi) DO (
 set ohai=%%G
 set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
 if NOT !lastfive!==}.vdi (
 echo .
 echo Compacting %%G
 "C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
 )

pause 
exit

주석에 링크를 남겨두면 작동 방식을 알 수 있습니다.

편집하다

글쎄, 결국 CloneVDI 도구를 사용해 보았고 훨씬 적은 시간과 한 번의 클릭으로 좋은 일을했습니다.


5
이런 종류의 사이트에서는 DOS에 대한 구문 강조가 있지만 그렇지 않다고 생각할 것입니다. 메모장 ++에서 훨씬 더 예쁘다
CAD bloke

1
구문 분석 엔진이 필요한 @CAD_bloke 및 SE에 게시 된 다른 언어의 수를 고려할 때 HUGE 프로젝트를보고 있습니다. 예를 들어 DOS의 버전과 방언이 몇 개인 지 생각해보십시오. Linux 등을 사용하기도 전에 요.
Caltor

아주 좋은 지적입니다. 아이러니하게도 그것은 되는 스택 교환 iOS 앱에 강조했다.
CAD bloke

2
예 CloneVDI는 훨씬 더 빠르고 개인적인 사용 방법입니다
VarunAgw

6

폐기 / TRIM을 사용하는 Windows 호스트의 데비안 게스트.

이것은 문제가 아니라 문제를 해결하기 때문에 직접적인 대답은 아닙니다. 이 솔루션은 주기적으로 이미지를 압축하는 대신 폐기를 사용하여 호스트의 VM 디스크 이미지에서 사용되지 않는 블록을 자동으로 제거합니다.

이 솔루션에는 지속적인 TRIM을 지원하는 게스트 파일 시스템이 필요합니다. Arch Linux 위키에는 TRIM 작업을 지원하는 파일 시스템 목록이 있습니다 .

FDE와 cryptoroot는 보안 문제가 있으므로이 질문에 대한 다른 솔루션 중 어느 것도 압축을 허용하지 않으므로 특별히 다루지 않습니다. Arch Linux 위키에는 TRIM 및 dm-crypt 장치에 대한 정보가 있습니다 .

이론적으로 이것은 VDI 스토리지를 사용하는 VBox 호스트의 모든 Linux 게스트에서 작동합니다.

호스트 구성

VBox가 종료되고 VM이 실행되지 않은 상태에서 VM 의 구성 파일에 각 디스크 discard와 디스크를 모두 설정하여 디스크에 대한 폐기 지원을 추가하십시오 nonrotational. 현재 discard는 GUI에 없지만 nonrotational"Solid-State Drive"확인란으로 표시됩니다. (참고 : vbox 포럼, 폐기 지원 )

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

VM을 부팅하고 TRIM 지원이 활성화되어 있는지 확인하십시오.

sudo hdparm -I /dev/sda | grep TRIM

게스트 구성

LVM을 사용중인 경우에서 폐기 설정을 변경하십시오 /etc/lvm/lvm.conf. (참고 : 데비안 위키, lvm.conf 예제 )

devices {
...
    issue_discards = 1
}

fstab에서 discard자동 폐기 할 파일 시스템에 옵션을 추가하십시오 (참고 : debian wiki, fstab example )

UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

파일 시스템을 다시 마운트하여 새 옵션을 선택하십시오.

sudo mount -o remount /
sudo mount -o remount /build

로 무료 블록을 수동으로 자릅니다 fstrim. fstrim마운트 된 파일 시스템을 사용하지만 백업하는 블록 장치는 사용하지 않습니다. 에서 연속 삭제를 설정하는 대신 fstab매주 cron에서 수행 할 수 있습니다. TRIM에 대한 의심스러운 지원이있을 수있는 물리적 SSD에는 주간 크론이 권장되지만 기본 SSD는 호스트 OS에서 처리되므로 여기에서는 관련이 없습니다 ( ssd trim warning 참조 ).

fstrim /
fstrim /build

이 시점에서 VM 내부의 파일 시스템 크기와 VM 이미지 크기는 거의 비슷해야합니다.

로 테스트 :

  • 게스트 1 : 데비안 8.7, 커널 : 백 포트에서 Linux 4.8 grsec, 파일 시스템 : ext4
  • 게스트 2 : Debian 9 RC2, 커널 : Linux 4.9, 파일 시스템 : ext4
  • 호스트 1 : VBox 5.1.14, Win7, 이미지 fmt : VDI
  • Host2 : VBox 5.1.14, Win8.1, 이미지 fmt : VDI

2

들어 맥 OS 고객 이 작업을 수행 :

  1. 게스트 시스템의 여유 공간을 무효화합니다.

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (/ Volumes / Macintosh HD를 드라이브 이름으로 바꾸십시오)

  2. 게스트 VM 종료

  3. VDI 디스크 이미지 크기를 줄이려면이 명령을 실행하십시오.

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    또는

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    

1

Windows VirtualBox의 가상 데비안에 마운트 된 VDI 이미지에 이것을 사용합니다. 일반적인 해결책은 아니지만 적어도 내가하는 일의 요점을 알려 주어야합니다.

데비안 명령 :

root@debian:~# lsblk  # show partitions
이름 MAJ : MIN RM 크기 RO 유형 마운트 포인트 
sdb 8:16 0128G 0 디스크 
└─sdb1 8:17 0 128G 0 part / mnt / web # 이것은 관심의 일부입니다!
sda 8 : 0 64G 0 디스크 
├─sda1 8 : 1 61,4 지 0 부 / 
├─sda2 8 : 2 0 1K 0 부분 
└─sda5 8 : 5 0 2,7 지 0 부 
[스왑] sr0 11 : 0 1 56,3M 0 롬
root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine

Windows의 명령 :

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space

그것이 도움이되기를 바랍니다 :)


1

OS에서 TRIM 지원을 사용하고 싶지 않습니다. 모든 데이터 삭제로 인해 VDI 파일의 데이터 압축이 강제 실행되어 VDI 파일이 클래식 회전 디스크에있을 때 게스트 시스템을 사용할 수 없게되기 때문입니다. 나를 위해 더 나은 것은 한 달에 한 번 손으로 압축을 수행하는 것입니다.

일반 압축 중에 VDI 파일 내용이 새 파일로 복사됩니다. 호스트 디스크에 여유 공간이 필요할 수 있습니다.

Andrew Domaszek가 지적한 것과 비슷한 솔루션을 사용했습니다. NTFS (Windows10)에서도 매우 잘 작동합니다.

이것을하기 위해:

  • GParted Live CD로 부팅하는 새로운 가상 머신을 만듭니다 (원하는 Linux 배포판을 사용할 수 있음).
  • 기기 설정 편집 및 SATA 디스크 컨트롤러 설정
  • 압축하려는 기존 VDI 파일 추가
  • TRIM을 지원하는 SSD로 볼 수 있도록 VDI 기반 디스크를 변경하십시오.

    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on
    VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
    
  • 기계를 시작

  • Linux 루트 셸에서 NTFS 파티션을 마운트하십시오. mount /dev/sda2 /mnt
  • 여유 공간 없음 dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • 새 파일을 만들지 않고 VDI 강제 압축 : fstrim -v /mnt

0

허용되는 답변을 보충하는 매우 깔끔한 트릭은 호스트에서 압축 파일 시스템을 사용하여 게스트 공간을 제로화 한 후 압축하지 않고 도망 갈 수 있다는 것입니다 (예 : NTFS 속성의 가상 드라이브 폴더를 Windows 호스트). 운영 체제가 많은 반복적 인 텍스트 또는 이진 파일을 보유하는 경향이 있기 때문에 실제로 이것은 더 많은 공간을 절약 할 수있는 이점이 있습니다 (예 : 15GB의 공간이 0 인 30GB 게스트 드라이브는 호스트 드라이브에서 4GB로 바뀔 수 있음).

주의 사항에는 실제 하드웨어에 대한 드라이브 액세스가 증가 할 수 있으며 CPU 사용량이 약간 증가한다는 것입니다.


0

레거시에 대한 중요 사항 (~ 1997-2007) 운영 체제

일반적으로 이전에 제공된 답변의 기술은 유효합니다. 그러나 매우 중요한 특수 사례가 있습니다.

1997-2007 년 정도의 기간 동안 32 비트 운영 체제는 여전히 표준이지만 2GB보다 큰 하드 디스크는 이미 사용 중입니다. 결과적으로, 0의 파일을 작성하여 모든 여유 공간을 사용하려고 할 때 (항상 루트로 수행되어야하며, 루트 권한이있는 여유 공간을 포함하여 다른 사람은 누구도 만질 수 없음)

파일이 너무 큽니다

당신이 기대하는 것 대신에 :

기기에 남은 공간이 없습니다.

이 경우 2GB 파일 크기 제한에 도달했을 가능성이 큽니다. 많은 파일 작업에서 부호있는 32 비트 정수로 결과를 반환하여 음수 값이 오류 코드를보고 할 수 있었기 때문에 이것은 일반적이었습니다. 이는 특수한 측정없이 오프셋 결과가 2 ^ 31 바이트로 제한되었음을 의미합니다.

해결 방법은 간단합니다. 디스크에 실제로 공간이 부족해질 때까지 다른 이름을 가진 별도의 제로화 파일을 계속 만듭니다.

강의실에서이 상황을 보여주고 자하는 강사라면, Red Hat Linux 7.0의 구본이있는 4GB 디스크 이미지로 충분합니다.

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