Hot-Backup von ESXi VMs

Um Backups von ESXi VMs im laufenden Zustand machen zu können, braucht es

  • Verständnis was VmWare unter einem Snapshot versteht
  • Das Scipt ghettoVCB.sh =>  ghettoVCB

Exkurs VMWare-Snapshot

Bei einem VMware Snapshot wird eine weitere Festplattendatei erstellt welche ab Zeitpunkt des Snapshots alle geänderten Blöcke aufnimmt. Gleichzeitig wird der Exklusiv Zugriff auf die Basis Festplatte aufgehoben so das andere Prozesse lesen koennen.

Dieses “lesen” kann ein Kopierbefehl einens Backupprogramms sein. Da keine Schreibzugriffe mehr in die Datei erfolgen ist der Zustand also konsistent. Snapshots sind also keine Backups. Ein Snapshot “friert” lediglich einen Zustand ein (Basis Festplatte) und schreibt alle ab diesem Zeitpunkt anfallenden Änderungen in eine neue Snapshot Datei (Delta).

 

  • Die Basisplatte und der bzw. die Snapshots zusammen ergeben den akt. Stand. Fehlt ein Element in der Kette ist kein vollstaendiges Restore mehr moeglich. Beides muss zur gleichen Zeiten fuer den HOST zugaenglich sein.
  • Snapshots wachsen bis zur max. konfigurierten Festplattengroesse heran. Die Groesse des Datastores ist also zu ueberwachen.
  • Beim löeschen von mehr als 2 Snapshots ist zu bedenken das ein Helper angelegt wird und immer die Groesse der zusammen zufuehrenden Snaps benoetigt wird.
  • Laufende Snaps kosten ein wenig Performance. Die Gefahr von Fragmentierierung ignorieren wir da die Snaps immer in 16MB Bloecken wachsen.
  • Grosse Snaps loeschen, hier versteht VMware das einpflegen der Aenderungen, dauert lange

Beispiel:

  • Basisplatte
  • Snapshot1
  • Snapshot2
  • Snapshot3
  • Snapshotx

Löscht man jetzt Snapshotx wird dieser (und damit alle davorigen Snapshots) in die Basisplatte eingepflegt.
Löscht man Snapshot2 wird dessen Zustand und der von Snapshot1 in die Basisplatte eingepflegt und Snapshot3 usw. werden zu Snapshot1 usw,

Die .VMDK-Files (Virtuell Maschine Disk Files) können im laufenden Betrieb nicht kopiert oder verschoben werden, da sie ja in Gebrauch sind. Dies sieht aber nach einem Snapshot anders aus. Bei einem Snapshot werden die .VMDK-Files im Prinzip gekappt und neue Files (VMSN und VMSD) angelegt, in welche die kompletten Änderungen des Snapshots geschrieben werden. Wenn man ein Snapshot der VM macht, wird die Basis-Festplatte in den Read-Only Modus gesetzt, wordurch diese nun, da konsisten, kopiert werden kann. Das Verhalten von Snapshots kann also ausgenutzt werden um Backups im laufenden System erstellen zu können (Hilfsmittel zum Backup):

Komplettbackup 1

  1. Das Konfigurations-File der VM sichern/kopieren (VMX-File)-> nach dem Snaphsot der vituellen Maschine ändern sich die Verweise in der Konfiguration.
  2. Man erstellt einen ersten Snapshot einer VM. Es bestehen anonsten keine Snapshots dieser VM. Der Snapshot wird also gemacht, und die Basis-Festplatte kopiert. Anschliessend den Snapshot wieder loeschen. Dieses Vorgehen benötigt entsprechend viel Platz, wenn mehrere Backups der gleichen VM notwendig sind.

Komplettbackup 2

  1. Man macht täglich einen Snapshot und sicherst den Snapshot des Vortages. Bedeutet weniger Platz da quasi nur Aenderungen dann noch anfallen. Aber ein Restore erfordert Knowhow und dein ESX wird mehr belastet.

Soweit der Exkurs… Um ein Backup zu erstellen, können wir das mit den Snapshots manuell machen oder aber mit dem ghettoVCB-Script arbeiten. Das macht nämlich genau das oben beschriebene.

Installation von ghettoVCB

Die Installation ist simple. Einfach ein Verzeichnis auf dem ESXi-Datastore erstellen und die ghettoVCB-Scripts hineinkopieren. Das wird ganz schön auf Youtube gezeigt: http://www.youtube.com/watch?v=mVrjxzKEEu4

ghettoVCB konfigurieren und Backup durchführen

Die Konfigurationsmölgichkeiten findet man hier: http://communities.vmware.com/docs/DOC-8760

ghettoVCB.conf File

Ich habe mein ghettoVCB.conf File folgendermassen konfiguriert (ist eingentlich alles Standard):

VM_BACKUP_VOLUME=/vmfs/volumes/65d7a6db-6bc8d65a/VmBackups
DISK_BACKUP_FORMAT=thin
VM_BACKUP_ROTATION_COUNT=1
POWER_VM_DOWN_BEFORE_BACKUP=0
ENABLE_HARD_POWER_OFF=0
ITER_TO_WAIT_SHUTDOWN=3
POWER_DOWN_TIMEOUT=5
ENABLE_COMPRESSION=0
VM_SNAPSHOT_MEMORY=0
VM_SNAPSHOT_QUIESCE=0
SNAPSHOT_TIMEOUT=15

VMs zum Backup

Habe ein File “vms_to_backup” erstellt, welches eine Liste der Namen der VMs beinhaltet. Bei den Namen handelt es sich um die Namen, welche auch im vSphereClient angezeigt werden:

TestVM32Bit

Backup run

Nun kann die VM im laufenden Zustand gebackuped werden (Option -d dryrun führt einen Testlauf durch):

./ghettoVCB.sh -f vms_to_backup -g ./ghettoVCB.conf -d dryrun

Backup automatisch durchführen (Cron-Tab)

Um das Backup automatisch durchzuführen, kann dies in der Cron-Tab von ESXi konfiguriert werden:

In Crontab registrieren, Job soll jeden Donnerstag um 17:00 Uhr durchgeführt werden

echo "0 17 * * 4 /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/vms_to_backup -g /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root

Wenn man dies Ausführt, wird der crontab automatisch an die richtige Datei angehängt.
Nun muss crond neu gestartet werden:

ESXi 4.1

/bin/kill $(cat /var/run/crond.pid)
/bin/busybox crond

Die Cron-Tab von ESXi wird bei jedem Start wieder neu geschrieben. Um die Zeile deswegen bei jedem Start auszuführen, muss diese noch in die /etc/rc.local eingetragen werden. Meine rc.local sieht anschliessend so aus:

vi /etc/rc.local
 #! /bin/ash
export PATH=/sbin:/bin

log() {
echo "$1"
logger init "$1"
}

#execute all service retgistered in /etc/rc.local.d
if [ -d /etc/rc.local.d ]; then
for filename in `find /etc/rc.local.d/ | sort`
do
if [ -f $filename ] && [ -x $filename ]; then
log "running $filename"
$filename
fi
done
fi

/bin/kill $(cat /var/run/crond.pid)
/bin/echo "0 17 * * 4 /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/vms_to_backup -g /vmfs/volumes/4a6bb65f-eb654b7b-2525-d8d385ab5bd2/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root
crond

ESXi 5.5

kill $(cat /var/run/crond.pid)
crond

Die Cron-Tab von ESXi wird bei jedem Start wieder neu geschrieben. Um die Zeile deswegen bei jedem Start auszuführen, muss diese noch in die /etc/rc.local eingetragen werden. Meine rc.local sieht anschliessend so aus:

vi /etc/rc.local.d/local.sh
#!/bin/sh

# local configuration options

# Note: modify at your own risk! If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading. Changes are not supported unless under direction of
# VMware support.
/bin/kill $(cat /var/run/crond.pid)
echo "0 17 * * 4 /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/ghettoVCB.sh -f /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/vms_to_backup -g /vmfs/volumes/54016b12-54a601dc-1d3c-d43d7e942aae/ghettoVCB/ghettoVCB.conf > /tmp/ghettoVCB.log" >> /var/spool/cron/crontabs/root
crond
exit 0

Nun nur noch autobackup durchführen, das ganze in der ESXi Konfuguration zu speichern:

/sbin/auto-backup.sh

Das wars! Jetzt werden die VMs automatisch regelmässig gesichert.

Restore durchführen

Um einen Restore druchzuführen, habe ich ein file vms_to_restore erstellt, wobei dieses pro Linie einen Restore-Parameter mit folgendem Format enthalten muss:

";;"
# DISK_FORMATS
# 1 = zeroedthick
# 2 = 2gbsparse
# 3 = thin
# 4 = eagerzeroedthick

z.B.:

"/vmfs/volumes/QnapTSDatastore/VmBackups/TestVM32Bit/TestVM32Bit-2013-01-03_13-25-54;/vmfs/volumes/ESXi Raid1/TestVM;3"

Anschliessend kann das Restore folgendermassen gestartet werden (Option -d 2 = Dryrun):

./ghettoVCB-restore.sh -c vms_to_restore -d 2

Dies stellt das von ghettoVCB erstellte Backup “TestVM32Bit-2013-01-03_13-25-54” unter dem Pfad “/vmfs/volumes/ESXi Raid1/TestVM” her bzw. kopiert diese dahin und registriert die VM neu beim ESXi-Host.

Die Fileformate

zeroedthick (default)

vmdk wird in voller Groesse angelegt – dieser Typ wird bei der Erstellung nicht mit Nullen ueberschrieben – das passiert erst spaeter im Betrieb

eagerzeroedthick

vmdk wird in voller Groesse angelegt – dieser Typ wird bei der Erstellung mit Nullen ueberschrieben

thick

vmdk wird in voller Groesse angelegt – und nie genullt

thin

vmdk waechst nach Bedarf – dies ist ein Feature des VMFS dateisystems – und ist auf den meisten NFS-servern nicht moeglich

2gbsparsed

vmdk wird in maximal 2 Gb grosse Stuecke aufgeteilt – die jeweils nach Bedarf wachsen – dieses Format ist it Workstation kompatibel

Photon 3.0 auf ESXi 5.5

Photon 3.0 installieren

Netzwerk einrichten

vi /etc/systemd/network/99-dhcp-en.network

Das File updaten

[Match]
Name=e*

[Network]
Address=x.x.x.x/xx
Gateway=x.x.x.x
DNS=x.x.x.x
Domains=name

Nach dem anschliessend Reboot sollte das Netzwerk erreichbar sein

reboot

root-login auf ssh erlauben

Natürlich ist es keine gute Idee, den root-User auf SSH zu erlauben. Damit man aber einigermassen angenehem die Konfigurationen vornehmen kann (über die ssh Konsole), wird dieser aktiviert. Sobald weitere User eingereichtet sind, kann der root-access wieder eingeschränkt werden.

Damit man sich als root per ssh einloggen kann muss man das File

vi /etc/ssh/sshd_config

editieren:

PermitRootLogin yes

Anschliessend den Service restarten

systemctl restart sshd

Root Passwort ändern

Beim Installieren von Photon gebe ich ein einfaches Passwort ein, weil die locale (Tastatur-Layout) nicht wirklich für Deutsch funktioniert. Anschliessen, sobald über SSH connected werden kann, setze ich ein stärkeres Passwort:

passwd

Upgrade PhotonOS

PhotonOS upgraden

tdnf distro-sync

Docker aktivieren

systemctl enable docker

Neuer User erstellen

Nun werden neue User erstellt.

useradd -m -U username
passwd username
usermod -aG docker username

Anschliessend rebooten

reboot

Ab sofort kann man sich mit dem neue erstellen User per SSH einloggen.

Root-User Rechter erhält man ab sofort mit

su -

Docker Compose installieren

Nun wird Docker Compose installiert. Bitte darauf achten, dass die neueste Version installiert wird.

Siehe auch https://github.com/docker/compose/releases/

su -
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
chgrp docker /usr/local/bin/docker-compose
exit

Root wieder deaktivieren

Nun kann das Root-Login über SSH wenn gewünscht wieder deaktiviert werden.

vi /etc/ssh/sshd_config
PermitRootLogin yes
systemctl restart sshd

Update Esxi Server

Dieses Howto beschreibt ein Update von ESXi 4.0 nach ESXi 4.1. Für ein Update von ESXi 5.5 siehe hier.

Vorbereitung

  • Kopieren der Update-Datei (z.B. update-from-esxi4.1-4.1_update03.zip) auf den Esxi-Host
  • Per SSH auf den Esxi-Host einloggen
  • Zum Update-File navigieren

Durchführung Update

Das Update-File kann nun mit dem Befehl

esxupdate

angewendet werden

Überprüfen welche Updates in dem File vorhanden sind

esxupdate --loglevel=DEBUG --bundle update-from-esxi4.1-4.1_update03.zip scan

Durchführung eines Testlaufs => nichts wird modifiziert

esxupdate --loglevel=DEBUG --bundle update-from-esxi4.1-4.1_update03.zip stage
  • Alle VMs sauber stoppen
  • Den Server in den Maintenance-Mode setzen => über den vShpereClient
  • Update installieren
    esxupdate --loglevel=DEBUG --bundle update-from-esxi4.1-4.1_update03.zip update
  • Den Host über vSphereClient rebooten
  • Den Host über vSphereClient wieder in den normalen Betriebs-Mode setzen
  • Alle VMs wieder starten
  • Check ob alle Dienste wieder laufen

Beschreibung der Optionen

Siehe File: esxupdate

VM-Ware Tools auf einem Ubunut-Gastsystem installieren (VM-Ware ESXi 4.1)

Getestet mit “ESXi 4.1 Update 3” Server (4.1.0, 800380) und folgenden Gastsystemen:

  • Ubuntu-Server 10.04.4 LTS
  • Ubuntu-Server 12.04.1 LTS
  • Ubuntu-Server 12.10

Als erstes sicherstellen, dass auf dem Gastsystem alles notwendige installiert ist:

sudo apt-get install build-essential
sudo apt-get install linux-headers-$(uname -r)

Dann in der vSphere-Client-Konsole: Menü VM->Gast->VMwareTools installieren. Dies hängt das VMWare-Tools .iso ein, das per ESXi-Server-Installation bereits im datastore liegt.

Per SSH zur VM verbinden, oder einfach die Konsole öffnen (ich finde SSH komfortabler, da in der Konsole kein Copy&Paste möglich ist),

  1. iso ins Betriebssystem einhängen
    sudo mkdir /mnt/cdrom
    sudo mount /dev/cdrom /mnt/cdrom
  2. VMware Tools-<version> kopieren und auspacken
    cp /mnt/cdrom/VMwareTools-9.4.15-2827462.tar.gz /tmp/
    cd /tmp
    tar -zxf VMwareTools-9.4.15-2827462.tar.gz
  3. Pakete fürs Kompilieren holen/überprüfen, falls diese noch nicht installiert sind
  4. #Installation durchführen
    cd vmware-tools-distrib
    sudo ./vmware-install.pl

    – Alle Nachfragen mit ENTER bestätigen.
    – Das Script hängt das Image automatisch aus.
    – Ein Reboot des Gast-Systems ist nicht notwendig

VmWare-Tools läuft nun als Service:

ps -ef | grep vm
root      1072     1  0 14:53 ?        00:00:00 /usr/sbin/vmtoolsd
ralwet    1318  1219  0 14:54 pts/0    00:00:00 grep --color=auto vm

Check, welche VmWare-Tools version installiert ist

/usr/bin/vmware-toolbox-cmd -v
8.3.17.15269 (build-784891)

 

ESXi Templates

  1. Shutdown der VM, welche kopiert werden soll
  2. Click on the host > Configuration tab
  3. Select Hardware > Storage to display the datastores
  4. Right-click on the datastore with the VM you want to clone > Browse Datastore
  5. Create a new folder in the store
  6. Right click on the VM folder and select Copy (must be done in the right pane of the Datastore Browser)
  7. Paste the VM to a new sub folder (otherwise the VM will overwrite itself)
  8. Once copied, rename and move the folder if desired
  9. Select the .vmx file within the cloned VM and select ‘Add to Inventory’

Es kann vorkommen, dass das Networking der VM nach dem Kopieren nicht funktioniert. Das Problem war, weil der Adapternahme von eth0 auf eth1
gewechselt hatte:

http://blog.inventic.eu/2013/03/ubuntu-eth0-error-while-getting-interface-flags-no-such-device/

Update ESXi Patch-Bundle

  1. ESXi 5.5 in Maintenance-Mode wechseln / alle VMs stoppen
  2. Upload ESXi Patch-File auf ESXi host (zip)
  3. Schauen, welche Profile im Zip-File vorhanden sind:
    esxcli software sources profile list -d /vmfs/volumes/53ce978d-fa434b02-5512-d43
    d7e942aae/ESXi550-201510001.zip

    Resultat

    Name                             Vendor        Acceptance Level
    -------------------------------  ------------  ----------------
    ESXi-5.5.0-20151004001-no-tools  VMware, Inc.  PartnerSupported
    ESXi-5.5.0-20151004001-standard  VMware, Inc.  PartnerSupported

    “no-tools” ist das Profile ohne die VmWare-Tools, “standard” ist das Update mit allem drum und dran. Es kann auch sein, dass ein Profilname mit “s” endet (z.B. ESXi-5.5.0-20151004001s-standard). Dieser Patch würde dann nur die Security-Updates beinhalten.

  4. Jetzt kann das Upate durchgeführt werden
    esxcli software profile update --depot=/vmfs/volumes/53ce978d-fa434b02-5512-d43
    d7e942aae/ESXi550-201510001.zip -p ESXi-5.5.0-20151004001-standard
  5.  Jetzt den ESXi-Host durchstarten.
  6. Wichtig: Beim esxcli-Befehl die update Option, NICHT die install-Option verwenden. Die Update-Option esetzt die bereits vorhandenen Pakete auf dem ESXi-Host mit neuen Versionen aus dem Bundle. Vorhandene Pakete auf dem ESXi-Host, welche nicht im Bundle vorhanden sind werden nicht gelöscht.
    Die Install-Option würde Pakete, des ESXi-Hosts, welche nicht im Bundle vorhanden sind, löschen (komplette “reinstallation”).

Referenzen:

ESXi Embedded Host-Client

VmWare Host-Client, der den mittlerweile ziemlich veralteten vSphere Client ablösen soll:

https://labs.vmware.com/flings/esxi-embedded-host-client

Einmal auf dem ESXi-Host installiert kann man den HTML5 Host-Client über https://<host:port>/ui/ abrufen.

Einzelne VMs kann man z.B. über vmrc://192.168.2.30/?moid=41 aufrufen. Dazu muss natürlich auch erst “VmWare Remote Client” vmrc auf den lokalen System installiert werden.

Leider funktioniert bei mir der Embedded Host-Client bzw. der HTML5-Client im zusammenspiel mit meinem ESXi 5.5 Host nicht wirklich. Der Host und die VMs können toll eingesehen werden. Aktionen wie Herunterfahren, etc. können aber nicht durchgeführt werden. Geschweige denn kann eine Konsole zu den VMs geöffnet werden.

Fazit: Aktuell bleibt einem ESXi (free) User immer noch nichts anderes übrig als den alten verstaubten vSphere Client zu benutzen.,..

 

VmWare ESXi Command Line Tool

Nachdem man den ESXi-Server mit SSH connecten kann, stellt sich natürlich die Frage wie man über das Terminal ESXi-Befehle absetzen kann. Das geht mit

vim-cmd <Befehl>
  • Alle auf dem Host registrierten VMs auflisten
     vim-cmd /vmsvc/getallvms
  • VM von der Register-Liste entfernen
     vim-cmd /vmsvc/unregister <Vmid>
  • VM registrieren
     vim-cmd /solo/register /path/to/file.vmx
  • Power-Status der VM anzeigen
     vim-cmd /vmsvc/power.getstate <Vimid>
  • VM ausschalten (Power off)
     vim-cmd /vmsvc/power.off <Vmid>
  • VM einschalten (Power on)
     vim-cmd /vmsvc/power.on <Vmid>
  • In Maintenance Mode gehen
    vim-cmd /hostsvc/maintenance_mode_enter
  • VM-Ware Tools installieren
    vim-cmd /vmsvc/tools.install [vmid]

Links

http://www.doublecloud.org/2013/11/vmware-esxi-vim-cmd-command-a-quick-tutorial/