11

I use windows server 2008r2 with role Hyper-V. The guest system is Ubuntu 12.04 LTC. It is situated on the dynamic virtual hard disk.

I want to compact this VHD (The real size is 50 GB, 360 GB on the disk). But I can not do this, because the Ubuntu file system is not NTFS. What do I need (gparted, sdelete, ...) for solving this problem?

The main problem is that the filesystem is not NTFS, but ext4.

The answer:

1) Download systemrescuecd

http://sourceforge.net/projects/systemrescuecd/files/sysresccd-x86/3.8.1/systemrescuecd-x86-3.8.1.iso/download

2) Add this .iso to the quest OS Ubuntu

3) Start this virtual machine

4) Use zerofree

zerofree /dev/sda1

5) Poweroff this virtual machine

6) Use Hyper-V manager (Edit -> defragmentation)

This vhd was 360 Gb. Now 70 GB.

AmShegar
  • 259

6 Answers6

6

Poweroff your VM, backup the VHD, and run another virtual machine (I use SystemRescueCD since it's small and fast) that has the ext4 partition available to it, i.e., a HD for SysRescue (but don't mount it!). From the SysRescue VM, run 'zerofree' on the ext4 partition, poweroff that VM, and then use your Administration Website to compact the VHD.

5

I can confirm: zerofree is working to compact virtual disk files

BUT: you don't need to use any rescue CDs or to mount the VHDX in another virtual machine:

sudo apt-get install zerofree

Boot into recovery mode, then run:

zerofree /dev/sda1

After that, we have to start the optimization for the virtual disk file. On the server hosting the VHDX file, create the following file ShrinkVhdx.ps1:

[CmdletBinding()]
Param(
    $VHDFiles
)

Find the disks

foreach($VHD in $VHDFiles){ Write-Verbose "Working on $VHD, please wait" Write-Verbose "Current size $([math]::truncate($(Get-VHD -Path $VHD).FileSize/ 1GB)) GB"

Mount-VHD -Path $VHD -NoDriveLetter -ReadOnly
Optimize-VHD -Path $VHD -Mode Full

Write-Verbose "Optimize size $([math]::truncate($(Get-VHD -Path $VHD).FileSize/ 1GB)) GB"
Dismount-VHD -Path $VHD

Write-Verbose ""

}

And now run the file and enjoy the released disk space :-)

ShrinkVhdx.ps1 .\hdd1.vhdx
Jochen
  • 169
2

The process appears to be

  • Backup your current VHD file.
  • Use Snapshot manager to delete/merge any snapshots.
  • Zero fill the unused disk space

viz

sudo apt-get install secure-delete 
sudo sfill -llz .

This creates a file called oooooooo.ooo filled with 0s. You should repeat the sfill command on all partitions I guess.

Note this isn't quick either, it will take hours if not days to complete.

  • Compact
  • Profit
user9517
  • 117,122
1

1) Download systemrescuecd

http://sourceforge.net/projects/systemrescuecd/files/sysresccd-x86/3.8.1/systemrescuecd-x86-3.8.1.iso/download

2) Add this .iso to the quest OS Ubuntu

3) Start this virtual machine

4) Use zerofree

zerofree /dev/sda1

5) Poweroff this virtual machine

6) Use Hyper-V manager (Edit -> defragmentation)

AmShegar
  • 259
0

I did try to start Systemrescuecd in a 2nd gen machine. But it didn't work, so I created a new 1st gen machine and added the VHDX to it. systemrescuecd started. I didn't do any operations. Removed the 1st gen machine and put the VHDX back in the original machine. Then Ubuntu didn't start up at all. Only Grub-menu.

See my post here: Hyper-V Ubuntu vhdx scsi ide

So be aware of this, and do take backup (I didn't this time)...

Sam
  • 392
0

You can do this by checking some parameters in the following files: /sys/block//queue/discard_granularity /sys/block//queue/discard_max_bytes if either have a 0 it's probably not supported by your hardware + software configuration.

Here's a full tutorial on doing this at: http://www.1337admin.org/uncategorized/compacting-virtual-disks-on-generation-2-linux-hyper-v-2012-r2-vms/

Brad
  • 260