Linux / machine-id prüfen und für geklonte Systeme zurücksetzen

Die machine-id ist ein persistenter Bezeichner für eine auf systemd basierende Linux-Installation. Sie wird normalerweise in /etc/machine-id gespeichert und ändert sich nicht, wenn man den Rechner neu startet oder den Host umbenennt. Wenn Sie einen Server oder eine virtuelle Maschine klonen, ohne diese Datei vorzubereiten, können verschiedene Systeme die gleiche ID erhalten.

Was ist die Machine-ID?

Die Machine-ID identifiziert ein lokales System mit einem 128-Bit-Wert. In /etc/machine-id wird sie normalerweise als 32 Kleinbuchstaben-Hexadezimalzeichen gefolgt von einem Zeilenumbruch dargestellt. Systemd legt den Wert während der Installation oder des Bootvorgangs fest und behält ihn normalerweise auch bei späteren Starts bei.

Es ist kein für Menschen lesbarer Servername. Ein Hostname ist ein Name, den ein Administrator wählen und ändern kann; die machine-id identifiziert die Installation des Betriebssystems. Wenn Sie einen Host umbenennen müssen, siehe Rocky Linux / Hostnamen mit hostnamectl ändern (Englisch).

Die machine-id unterscheidet sich auch von einer Hardware-Seriennummer oder der MAC-Adresse einer Netzwerkschnittstelle. Das Ersetzen von Hardware oder Ändern von Netzwerkeinstellungen ändert sie nicht von selbst. Das systemd machine-id(5) Handbuch dokumentiert ihr Format und das Initialisierungsverhalten.

So überprüfen Sie die aktuelle machine-id

Auf einem System, das Sie verwalten, zeigen Sie den aktuellen Wert mit an:

cat /etc/machine-id

Ein normal initialisiertes System zeigt einen 32-stelligen hexadezimalen Wert an. Schreiben Sie nicht einfach eine beliebige Zeichenkette in die Datei, nur weil sie leer oder nicht vorhanden ist. Images, Container und schreibgeschützte Dateisysteme können die ID beim Booten unterschiedlich initialisieren.

Fügen Sie die echte ID nicht in einem öffentlichen Beitrag, Log oder Support-Anfrage ein. Systemd sagt, dass sie vertraulich behandelt und nicht in unzuverlässige Umgebungen, insbesondere über ein Netzwerk, weitergegeben werden sollte. Wenn eine Anwendung eine stabile Kennung benötigt, die sie veröffentlichen kann, sollte sie eine anwendungsspezifische abgeleitete ID verwenden, anstatt die rohe machine-id zu veröffentlichen.

Beeinflussen ein Neustart oder eine Änderung des Hostnamens diese ID?

Normalerweise nicht. Die Maschinen-ID ist für eine Betriebssysteminstallation persistent und wird nicht bei jedem Start neu erzeugt. Sie ist unabhängig vom Hostnamen, der IP-Adresse und der MAC-Adresse.

Wenn zwei Server unterschiedliche Namen, aber dieselbe Maschinen-ID haben, sollte untersucht werden, ob ein Image kopiert wurde, ohne für das Klonen vorbereitet zu werden. Umgekehrt implizieren übereinstimmende Hostnamen nicht notwendigerweise übereinstimmende Maschinen-IDs.

Wann sollte man eine Maschinen-ID zurücksetzen?

Der Hauptfall ist die Vorbereitung eines Betriebssystem-Images zur Verwendung durch mehrere virtuelle Maschinen, Cloud-Instanzen oder Container. Ein direktes Klonen der Festplatte kann /etc/machine-id zusammen mit allem anderen kopieren. Um jeder Instanz ihre eigene ID zu geben, bereiten Sie das Quell-Image im ausgeschalteten Zustand vor, und lassen Sie dann jede Kopie beim Start eine ID erhalten.

Es gibt normalerweise keinen Grund, die ID auf einem laufenden Server nur zu ändern, um sie unterschiedlich zu machen. Tun Sie dies nur bei einem spezifischen Bedarf, wie zum Beispiel zur Behebung von doppelten IDs oder zum Erstellen eines Bereitstellungs-Images. Systemd merkt an, dass netzwerksichtbare Identifikatoren aus der machine-id abgeleitet werden können; siehe dessen Anleitung zum sicheren Erstellen von Images.

Wie sich der Dateistatus auf den ersten Start auswirkt

/etc/machine-id zu entfernen und leer zu lassen ist nicht gleichwertig. Entscheiden Sie, ob das Image auch die Initialisierung beim ersten Start ausführen soll.

Status im Image Neue ID beim Start Als erster Start behandelt
Datei fehlt Systemd versucht eine zu erstellen Ja
Enthält uninitialized Systemd versucht eine zu erstellen Ja
Datei existiert, ist aber leer Systemd versucht eine zu erstellen Nein
Datei enthält eine gültige ID Bestehende ID wird verwendet Nein

Wenn systemd einen Boot als den ersten betrachtet, können Einheiten mit ConditionFirstBoot=yes ausgeführt werden, zusammen mit anderer Initialisierung. Eine leere Datei ermöglicht es, eine ID zu erstellen, ohne diese First-Boot-Aktionen auszulösen. Ein schreibgeschütztes Dateisystem kann ebenfalls eine bestehende leere Datei erfordern, damit eine temporäre ID darüber gebunden werden kann. Siehe den Abschnitt First Boot Semantics in machine-id(5) für die genauen Regeln.

Zurücksetzen der ID in einem für das Klonen vorgesehenen Image

Das folgende Beispiel geht davon aus, dass ein heruntergefahrenes Image von einem separaten Verwaltungssystem unter /mnt/image-root eingebunden wurde. Ersetzen Sie diesen Pfad durch den tatsächlichen Einhängepunkt. Diese Befehle sind keine Anweisungen zur Änderung von /etc/machine-id auf einem laufenden Produktionsserver.

  1. Fahren Sie die Quell-VM oder das Image herunter und erstellen Sie ein Backup oder einen Snapshot. Bewahren Sie das Original auf, wenn Sie eine Kopie in eine wiederverwendbare Vorlage umwandeln möchten.
  2. Binden Sie das Image auf einem anderen System ein. Bestätigen Sie, dass /mnt/image-root wirklich der Einhängepunkt des Images ist, und prüfen Sie dann beide ID-Pfade:
findmnt --mountpoint /mnt/image-root
ls -l /mnt/image-root/etc/machine-id /mnt/image-root/var/lib/dbus/machine-id

Wenn findmnt nicht den vorgesehenen Einhängepunkt anzeigt, stoppen Sie. /var/lib/dbus/machine-id kann ein symbolischer Link zu /etc/machine-id oder eine separate Datei sein. Wenn eine separate Datei die alte ID behält, kann systemd sie wiederverwenden.

Um die Initialisierung beim ersten Start ebenfalls auszuführen

Überprüfen Sie bei einem beschreibbaren Image, das als erster Start erkannt werden soll, erneut den Einhängepunkt und entfernen Sie die Datei innerhalb des Images:

sudo rm -- /mnt/image-root/etc/machine-id

Alternativ, wenn die Datei im Image erhalten bleiben muss, schreiben Sie uninitialized gefolgt von einem Zeilenumbruch. Wählen Sie eine Methode, nicht beide:

printf 'uninitialized\n' | sudo tee /mnt/image-root/etc/machine-id > /dev/null

Wenn /var/lib/dbus/machine-id eine separate reguläre Datei ist, die die vorherige ID enthält, muss sie ebenfalls zurückgesetzt werden. Erst nachdem mit ls -l bestätigt wurde, dass es sich nicht um einen symbolischen Link handelt, entfernen Sie diese Datei aus dem ausgeschalteten Image:

sudo rm -- /mnt/image-root/var/lib/dbus/machine-id

Wenn es ein symbolischer Link ist, führen Sie diesen Befehl nicht aus. Überprüfen Sie stattdessen dessen Ziel und das Layout der Distribution. Systemd kann eine separate D-Bus-ID wiederverwenden, wenn /etc/machine-id leer oder nicht vorhanden ist.

Um eine neue ID ohne First-Boot-Aktionen zu erhalten

Wenn First-Boot-only-Units nicht ausgeführt werden sollen, lassen Sie eine leere Datei im Image:

sudo truncate -s 0 -- /mnt/image-root/etc/machine-id

Systemd kann aus einer leeren Datei eine ID erstellen, behandelt diesen Start jedoch nicht als den ersten. Eine leere Datei kann auch für ein schreibgeschütztes Image relevant sein. Diese Methode erfordert immer noch die Überprüfung einer separaten D-Bus-ID, die wiederverwendet werden könnte, wie oben beschrieben.

Hängen Sie das Image sauber aus, starten Sie einen Klon und überprüfen Sie, dass jede bereitgestellte Instanz eine andere ID hat. Vergleichen Sie die tatsächlichen Werte nur innerhalb einer vertrauenswürdigen Verwaltungsumgebung; veröffentlichen Sie diese nicht. Allein das Ausführen von systemd-machine-id-setup garantiert keine zufällige ID, da eine vorhandene D-Bus-ID oder ein anderer angegebener Wert erneut verwendet werden kann. Die Reihenfolge ihrer Priorität ist im systemd-machine-id-setup(1) Handbuch beschrieben.

Was machen zwei häufig vorgeschlagene Befehle tatsächlich?

Sie könnten dieses Paar auch als eine Methode sehen, um die Maschinen-ID zurückzusetzen:

sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id

Der erste Befehl reduziert /etc/machine-id auf null Bytes, ohne es zu entfernen. Systemd kann beim nächsten Booten eine ID erstellen, aber eine leere Datei löst keine Einheiten aus, die nur beim ersten Start ausgeführt werden. Es ersetzt nicht sofort die ID, die vom laufenden System und seinen Diensten aktuell gehalten wird.

Der zweite Befehl entfernt den D-Bus-ID-Pfad. Wenn dieser Pfad eine separate reguläre Datei mit der alten ID ist, kann das Entfernen eine Wiederverwendung verhindern. Wenn es jedoch ein symbolischer Link zu /etc/machine-id ist, entfernt rm -f nur den Link. Die Option -f unterdrückt auch einen Fehler, wenn der Pfad nicht existiert, sodass eine erfolgreiche Ausführung kein Beweis dafür ist, dass die IDs korrekt zurückgesetzt wurden.

Kopieren Sie diese beiden Befehle nicht direkt als Routinevorgang auf einen laufenden Produktionsserver. Überprüfen Sie zunächst die Pfade mit ls -l /etc/machine-id /var/lib/dbus/machine-id. Für eine Klonvorlage verwenden Sie das oben beschriebene Vorgehen mit ausgeschaltetem Image und überprüfen das Ergebnis nach jedem Start des Klons. Systemd kann eine ID auch aus anderen, von der Umgebung bereitgestellten Quellen sowie über D-Bus beziehen; siehe die Initialisierungsreihenfolge in machine-id(5).

Wenn laufende Server bereits doppelte IDs haben

Leeren oder entfernen Sie /etc/machine-id nicht einfach, während ein Produktionsserver weiterläuft. Laufende Prozesse könnten den bestehenden Wert zwischengespeichert haben, und Journal-, Netzwerk- oder Anwendungszustände könnten betroffen sein. Identifizieren Sie das Original und die Kopie, wählen Sie aus, welche Instanz geändert wird, und planen Sie Ausfallzeiten ein.

Sichern Sie betroffene Dienste und Daten, fahren Sie den Klon herunter und ändern Sie seine Festplatte aus einer separaten Umgebung. Nachdem er gestartet ist, überprüfen Sie, dass seine neue ID sich von anderen Systemen unterscheidet und dass Netzwerk und relevante Dienste normal funktionieren. Die Vorbereitung einer vollständigen VM-Vorlage kann auch das Zurücksetzen von SSH-Hostschlüsseln, Zufallszahlen, Hostnamen und anderem instanzspezifischen Zustand erfordern. Der Red Hat-Leitfaden für VM-Vorlagen beschreibt die Verwendung von virt-sysprep; überprüfen Sie den vollständigen Satz der Änderungen, bevor Sie ihn verwenden.

Häufig gestellte Fragen

Kann ich eine Machine-ID als Passwort oder Authentifizierungstoken verwenden?

Nein. Es identifiziert ein System; es ist kein Authentifizierungsgeheimnis. Vermeiden Sie es, den Rohwert offenzulegen, aber entwerfen Sie keine Authentifizierung darauf basierend.

Beweisen übereinstimmende Maschinen-IDs, dass zwei Systeme identisch sind?

Nein. Ein Klonvorgang könnte die ID kopiert haben. Überprüfen Sie die Systeme und den Image-Bereitstellungsprozess, anstatt anzunehmen, dass es sich um die gleiche Maschine handelt.

Ändert sich die machine-id, wenn ich den Hostnamen mit hostnamectl ändere?

Nein. Der Hostname und die machine-id dienen unterschiedlichen Zwecken und werden getrennt gespeichert. Das Umbenennen eines Hosts erzeugt keine neue /etc/machine-id.

Sollte ich die Datei in einem Klon-Image löschen oder leeren?

Entfernen Sie es oder markieren Sie es als uninitialized, wenn die Initialisierung beim ersten Start ausgeführt werden soll. Lassen Sie es leer, wenn Sie nur eine neue ID ohne diese Erststartaktionen benötigen. Prüfen Sie die Anforderungen des Image Builders, einschließlich schreibgeschützter Dateisysteme.