답변:
다음 단계를 수행해야합니다.
여유 공간을 무효화하십시오.
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의 드라이브 문자로 바꾸십시오)
게스트 VM 종료
이제 다음 옵션을 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 크기를 줄입니다.
dd ...; rm /bigfile
기다리지 않는 경우 전체 디스크 사용 시간이 최소화 dd
됩니다.
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
주석에 링크를 남겨두면 작동 방식을 알 수 있습니다.
편집하다
이것은 문제가 아니라 문제를 해결하기 때문에 직접적인 대답은 아닙니다. 이 솔루션은 주기적으로 이미지를 압축하는 대신 폐기를 사용하여 호스트의 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 이미지 크기는 거의 비슷해야합니다.
로 테스트 :
들어 맥 OS 고객 이 작업을 수행 :
게스트 시스템의 여유 공간을 무효화합니다.
diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
(/ Volumes / Macintosh HD를 드라이브 이름으로 바꾸십시오)
게스트 VM 종료
VDI 디스크 이미지 크기를 줄이려면이 명령을 실행하십시오.
VBoxManage modifyhd /path/to/thedisk.vdi --compact
또는
VBoxManage modifymedium /path/to/thedisk.vdi --compact
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
그것이 도움이되기를 바랍니다 :)
OS에서 TRIM 지원을 사용하고 싶지 않습니다. 모든 데이터 삭제로 인해 VDI 파일의 데이터 압축이 강제 실행되어 VDI 파일이 클래식 회전 디스크에있을 때 게스트 시스템을 사용할 수 없게되기 때문입니다. 나를 위해 더 나은 것은 한 달에 한 번 손으로 압축을 수행하는 것입니다.
일반 압축 중에 VDI 파일 내용이 새 파일로 복사됩니다. 호스트 디스크에 여유 공간이 필요할 수 있습니다.
Andrew Domaszek가 지적한 것과 비슷한 솔루션을 사용했습니다. NTFS (Windows10)에서도 매우 잘 작동합니다.
이것을하기 위해:
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
기계를 시작
mount /dev/sda2 /mnt
dd if=/dev/zero of=/mnt/bigfile
rm /mnt/bigfile
fstrim -v /mnt
허용되는 답변을 보충하는 매우 깔끔한 트릭은 호스트에서 압축 파일 시스템을 사용하여 게스트 공간을 제로화 한 후 압축하지 않고 도망 갈 수 있다는 것입니다 (예 : NTFS 속성의 가상 드라이브 폴더를 Windows 호스트). 운영 체제가 많은 반복적 인 텍스트 또는 이진 파일을 보유하는 경향이 있기 때문에 실제로 이것은 더 많은 공간을 절약 할 수있는 이점이 있습니다 (예 : 15GB의 공간이 0 인 30GB 게스트 드라이브는 호스트 드라이브에서 4GB로 바뀔 수 있음).
주의 사항에는 실제 하드웨어에 대한 드라이브 액세스가 증가 할 수 있으며 CPU 사용량이 약간 증가한다는 것입니다.
레거시에 대한 중요 사항 (~ 1997-2007) 운영 체제
일반적으로 이전에 제공된 답변의 기술은 유효합니다. 그러나 매우 중요한 특수 사례가 있습니다.
1997-2007 년 정도의 기간 동안 32 비트 운영 체제는 여전히 표준이지만 2GB보다 큰 하드 디스크는 이미 사용 중입니다. 결과적으로, 0의 파일을 작성하여 모든 여유 공간을 사용하려고 할 때 (항상 루트로 수행되어야하며, 루트 권한이있는 여유 공간을 포함하여 다른 사람은 누구도 만질 수 없음)
파일이 너무 큽니다
당신이 기대하는 것 대신에 :
기기에 남은 공간이 없습니다.
이 경우 2GB 파일 크기 제한에 도달했을 가능성이 큽니다. 많은 파일 작업에서 부호있는 32 비트 정수로 결과를 반환하여 음수 값이 오류 코드를보고 할 수 있었기 때문에 이것은 일반적이었습니다. 이는 특수한 측정없이 오프셋 결과가 2 ^ 31 바이트로 제한되었음을 의미합니다.
해결 방법은 간단합니다. 디스크에 실제로 공간이 부족해질 때까지 다른 이름을 가진 별도의 제로화 파일을 계속 만듭니다.
강의실에서이 상황을 보여주고 자하는 강사라면, Red Hat Linux 7.0의 구본이있는 4GB 디스크 이미지로 충분합니다.