MACHINE-ID(5)

BEZEICHNUNG
machine-id - Lokale Konfigurationsdatei zur Maschinenkennung

ÜBERSICHT

/etc/machine-id

BESCHREIBUNG

Die Datei /etc/machine-id enthält eine eindeutige Maschinenkennung des lokalen Systems, die während der Installation oder des Systemstarts gesetzt wird. Die Maschinenkennung ist eine einzelne, hexadezimale 32-Zeichen-Kennung (in Kleinbuchstaben), die mit einem Zeilenumbruch abgeschlossen wird. Nach der Dekodierung aus dem hexadezimalen entspricht sie einem 16-Byte/128-Bit-Wert. Diese Kennung darf nicht komplett nur aus Nullen bestehen.

Die Maschinenkennung wird normalerweise während der Systeminstallation oder des ersten Systemstarts aus einer Zufallsquelle erstellt und bleibt für alle nachfolgenden Systemstarts konstant. Für zustandslose Systeme kann sie optional falls notwendig zur Laufzeit während der frühen Systemstartphase erstellt werden.

Die Maschinenkennung kann beispielsweise beim Systemstart über das Netz mit dem Kernelbefehlszeilenparameter systemd.machine_id= oder durch Übergabe der Option --machine-id= an Systemd gesetzt werden. Eine in dieser Weise festgelegte Maschinenkennung hat eine höhere Priorität und wird statt der in /etc/machine-id gespeicherten Kennung verwandt.

Die Maschinenkennung ändert sich nicht, wenn sich die lokale oder Netzkonfiguration ändert oder die Hardware ausgetauscht wird. Daher und aufgrund ihrer größeren Länge ist sie eine nützlichere Ersetzung des von POSIX festgelegten Aufrufs gethostid(3).

Diese Maschinenkennung folgt dem gleichen Format und der gleichen Logik wie die Maschinenkennung von D-Bus.

Diese Kennung identifiziert den Rechner eindeutig. Sie sollte »vertraulich« behandelt und nicht in unvertrauenswürdigen Umgebungen, insbesondere im Netz offengelegt werden. Falls für einige Anwendungen eine stabile Kennung, die an eine Maschine gebunden ist, benötigt wird, darf die Maschinenkennung oder Teile davon nicht direkt verwandt werden. Stattdessen sollte die Maschinenkennung mit einer kryptographischen, mit einem Schlüssel versehenen Funktion in einen Hash verwandelt werden, wobei ein fester, anwendungsbezogener Schlüssel verwandt werden sollte. Damit ist die Kennung ausreichend eindeutig und in einer konstanten Art und Weise von der Maschinenkennung abgeleitet, aber es gibt dann keine Möglichkeit, die ursprüngliche Maschinenkennung aus der anwendungsspezifischen abzuleiten. Das API sd_id128_get_machine_app_specific(3) stellt eine Implementierung eines solchen Algorithmus bereit.

INITIALISIERUNG

Im normalen Betrieb sollte jede Maschine eine nicht leere Kennung haben. Die Kennung von jeder Maschine sollte eindeutig sein. Um diese Ziele zu erreichen, kann /etc/machine-id auf verschiedene Arten initialisiert werden.

Für normale Betriebssysteminstallationen, bei denen ein angepasstes Abbild für eine bestimmte Maschine erstellt wird, sollte /etc/machine-id während der Installation befüllt werden.

systemd-machine-id-setup(1) kann von Installationswerkzeugen verwandt werden, um die Maschinenkennung zum Installationszeitpunkt zu initialisieren, aber /etc/machine-id kann auch mit anderen Mitteln geschrieben werden.

Für Betriebssystemabbilder, die einmal erzeugt und dann auf mehreren Maschinen verwandt werden, beispielsweise Container oder in der Cloud, sollte /etc/machine-id entweder fehlen oder in dem generischen Dateisystem leer sein (der Unterschied zwischen diesen zwei Optionen wird weiter unten unter »Semantik beim ersten Systemstart« beschrieben). Während des Systemstarts wird eine Kennung erstellt und falls möglich in dieser Datei gespeichert. An der Stelle eine leere Datei zu haben ist nützlich, da es erlaubt, eine temporäre Datei mittels einer Bind-Einhängung über die echte Datei zu legen, falls das Abbild nur lesend verwandt wird. Siehe auch Sicheres Bauen von Abbildern[1].

systemd-firstboot(1) kann zur Initialisierung von /etc/machine-id auf eingehängten (aber nicht gestarteten) Systemabbildern verwandt werden.

Wenn eine Maschine mit systemd(1) gestartet wird, wird die Kennung der Maschine etabliert. Falls die Optionen systemd.machine_id= oder --machine-id= (siehe ersten Abschnitt) angegeben werden, wird dieser Wert verwandt. Falls diese Datei leer ist oder fehlt, wird Systemd versuchen, die D-Bus-Maschinenkennung aus /var/lib/dbus/machine-id, den Wert der Kernelbefehlszeilenoption container_uuid, die KVM-DMI-product_uuid oder die Devicetree vm,uuid (auf KVM-Systemen) und schließlich eine zufällig erstellte UUID zu verwenden.

Nachdem die Maschinenkennung etabliert ist, wird systemd(1) versuchen, sie in /etc/machine-id zu speichern. Falls dies fehlschlägt, wird es versuchen, sie als temporäre Datei mittels Bind-Einhängung über /etc/machine-id zu legen. Es ist ein Fehler, falls das Dateisystem nur lesbar ist und keine (möglicherweise leere) Datei /etc/machine-id enthält.

systemd-machine-id-commit.service(8) wird versuchen, die Maschinenkennung in das Dateisystem zu schreiben, falls /etc/machine-id oder /etc/ während der frühen Systemstartphase schreibgeschützt sind, aber später schreibbar werden.

SEMANTIK BEIM ERSTEN SYSTEMSTART

/etc/machine-id wird für die Entscheidung, ob ein Systemstart der erstmalige ist, verwandt. Die Regeln sind wie folgt:

    1. Das Kernelbefehlsargument systemd.condition-first-boot= kann dazu verwandt werden, die automatische Erkennungslogik außer Kraft zu setzen, siehe kernel-command-line(7).

    2. Andernfalls, falls /etc/machine-id nicht existiert, ist dies ein erstmaliger Systemstart. Während der frühen Systemstartphase wird systemd »uninitialized\n« in diese Datei schreiben und eine temporäre Datei darüber einhängen, die die eigentliche Maschinenkennung enthält. Später (nachdem first-boot-complete.target erreicht wurde) wird die echte Maschinenkennung auf Platte geschrieben.

    3. Falls /etc/machine-id die Zeichenkette »uninitialized« enthält, wird ein Systemstart auch als erstmaliger Systemstart betrachtet. Der gleiche Mechanismus wie oben beschrieben erfolgt.

    4. Falls /etc/machine-id existiert und leer ist, dann wird ein Systemstart nicht als erstmaliger Systemstart betrachtet. systemd wird weiterhin eine Bind-Einhängung einer Datei, die die eigentliche Maschinenkennung enthält, darüber ausführen und später versuchen, diese auf Platte zu schreiben (falls /etc/ schreibbar ist).

    5. Falls /etc/machine-id bereits eine gültige Maschinenkennung enthält, ist dies keine erstmaliger Systemstart.

Falls entsprechend der obigen Regeln ein erstmaliger Systemstart erkannt wurde, werden Units mit ConditionFirstBoot=yes ausgeführt und systemd wird zusätzliche Initialisierungsschritte durchlaufen, insbesondere das Voreinstellen von Units.

BEZUG ZU OSF UUIDS

Beachten Sie, dass die Maschinenkennung historisch gesehen weder eine OSF-UUID, wie sie durch RFC 4122[2] definiert wird, noch eine Microsoft GUID ist; beginnend mit Systemd v30 werden sich allerdings neu erstellte Maschinenkennungen als Variante 1 Version 4 UUIDs (gemäß RFC 4122) eignen.

Zur Wahrung der Kompatibilität mit bestehenden Installationen sollte jede Anwendung, die eine streng RFC-4122-konforme UUID benötigt, die Maschinenkennung dekodieren und dann die nachfolgenden (nicht rückgängig machbare) Aktionen anwenden, um sie in eine gültige RFC-4122-Variante-1-Version-4-UUID zu wandeln (hierbei ist »id« ein vorzeichenfreies Zeichenfeld):

    /* UUID auf Version 4 setzen --- wirklich zufällige Erzeugung */
    id[6] = (id[6] & 0x0F) | 0x40;
    /* Die UUID-Variante auf DCE setzen */
    id[8] = (id[8] & 0x3F) | 0x80;

(Dieser Code ist von »generate_random_uuid()« von drivers/char/random.c aus den Linux-Kernelquellen inspiriert.)

GESCHICHTE

Das einfache Konfigurationsdateiformat von /etc/machine-id entspringt der durch D-Bus eingeführten Datei /var/lib/dbus/machine-id. Tatsächlich kann letztere Datei ein Symlink auf /etc/machine-id sein.

SIEHE AUCH

systemd(1), systemd-machine-id-setup(1), gethostid(3), hostname(5), machine-info(5), os-release(5), sd-id128(3), sd_id128_get_machine(3), systemd-firstboot(1)

ANMERKUNGEN

1.  Sicheres Bauen von Abbildern
    https://systemd.io/BUILDING_IMAGES

2.  RFC 4122
    https://tools.ietf.org/html/rfc4122

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).