I have seen it with both VBox native VDI format and VMDK format. Even though I delete files from virtual drive, I see it always keeps growing. I have some vague idea that file zero-ing doesn't happen with the virtual drives from this link. When I tried to do that with SDelete (as said in the link) it didn't reduce the VDi disk size. I have applications which once installation grows the disk to 10GB each time. I believe there should be some simple way to zero it than going through the tedious process, is there any? Is there any option in VirtualBox to keep virtual drive small?
3 Answers
When creating a new virtual machine, you are prompted to create a Virtual Hard Disk. You have two options for the disk, fixed or dynamically allocated. These are the descriptions (from virtual box) of both types of disks.
Fixed: A fixed hard disk file may take longer to create on some systems but is often faster to use
Dynamically allocated: A dynamically allocated hard disk file will only use space on your physical hard disk as it fills up (up to a maximum fixed size), although it will not shrink again automatically when space on it is freed
Chance are, you set it to dynamically allocated so the disk does not shrink again automatically when space on it is freed.
-
Thanks for this info. I have created new VM in fixed .vdi file. However, creating snapshots and working on the snapshots still keeps growing the snapshot size (eventually causing the VM size to keep growing beyond my fixed disk size) Commented Jun 10, 2017 at 1:54
Here is a batch script I use to compact all the VDI files:
@echo off
for /d %%d in (*.*) do (
cd "%%d"
for %%f in (*.vdi) do (
echo Compacting %%f . . .
echo Initial size: %%~zf
"C:\Program Files\VirtualBox\VBoxManage.exe" modifymedium --compact disk "%%f"
echo Post compact size: %%~zf
echo.
)
cd ..
)
Just save it in the folder containing the Virtual Machines and run...
-
O wow, this is neat! I didn't know this functionality existed Commented Jun 9, 2017 at 16:40
-
Should I do SDelete before running this batch file? I see there is no difference between Initial Size and Post Compact Size after running this batch. Commented Jun 10, 2017 at 1:51
-
@Ajayvignesh you must run sdelete or any tools like zerofree to zero the free blocks, because virtualbox/vmware work in raw blocks and have no idea about the underlying filesystem. Hence if it sees a non-zero block, it thinks that the block is has some data and cannot remove it from the file– phuclvCommented Jun 10, 2017 at 6:12
Deleting files from a virtual drive does not reduce it's size for performance reasons.
When a file is deleted it leaves a hole where the files data previously resided. When new files are created or data is written to the disk it will fill in these holes. The file will grow when necessary to accommodate more data but it will never shrink.
Why?
Removing data from a file anywhere but the end is a time consuming operation. Data has to be moved to fill the holes and in the case of a virtual drive many internal references to data locations will need to be updated. Even with an SSD a deletion of even a small file could take minutes. This is clearly not acceptable.
You need to use vboxmanage --compact to remove the holes and shrink the virtual drive.
vboxmanage --compact
to remove those zero clusters out of the vdi file