Wie man einem Linux-Rechner einen statischen Hostnamen zuweist
Ein statischer Hostname ist ein dauerhaft konfiguriertes, für Menschen lesbares Label, das einem Linux-System zugewiesen wird, über Neustarts hinaus bestehen bleibt und nicht von Netzwerkdiensten wie DHCP überschrieben wird. Im Gegensatz zu einem transienten Hostname – der dynamisch vom Netzwerk-Daemon gesetzt und beim nächsten Start zurückgesetzt werden kann – wird ein statischer Hostname auf der Festplatte gespeichert und bleibt maßgeblich, unabhängig davon, wie die Maschine ihre IP-Adresse erhält.
Dieser Unterschied ist in Produktionsumgebungen von enormer Bedeutung. Wenn Sie einen VPS oder dedizierten Server betreiben, ist ein stabiler Hostname der Anker für SSH-Known-Hosts-Einträge, TLS-Zertifikat-Subject-Alternative-Names, Syslog-Identifikatoren, Prometheus-Ziel-Labels und Kerberos-Prinzipalnamen. Ein Hostname, der sich nach einer DHCP-Erneuerung stillschweigend ändert, kann all diese gleichzeitig beschädigen.
Was genau ist ein Linux-Hostname?
Linux verfolgt drei verschiedene Hostname-Klassen, die jeweils einem anderen Zweck dienen:
| Hostname-Typ | Speicherort | Geltungsbereich | Überlebt Neustart |
|---|---|---|---|
| Statisch | /etc/hostname | Persistente Systemidentität | Ja |
| Transient | Nur Kernel-Laufzeit | Temporär, gesetzt durch NTP/DHCP | Nein |
| Pretty | /etc/machine-info | UTF-8-Anzeigename (Leerzeichen erlaubt) | Ja |
Der statische Hostname ist derjenige, den Sie absichtlich konfigurieren. Der transiente Hostname ist derjenige, den der Kernel aktuell verwendet – normalerweise identisch mit dem statischen, es sei denn, ein DHCP-Server oder systemd-timesyncd hat ihn überschrieben. Der Pretty-Hostname ist rein kosmetischer Natur (z. B. "Alex's Web Server") und wird niemals in DNS oder SSH verwendet.
Gültige statische Hostnamen folgen den RFC-1123-Regeln: nur Kleinbuchstaben, Ziffern und Bindestriche; keine Unterstriche; keine führenden oder abschließenden Bindestriche; maximal 63 Zeichen pro Label; maximal 253 Zeichen insgesamt für einen vollqualifizierten Domänennamen (FQDN).
Den aktuellen Hostname prüfen
Bevor Sie Änderungen vornehmen, überprüfen Sie den aktuellen Zustand aller drei Hostname-Typen:
hostnamectlBeispielausgabe auf einem systemd-basierten System:
Static hostname: old-server-name
Pretty hostname: Old Server Name
Transient hostname: dhcp-assigned-name
Icon name: computer-server
Chassis: server
Machine ID: a1b2c3d4e5f6...
Boot ID: 9f8e7d6c5b4a...
Operating System: Ubuntu 22.04.3 LTS
Kernel: Linux 5.15.0-91-generic
Architecture: x86-64Wenn der transiente Hostname vom statischen Hostname abweicht, überschreibt Ihr DHCP-Client den statischen Wert – ein Problem, das im Abschnitt zur Persistenz behandelt wird.
Für Systeme ohne hostnamectl verwenden Sie:
hostname
cat /etc/hostname
uname -nMethode 1: Verwendung von hostnamectl (systemd-basierte Distributionen)
Diese Methode gilt für Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux und jede Distribution, die systemd als PID 1 ausführt.
Schritt 1: Den statischen Hostname setzen
sudo hostnamectl set-hostname new-static-hostnamehostnamectl schreibt den Wert in /etc/hostname, ruft den sethostname(2)-Syscall auf, um den laufenden Kernel sofort zu aktualisieren, und benachrichtigt systemd-hostnamed – alles atomar. Ein Neustart ist nicht erforderlich.
Um alle drei Hostname-Typen gleichzeitig zu setzen:
sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transientSchritt 2: Die Änderung überprüfen
hostnamectlBestätigen Sie, dass das Feld Statischer Hostname Ihren neuen Wert anzeigt. Überprüfen Sie auch, ob der Kernel ihn übernommen hat:
hostnameSchritt 3: /etc/hosts aktualisieren
hostnamectl aktualisiert /etc/hosts nicht automatisch. Wenn diese Datei nicht aktualisiert wird, gibt sudo die Warnung unable to resolve host aus, Anwendungen, die gethostbyname() für den lokalen Hostname aufrufen, funktionieren nicht mehr, und Java-basierte Dienste (Elasticsearch, Kafka) können beim Start fehlschlagen.
sudo nano /etc/hostsDie Datei sollte mindestens Folgendes enthalten:
127.0.0.1 localhost
127.0.1.1 new-static-hostname.yourdomain.com new-static-hostnameDie zweite Zeile verwendet 127.0.1.1 (nicht 127.0.0.1) für den eigenen Hostname der Maschine auf Debian-basierten Systemen. Auf RHEL-basierten Systemen verwenden Sie stattdessen die tatsächliche primäre IP-Adresse:
192.168.1.50 new-static-hostname.yourdomain.com new-static-hostnameWenn Sie einen VPS mit cPanel verwalten, übernimmt das Hostname-Änderungswerkzeug von cPanel /etc/hosts automatisch, aber Sie sollten das Ergebnis dennoch manuell überprüfen.
Methode 2: Manuelles Bearbeiten von /etc/hostname (Nicht-systemd-Distributionen)
Diese Methode gilt für ältere Debian/Ubuntu-Versionen mit SysVinit oder Upstart, Alpine Linux, Gentoo mit OpenRC, Void Linux und eingebettete Systeme.
Schritt 1: /etc/hostname bearbeiten
sudo nano /etc/hostnameDie Datei sollte genau eine Zeile enthalten – den kurzen Hostname ohne abschließende Leerzeichen oder Zeilenumbrüche über den standardmäßigen Zeilenterminator hinaus:
new-static-hostnameSchritt 2: /etc/hosts aktualisieren
sudo nano /etc/hostsWenden Sie die gleiche Zuordnung an, die in Methode 1 beschrieben ist.
Schritt 3: Die Änderung ohne Neustart anwenden
Den laufenden Kernel sofort über den neuen Hostname informieren:
sudo hostname new-static-hostnameAuf Systemen, auf denen systemd-hostnamed auch ohne vollständige systemd-Einbindung verfügbar ist:
sudo systemctl restart systemd-hostnamedAuf reinen SysVinit-Systemen ist der obige hostname-Befehl ausreichend. Die Änderung tritt für alle neuen Prozesse in Kraft; bestehende Shells zeigen weiterhin die alte Eingabeaufforderung, bis Sie eine neue Terminalsitzung öffnen oder Folgendes ausführen:
exec bashMethode 3: Cloud-Init-Überschreibung (Kritisch für Cloud-VPS-Instanzen)
Dies ist das am häufigsten übersehene Szenario. Auf Cloud-Plattformen – einschließlich der meisten VPS-Anbieter – wird cloud-init bei jedem Start ausgeführt und setzt den Hostname auf den Wert zurück, den die Instanz-Metadaten-API zurückgibt. Ihre /etc/hostname-Änderung wird beim nächsten Neustart stillschweigend überschrieben.
Um einen statischen Hostname nach einem cloud-init-Durchlauf beizubehalten, bearbeiten Sie /etc/cloud/cloud.cfg:
sudo nano /etc/cloud/cloud.cfgSuchen oder fügen Sie die folgende Direktive hinzu:
preserve_hostname: trueAlternativ erstellen Sie eine Drop-in-Override-Datei, um die Änderung der paketverwalteten Konfiguration zu vermeiden:
sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOFNach dieser Änderung wird cloud-init den Hostname bei nachfolgenden Starts nicht mehr ändern.
Verhindern, dass DHCP den statischen Hostname überschreibt
Auch ohne cloud-init kann ein DHCP-Client den transienten Hostname überschreiben. Die Lösung hängt davon ab, welchen DHCP-Client Ihre Distribution verwendet.
Für dhclient (Debian/Ubuntu Legacy)
Bearbeiten Sie /etc/dhcp/dhclient.conf:
sudo nano /etc/dhcp/dhclient.confFügen Sie Folgendes hinzu oder ändern Sie es:
send host-name "new-static-hostname";
supersede host-name "new-static-hostname";Die supersede-Direktive stellt sicher, dass der Client jeden vom DHCP-Server angebotenen Hostname ignoriert.
Für systemd-networkd mit systemd-resolved
Bearbeiten oder erstellen Sie eine .network-Datei in /etc/systemd/network/:
[DHCP]
SendHostname=yes
UseHostname=noUseHostname=no verhindert, dass der vom DHCP angebotene Hostname den statischen überschreibt.
Für NetworkManager (die meisten Desktop- und modernen Server-Distributionen)
sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yesUm zu verhindern, dass NetworkManager einen Hostname von DHCP akzeptiert, fügen Sie Folgendes zu /etc/NetworkManager/NetworkManager.conf hinzu:
[main]
hostname-mode=noneHostname-Weitergabe: Was sonst noch informiert werden muss
Den Hostname im Betriebssystem zu setzen ist notwendig, aber in einer vernetzten Umgebung nicht ausreichend. Berücksichtigen Sie diese nachgelagerten Systeme:
- DNS-Forward- und Reverse-Einträge: Aktualisieren Sie den A-Eintrag und den PTR-Eintrag Ihrer DNS-Zone. Ohne einen passenden PTR-Eintrag werden viele Mailserver ausgehende E-Mails ablehnen, und einige Sicherheitstools markieren den Host als verdächtig.
- SSL/TLS-Zertifikate: Wenn Ihr Hostname Teil des CN oder SAN eines Zertifikats ist, benötigen Sie ein neues Zertifikat. SSL-Zertifikate, die an den alten Hostname gebunden sind, erzeugen Validierungsfehler.
- Domain-Registrierung und DNS-Weitergabe: Wenn der Hostname einem öffentlichen FQDN zugeordnet ist, aktualisieren Sie den DNS-Eintrag bei Ihrem Domain-Registrar und rechnen Sie mit TTL-basierter Weitergabezeit.
- Monitoring-Agenten: Prometheus Node Exporter, Datadog, Zabbix und ähnliche Agenten verwenden den Hostname als Label. Nach einer Hostname-Änderung können historische Metriken unter einer anderen Host-Identität erscheinen.
/etc/ssh/ssh_known_hosts: Clusterweite Known-Hosts-Dateien, die auf den alten Hostname verweisen, müssen aktualisiert werden.- Anwendungskonfigurationsdateien: Jeder fest kodierte Hostname in Anwendungskonfigurationen, JDBC-Verbindungszeichenfolgen oder beworbenen Listenern von Message-Brokern muss aktualisiert werden.
Vergleich: Hostname-Konfigurationsmethoden
| Methode | Distributions-Kompatibilität | Erfordert Neustart | Behandelt Cloud-Init | Atomares Update |
|---|---|---|---|---|
hostnamectl set-hostname | systemd-Distributionen | Nein | Nein (benötigt preserve_hostname) | Ja |
/etc/hostname manuell bearbeiten | Alle Distributionen | Nein (mit hostname-Befehl) | Nein | Nein |
Cloud-init preserve_hostname | Cloud-Instanzen | Nein | Ja | N/A |
DHCP-Client-Konfiguration (supersede) | Alle Distributionen | Nein | Nein | Nein |
NetworkManager nmcli | NM-verwaltete Systeme | Nein | Nein | Ja |
Reale Grenzfälle und Fallstricke
Fallstrick 1: Die sudo-Warnungsschleife. Wenn Sie den Hostname setzen, aber vergessen, /etc/hosts zu aktualisieren, gibt jeder sudo-Aufruf sudo: unable to resolve host new-static-hostname aus. Dies ist nicht fatal, fügt aber jedem privilegierten Befehl Latenz hinzu und überflutet die Logs.
Fallstrick 2: Java-Dienste verweigern den Start. Javas InetAddress.getLocalHost() löst den Hostname über gethostbyname() auf. Wenn der Hostname nicht in /etc/hosts enthalten oder über DNS auflösbar ist, werfen Dienste wie Elasticsearch, Kafka und Cassandra beim Start UnknownHostException.
Fallstrick 3: Hostname mit Unterstrichen. Obwohl Unterstriche in Hostnamen informell weit verbreitet sind, verstoßen sie gegen RFC 952 und RFC 1123. Einige DNS-Resolver, TLS-Bibliotheken und Kubernetes-Komponenten werden sie ablehnen oder falsch behandeln. Verwenden Sie ausschließlich Bindestriche.
Fallstrick 4: FQDN vs. kurzer Hostname. hostnamectl speichert nur den kurzen Hostname (z. B. web01). Der FQDN (z. B. web01.example.com) wird durch die Kombination des kurzen Hostnamens mit der Domain-Suchliste in /etc/resolv.conf oder /etc/systemd/resolved.conf aufgelöst. Setzen Sie Domains=example.com in resolved.conf oder search example.com in resolv.conf, damit hostname --fqdn den korrekten Wert zurückgibt.
Fallstrick 5: Container- und Namespace-Isolation. Innerhalb eines Docker-Containers oder LXC-Namespaces kann hostnamectl mit Failed to connect to bus: No such file or directory fehlschlagen, weil systemd-hostnamed nicht ausgeführt wird. Verwenden Sie hostname new-name direkt, oder setzen Sie den Hostname zur Erstellungszeit des Containers über docker run --hostname oder den hostname:-Schlüssel in docker-compose.yml.
Praktische Entscheidungs-Checkliste
Verwenden Sie diese Checkliste vor und nach jeder Hostname-Änderung in einer Produktionsumgebung:
- Bestätigen Sie, dass der neue Hostname RFC-1123-konform ist (Kleinbuchstaben, nur Bindestriche, max. 63 Zeichen pro Label)
- Führen Sie
hostnamectlvor der Änderung aus und speichern Sie die Ausgabe für Prüfzwecke - Setzen Sie den statischen Hostname mit
hostnamectl set-hostnameoder durch Bearbeiten von/etc/hostname - Aktualisieren Sie
/etc/hostsmit dem kurzen Hostname und dem FQDN in derselben Zeile - Wenn das System eine Cloud-Instanz ist, setzen Sie
preserve_hostname: truein der cloud-init-Konfiguration - Wenn DHCP aktiv ist, konfigurieren Sie den DHCP-Client so, dass er vom Server angebotene Hostnamen ignoriert
- Aktualisieren Sie DNS-A- und PTR-Einträge
- Erneuern oder stellen Sie alle TLS-Zertifikate neu aus, die auf den alten Hostname verweisen
- Starten Sie hostname-abhängige Dienste neu (Syslog, Monitoring-Agenten, Java-Anwendungen)
- Öffnen Sie eine neue Shell-Sitzung und überprüfen Sie, ob
hostname,hostname --fqdnundhostnamectlalle konsistente Werte zurückgeben - Überprüfen Sie
/var/log/syslogoderjournalctl -bauf Fehler nach der Änderung, die auf den alten Hostname verweisen
FAQ
Erfordert hostnamectl set-hostname einen Neustart, um wirksam zu werden?
Nein. hostnamectl ruft den sethostname(2)-Systemaufruf sofort auf und aktualisiert den laufenden Kernel in Echtzeit. Die Änderung wird auch in /etc/hostname für die Persistenz geschrieben. Neue Prozesse und neue Shell-Sitzungen sehen den aktualisierten Hostname ohne Neustart.
Warum wird mein Hostname nach jedem Neustart auf einem Cloud-VPS zurückgesetzt?
Cloud-init überschreibt ihn mit ziemlicher Sicherheit. Fügen Sie preserve_hostname: true zu /etc/cloud/cloud.cfg hinzu oder erstellen Sie eine Drop-in-Datei unter /etc/cloud/cloud.cfg.d/99_hostname.cfg mit derselben Direktive. Dies ist die häufigste Ursache für Hostname-Rücksetzungen auf cloud-gehosteten Maschinen.
Was ist der Unterschied zwischen 127.0.0.1 und 127.0.1.1 in /etc/hosts?
127.0.0.1 ist die Standard-Loopback-Adresse, die localhost zugeordnet ist. Debian-basierte Distributionen verwenden 127.0.1.1 als sekundäre Loopback-Adresse speziell für den eigenen Hostname der Maschine, um Konflikte zu vermeiden, wenn die Maschine keine statische IP hat. Auf RHEL-basierten Systemen und Maschinen mit einer festen IP verwenden Sie stattdessen die tatsächliche primäre IP-Adresse für die Hostname-Zuordnung.
Kann ich einen Unterstrich in einem Linux-Hostname verwenden?
Technisch gesehen akzeptiert das Betriebssystem ihn, aber Sie sollten es nicht tun. Unterstriche verstoßen gegen RFC 952 und RFC 1123. Sie verursachen Fehler bei der DNS-Auflösung (BIND lehnt sie standardmäßig ab), der TLS-Zertifikatsvalidierung und der Kubernetes-Node-Benennung. Verwenden Sie ausschließlich Bindestriche.
Wie überprüfe ich, ob der Hostname über alle Systemschichten hinweg vollständig konsistent ist?
Führen Sie die folgende Sequenz aus und bestätigen Sie, dass alle Ausgaben übereinstimmen:
hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"Wenn einer dieser Befehle unterschiedliche Werte zurückgibt, überschreibt noch eine der Schichten – cloud-init, DHCP-Client oder NetworkManager – die statische Einstellung.
