2017-03-17, bewerkt op 2017-09-10

Een thin-provisioned disk verkleinen onder ESXi

Het is vervelend als je in ESXi een virtuele disk te groot hebt aangemaakt, zelfs als deze thin-provisioned is; die zal namelijk langzaam vollopen en het is niet mogelijk om hem te verkleinen (shrinken). Je kunt de ruimte wel weer terugwinnen, maar dat is een tijdelijke oplossing. ESXi biedt zelf geen manier om een thin-provisioned schijf permanent te shrinken, maar het kan wel met een omweg.

Via VMware Converter is het voor Windows-VMs mogelijk om een virtuele schijf te shrinken, zover ik begrijp. Deze optie was echter niet beschikbaar bij mijn Linux-VM.

Het is echter via een omweg toch mogelijk om je disk te shrinken, en wel op de volgende manier:

  1. Maak een nieuwe virtuele disk aan met de gewenste grootte
  2. Verklein de partitie(s) van de bestaande, te grote disk
  3. Clone de partities naar de nieuwe disk

Dit kan worden gedaan met behulp van GParted.

Virtuele schijf thinnen

Als je dit artikel leest, zit je waarschijnlijk in de situatie dat de fysieke schijf vol zit omdat je virtuele schijf te ver is gegroeid. Als dat het geval is, moeten we eerst die ruimte vrijmaken zodat we speelruimte hebben om een nieuwe schijf aan te maken. Dat gaat in twee stappen.

Stap 1: ongebruikte ruimte overschrijven met nullen

Allereerst moeten we in de VM alle ongebruikte ruimte overschrijven met nullen zodat de hypervisor weet dat deze ruimte ongebruikt is. Dat kan met dd op de VM zelf:

# dd if=/dev/zero of=null bs=1M

Dit maakt een bestand aan dat niks anders dan nullen bevat totdat het bestandssysteem vol zit. Daarna is het bestand te verwijderen. Het nadeel van deze manier is alleen dat dit ook alle ruimte die vrij is (en voorheen ongebruikt) zal volschrijven met nullen. De virtuele disk zal dus groeien tot zijn maximale grootte. Daarnaast is deze methode vrij traag.

Er is een andere methode die beter is maar wel vereist dat het bestandssysteem niet gemount is: het programma zerofree, wat speciaal voor deze taak bedoeld is. We hebben later toch al GParted nodig, dus we kunnen ook mooi GParted Live gebruiken voor deze stap.

Start de VM op vanaf de GParted Live ISO en kies voor een commandlineomgeving. Gebruik lsblk om erachter te komen wat de juiste identifier is van de partitie die we willen zero-fillen. Bijvoorbeeld (vervang sda1 door de juiste identifier):

# zerofree -v /dev/sda1

Sluit de VM af als dit voltooid is.

Stap 2: gaten stompen

Om nu de ruimte weer terug te krijgen, gaan we naar de ESXi console (SSH) en doen we het volgende (waarbij we uiteraard disk.vmdk vervangen door het correcte pad naar de virtuele schijf):

# vmkfstools --punchzero disk.vmdk

Als dit voltooid is, is de virtuele schijf weer ge-thinned. Dit is de procedure die je periodiek moet uitvoeren als je niet wilt dat de schijf groeit naar de maximale grootte. De permanente oplossing komt hierna.

Virtuele schijf shrinken

Maak een nieuwe virtuele schijf aan van de gewenste grootte en voeg deze toe (naast de bestaande virtuele schijf) aan de VM. Start de VM op vanaf de GParted Live ISO en ga naar de grafische omgeving met de partitie-editor.

Selecteer de oude schijf en verklein de root-partitie zodat hij (naast eventueel andere partities) op de nieuwe, kleinere schijf past. Zorg dat je backups hebt voordat je hieraan begint!

Als het verkleinen is gelukt, kun je een nieuwe partitietabel aanmaken op de nieuwe schijf en de oude partitie kopieren van de oude naar de nieuwe schijf. Als je andere partities hebt, zoals swap- of losse boot-/home-partities, moet je deze ook kopieren.

Als dit is voltooid moet GRUB nog worden weggeschreven naar de bootsector van de nieuwe virtuele schijf. Open daarvoor de terminal en mount de nieuwe root partitie onder /mnt. Gebruik de partitie-editor of lsblk om achter de correcte identifier te komen.

# mount /dev/sdb1 /mnt

Om GRUB te installeren:

# grub-install --root-directory=/mnt /dev/sdb

Sluit vervolgens de VM af, verwijder de ISO en de oude virtuele schijf en start de VM weer op vanaf de nieuwe virtuele schijf.