vSphere (7/) NTP funktioniert nicht „Zeitsynchronisierung des Hosts wurde unterbrochen“ und „NTP is not synced“ (NTP never was synchronized.)

Die neue vSphere ESXi Version bringt viele Neuerungen mit. Einige gut, andere sind neuen Herausforderungen für vmWare Admins

NTP never was synchronized.

Wir sehen es öfter, das frisch aktualisierte vsphere ESXi Hosts keine aktuelle Uhrzeit mehr von NTP Servern unter Windows abholen wollen. Es ist nicht nur eine Windows Server Zeitquelle betroffen, aber hier ist der Effekt am einfachsten nachzuvollziehen (und ja auch schon hinlänglich dokumentiert).

Hosts zeigen nach einer Weile den roten Fehler „Zeitsynchronisierung des Hosts wurde unterbrochen“ an.

vSphere: Zeitsynchronisierung wurde unterbrochen

Im Testprotokoll (Hosts > Konfigurieren > Uhrzeitkonfiguration > Dienste testen) sieht man leider nur den wenig hilfreichen Hinweis „NTP is not synced“ und „NTP never was synchronized.„. Nach der nett übersetzten Angabe „Die Konfiguration funtioniert nicht normal“.

Die Konfiguration funktioniert nicht normal

Lösung

Standardmäßig erlaubt Windows NTP Server eine Dispersion („Jitter“) von (großzügigen) 10 Sekunden und fügt diese auch in NTP-Antworten im DISP-Feld bei jedem Abfrageintervall hinzu. ESXi/ESX-Hosts ab 7.0.3 akzeptieren standardmäßig aber keine NTP-Antworten mit einer Root-Dispersion von mehr als 1,5 Sekunden.

Man könnte den Windows-NTP entsprechend anpassen, geht damit aber das Risiko fehlerhaft konfigurierter Domänenmitglieder ein. Oder man ermöglich dem NTP Client von vSphere ESXi einfach eine größere Dispersion. Letzteres machen wir hier.

Wichitg: Unter ESXi 7.0.3 kann man die /etc/ntp.conf nicht mehr manuell bearbeiten, denn sie wird durch das Webinterface (vSphere Client oder vCenter) überschrieben. Das hier ist die „richtige“ Lösung dazu.

NTP-Client auf ESXi-Hosts anpassen

  1. SSH auf Host aktivieren (Konfigurieren > Dienste > SSH > starten)
  2. Via SSH zum Host Verbinden und anmelden
  3. Eine NTP-Konfigurationsvorlagendatei erstellen und diese via esxcli setzen
# config-Datei mit Inhalt erstellen
printf "server pool.ntp.org\ntos maxdist 30\n" > /tmp/ntphack.txt

# Datei als NTP-Config "anhängen"
esxcli system ntp set -f /tmp/ntphack.txt

# NTP Client neu starten
esxcli system ntp set -e 1

Ein paar Sekunden (~20 Sekunden) später hat sich der Fehler selbst behoben und der Hoststatus ist wieder Normal.

vSphere: Alle eingelegten ISO-Dateien in VMs finden (via PowerCLI)

Alle CD’s in VMs finden: Ab und zu möchte ich eine ISO aus einem Datastore löschen, das dann mit einem Fehler fehlschlägt.

Die Datei [DATASTORE] isos/SW_DVD9_Win_Server_STD_CORE_2019_64Bit_German_DC_STD.ISO kann nicht gelöscht werden.

Das liegt meistens daran, das die ISO noch in einem Gast gemountet oder sogar verbunden ist.

Wie kann man also ISO Dateien in allen seinen VMs suchen?

Lösung

Alle VMs mit verbundenen ISO-Dateien via PowerCLI auflisten:

Get-VM | Get-CDDrive | select @{N="VM";E="Parent"},IsoPath | where {$_.IsoPath -ne $null}

… ISO-Dateien aus allen VM’s entfernen:

Get-VM | Get-CDDrive | where {$_.IsoPath -ne $null} | Set-CDDrive -NoMedia -Confirm:$False

vSphere ESXi ISO Image download mit ESXi-Customizer-PS Fehler [WinError 10054]

In letzter Zeit häufen sich die Fälle, in denen man mit dem bewährten PowerShell Script ESXi-Customizer-PS.ps1 von V-Front keine aktuelle ISO mehr herunterladen kann.

Windows Meldet dann nur noch einnen „enexpected error“.

An unexpected error occurred:
[WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Lösung

Die Ursache des Fehler kennen wir nicht, aber es funktioniert dann immernoch sofort der „Umweg“ über das Offline Zip-Bundle:

.\ESXi-Customizer-PS.ps1 -ozip

gefolgt von

.\ESXi-Customizer-PS.ps1 -izip <ESXi-bundle-ZIP-File>.zip

Dann hat man nach praktisch der selben Zeit das selbe ISO fertig.

vSphere 7 „Ein allgemeiner Systemfehler ist aufgetreten: Internal error“ beim ändern von Syslog.global.logdir

Aus uns nicht erfindlichen Gründen kann man im vSphere Client den Konfigurationseintrag Syslog.global.logdir nicht ohne Fehlermeldung ändern. Wenn man das versucht erhält man die spannende Fehlermeldung „Ein allgemeiner Systemfehler ist aufgetreten: Internal error“

Man erreicht den Eintrag im vSphere Client auf dem Host > Konfigurieren > System/Erweiterte Systemeinstellungen > Bearbeiten

Lösung

Man kann den Eintrag problemlos an der Console via esxcli setzen. Das geht sowohl via SSH als auch remote. Das „neue“ Verzeichnis muss auch schon existieren, sonst beschwert sich esxcli.

mkdir /vmfs/volumes/<NEUESVOLUME>/logs

esxcli system syslog config set --logdir=/vmfs/volumes/<NEUESVOLUME>/logs

Nach der Änderung muss Syslogd neu geladen werden. Das tut das GUI eigentlich automatisch, aber an der Konsole müssen wir etwas nachhelfen:

esxcli system syslog reload

Die gesetzten Parameter erfährt man via GET

esxcli system syslog config get

VMware vSphere PowerCLI (PowerShell) Portgruppe mit VLAN hinzufügen

Da virtuelle Standard Switches (vSwitches) Hostsache sind und nicht via vCenter „verteilt“ werden können, ist es sinnvoll so eine Aufgabe für mehrere Hosts zu automatisieren. Dank PowerCLI ist so ein Rollout aber verhältnismäßig schnell erledigt.

Neue Portgruppe mit VLAN (tagged) zu vSwitch0 auf einem ESXi hinzufügen

Das PowerCLI importieren und mit dem vCenter verbinden:

PS C:\> Import-Module VMware.PowerCLI
PS C:\> Connect-VIServer vcenter.example.fqdn

Dann kann man direkt die Portgruppe hinzufügen

Get-VMHost -name <ESXHOST> | Get-VirtualSwitch -Name <vSWITCH> | New-VirtualPortGroup -name <PORTGRUPPEN-NAME> -VLanId <ID>

Beispiel: Auf Host „esx15“ Portgruppe „vlan_11“ mit dem vlan tag „11“ zum „vSwitch0“ hinzufügen:

Get-VMHost -name esx15 | Get-VirtualSwitch -Name vSwitch0 | New-VirtualPortGroup -name vlan_11 -VLanId 11

Alle ESXi Hosts im Cluster auf einmal

Alle Host im Cluster kann man mit einer einfachen Schleife erreichen:

$VMHosts = Get-cluster <CLUSTER-NAME> | Get-VMHost

foreach ($VMHost in $VMHosts) {

    Get-VMHost -name $VMhost | Get-VirtualSwitch -name vSwitch0 | New-VirtualPortGroup -name <PORTGRUPPEN-NAME> -VLanId <ID>

}