Reclaim empty space from VirtualBox VDI disk images by shrinking
Recently, we did some cleanup in certain GNU/Linux virtual machines, where we hoped that VirtualBox
would release the disk space that is not used and shrink the size of the VDI
files.
Unfortunately, that did not happen even after freeing more than 100GB of space from the guest machine.
We did manage though to reclaim the empty space manually, using the zerofree
and VBoxManage
utilities.
Following is the guide we followed to do so:
Part 1: Clean-up the guest machine using zerofree
We needed to find the unallocated, blocks with non-zero value content in the ext2
, ext3
or ext4
filesystem (e.g. /dev/sda1
) and fill them with zeroes.
Since the filesystem has to be unmounted or mounted as read-only for zerofree
to work, we decided to use a Live CD
to complete this task as it would be the simplest solution to follow.
Step 1: Download SystemRescueCd Live Image
We downloaded the SystemRescueCd Live Image and inserted it to the guest machine as a Live CD.
Step 2: Identify partitions and disks using fdisk -l
We booted the virtual machine from the Live CD, when the terminal appeared, we typed fdisk -l
to see all available disks and partitions.
Depending on your configuration you will see the following
If you performed your installation using standard partition
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x64af3527 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 411043839 411041792 196G 83 Linux /dev/sda2 411045886 419428351 8382466 4G 5 Extended /dev/sda5 411045888 419428351 8382464 4G 82 Linux swap / Solaris
or if you performed your installation using LVM
Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000523ce Device Boot Start End Blocks Id System /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 419430399 209202176 8e Linux LVM Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-swap: 4160 MB, 4160749568 bytes, 8126464 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos-home: 156.3 GB, 156304932864 bytes, 305283072 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
From the above results, we keep the paths to the real partitions and the paths to the LVM partitions, e.g.
/dev/sda1
which is 196GB, /dev/mapper/centos-home
and /dev/mapper/centos-root
Step 3: Perform the cleanup
To perform the clean up, execute for each of the above paths the command zerofree
, e.g.
zerofree /dev/sda1; zerofree /dev/mapper/centos-home; zerofree /dev/mapper/centos-root;
Give it some time to complete the task, the larger the partition, the more the time it will take.
Part 2: Shrink the guest machine disk images using VBoxManage
We used VBoxManage
with the parameter --compact
, which it is used to compact disk images, i.e. remove blocks that only contains zeroes. It shrinks dynamically allocated images by reducing the physical size of the image without affecting the logical size of the virtual disk. Compaction works both for base images and for diff images created as part of a snapshot. For this operation to be effective, it is required that free space in the guest system first be zeroed out and that is why we had to perform Step 1 using zerofree
before.
Please note that compacting is currently only available for VDI
images.
To use, just issue the command "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd --compact <DISK_PATH>
pointing to the disk you just cleaned up using zerofree
Please note that the virtual machine should be stopped before starting this operation.
Press the key combination Win
+ R
to pop up the Run prompt
.
Type cmd
in the input box and hit the Enter
key.
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd --compact "F:\Ubuntu\Ubuntu.vdi" "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd --compact "C:\Users\bytefreaks\VirtualBox VMs\CentOS\CentOS.vdi"