Jak przypisać statyczną nazwę hosta do maszyny Linux
Statyczna nazwa hosta to trwale skonfigurowana, czytelna dla człowieka etykieta przypisana do systemu Linux, która utrzymuje się po ponownym uruchomieniu i nie jest nadpisywana przez usługi sieciowe, takie jak DHCP. W przeciwieństwie do przejściowej nazwy hosta — która może być ustawiana dynamicznie przez demona sieciowego i resetowana przy następnym uruchomieniu — statyczna nazwa hosta jest przechowywana na dysku i pozostaje miarodajna niezależnie od tego, w jaki sposób maszyna uzyskuje swój adres IP.
To rozróżnienie ma ogromne znaczenie w środowiskach produkcyjnych. Gdy uruchamiasz VPS lub serwer dedykowany, stabilna nazwa hosta jest punktem odniesienia dla wpisów SSH known-hosts, alternatywnych nazw podmiotów certyfikatów TLS, identyfikatorów syslog, etykiet docelowych Prometheus oraz nazw głównych Kerberos. Nazwa hosta, która cicho zmienia się po odnowieniu DHCP, może jednocześnie zepsuć to wszystko.
Czym dokładnie jest nazwa hosta w systemie Linux?
Linux śledzi trzy odrębne klasy nazw hostów, z których każda służy innemu celowi:
| Typ nazwy hosta | Lokalizacja przechowywania | Zakres | Przeżywa ponowne uruchomienie |
|---|---|---|---|
| Statyczna | /etc/hostname | Trwała tożsamość systemu | Tak |
| Przejściowa | Tylko środowisko uruchomieniowe jądra | Tymczasowa, ustawiana przez NTP/DHCP | Nie |
| Ładna | /etc/machine-info | Nazwa wyświetlana UTF-8 (dozwolone spacje) | Tak |
Statyczna nazwa hosta to ta, którą konfigurujesz celowo. Przejściowa nazwa hosta to ta, której aktualnie używa jądro — zazwyczaj identyczna ze statyczną, chyba że serwer DHCP lub systemd-timesyncd ją nadpisał. Ładna nazwa hosta jest czysto kosmetyczna (np. "Alex's Web Server") i nigdy nie jest używana w DNS ani SSH.
Prawidłowe statyczne nazwy hostów przestrzegają zasad RFC 1123: tylko małe litery, cyfry i myślniki; bez podkreśleń; bez myślników na początku lub końcu; maksymalnie 63 znaki na etykietę; maksymalnie 253 znaki łącznie dla w pełni kwalifikowanej nazwy domeny (FQDN).
Sprawdzanie bieżącej nazwy hosta
Przed wprowadzeniem jakichkolwiek zmian sprawdź bieżący stan wszystkich trzech typów nazw hostów:
hostnamectlPrzykładowe wyjście w systemie opartym na systemd:
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-64Jeśli przejściowa nazwa hosta różni się od statycznej nazwy hosta, klient DHCP nadpisuje wartość statyczną — problem ten jest omówiony w sekcji dotyczącej trwałości poniżej.
W przypadku systemów bez hostnamectl użyj:
hostname
cat /etc/hostname
uname -nMetoda 1: Używanie hostnamectl (dystrybucje oparte na systemd)
Ta metoda dotyczy Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux oraz każdej dystrybucji uruchamiającej systemd jako PID 1.
Krok 1: Ustaw statyczną nazwę hosta
sudo hostnamectl set-hostname new-static-hostnamehostnamectl zapisuje wartość do /etc/hostname, wywołuje syscall sethostname(2) w celu natychmiastowej aktualizacji działającego jądra i powiadamia systemd-hostnamed — wszystko atomowo. Ponowne uruchomienie nie jest wymagane.
Aby jednocześnie ustawić wszystkie trzy typy nazw hostów:
sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transientKrok 2: Zweryfikuj zmianę
hostnamectlUpewnij się, że pole Static hostname pokazuje nową wartość. Sprawdź również, czy jądro ją odebrało:
hostnameKrok 3: Zaktualizuj /etc/hosts
hostnamectl nie aktualizuje automatycznie /etc/hosts. Brak aktualizacji tego pliku powoduje, że sudo emituje ostrzeżenie unable to resolve host, psuje aplikacje wywołujące gethostbyname() na lokalnej nazwie hosta i może powodować niepowodzenie uruchamiania usług opartych na Java (Elasticsearch, Kafka).
sudo nano /etc/hostsPlik powinien zawierać co najmniej:
127.0.0.1 localhost
127.0.1.1 new-static-hostname.yourdomain.com new-static-hostnameDruga linia używa 127.0.1.1 (nie 127.0.0.1) dla własnej nazwy hosta maszyny w systemach z rodziny Debian. W systemach z rodziny RHEL zamiast tego użyj rzeczywistego podstawowego adresu IP:
192.168.1.50 new-static-hostname.yourdomain.com new-static-hostnameJeśli zarządzasz VPS z cPanel, narzędzie do zmiany nazwy hosta cPanel obsługuje /etc/hosts automatycznie, ale nadal powinieneś ręcznie zweryfikować wynik.
Metoda 2: Ręczna edycja /etc/hostname (dystrybucje bez systemd)
Ta metoda dotyczy starszych wydań Debian/Ubuntu używających SysVinit lub Upstart, Alpine Linux, Gentoo z OpenRC, Void Linux oraz systemów wbudowanych.
Krok 1: Edytuj /etc/hostname
sudo nano /etc/hostnamePlik powinien zawierać dokładnie jedną linię — krótką nazwę hosta bez końcowych białych znaków ani znaku nowej linii poza standardowym terminatorem linii:
new-static-hostnameKrok 2: Zaktualizuj /etc/hosts
sudo nano /etc/hostsZastosuj to samo mapowanie opisane w Metodzie 1.
Krok 3: Zastosuj zmianę bez ponownego uruchamiania
Natychmiast powiadom działające jądro o nowej nazwie hosta:
sudo hostname new-static-hostnameW systemach z dostępnym systemd-hostnamed nawet bez pełnej adopcji systemd:
sudo systemctl restart systemd-hostnamedW czystych systemach SysVinit powyższe polecenie hostname jest wystarczające. Zmiana wchodzi w życie dla wszystkich nowych procesów; istniejące powłoki nadal będą wyświetlać stary monit, dopóki nie otworzysz nowej sesji terminala lub nie uruchomisz:
exec bashMetoda 3: Nadpisanie cloud-init (krytyczne dla instancji VPS w chmurze)
To najczęściej pomijany scenariusz. Na platformach chmurowych — w tym u większości dostawców VPS — cloud-init uruchamia się przy każdym rozruchu i resetuje nazwę hosta do wartości zwracanej przez API metadanych instancji. Twoja zmiana /etc/hostname zostanie cicho nadpisana przy następnym ponownym uruchomieniu.
Aby statyczna nazwa hosta przeżyła cloud-init, edytuj /etc/cloud/cloud.cfg:
sudo nano /etc/cloud/cloud.cfgZnajdź lub dodaj następującą dyrektywę:
preserve_hostname: trueAlternatywnie utwórz plik nadpisania drop-in, aby uniknąć modyfikowania konfiguracji zarządzanej przez pakiet:
sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOFPo tej zmianie cloud-init nie będzie już dotykał nazwy hosta przy kolejnych uruchomieniach.
Zapobieganie nadpisywaniu statycznej nazwy hosta przez DHCP
Nawet bez cloud-init klient DHCP może nadpisać przejściową nazwę hosta. Rozwiązanie zależy od tego, którego klienta DHCP używa Twoja dystrybucja.
Dla dhclient (starsza wersja Debian/Ubuntu)
Edytuj /etc/dhcp/dhclient.conf:
sudo nano /etc/dhcp/dhclient.confDodaj lub zmodyfikuj:
send host-name "new-static-hostname";
supersede host-name "new-static-hostname";Dyrektywa supersede zapewnia, że klient ignoruje wszelkie nazwy hostów oferowane przez serwer DHCP.
Dla systemd-networkd z systemd-resolved
Edytuj lub utwórz plik .network w /etc/systemd/network/:
[DHCP]
SendHostname=yes
UseHostname=noUseHostname=no zapobiega nadpisywaniu statycznej nazwy hosta przez nazwę oferowaną przez DHCP.
Dla NetworkManager (większość dystrybucji desktopowych i nowoczesnych serwerowych)
sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yesAby całkowicie uniemożliwić NetworkManager akceptowanie nazwy hosta z DHCP, dodaj do /etc/NetworkManager/NetworkManager.conf:
[main]
hostname-mode=nonePropagacja nazwy hosta: co jeszcze musi wiedzieć
Ustawienie nazwy hosta w systemie operacyjnym jest konieczne, ale niewystarczające w środowisku sieciowym. Weź pod uwagę te systemy podrzędne:
- Rekordy DNS forward i reverse: Zaktualizuj rekord A i rekord PTR swojej strefy DNS. Bez pasującego rekordu PTR wiele serwerów pocztowych odrzuci wychodzące wiadomości e-mail, a niektóre narzędzia bezpieczeństwa oznaczą hosta jako podejrzany.
- Certyfikaty SSL/TLS: Jeśli Twoja nazwa hosta jest częścią CN lub SAN certyfikatu, potrzebujesz nowego certyfikatu. Certyfikaty SSL powiązane ze starą nazwą hosta będą generować błędy walidacji.
- Rejestracja domeny i propagacja DNS: Jeśli nazwa hosta mapuje się na publiczną nazwę FQDN, zaktualizuj rekord DNS u swojego rejestratora domen i poczekaj na czas propagacji oparty na TTL.
- Agenty monitorowania: Eksporter węzłów Prometheus, Datadog, Zabbix i podobne agenty używają nazwy hosta jako etykiety. Po zmianie nazwy hosta historyczne metryki mogą pojawiać się pod inną tożsamością hosta.
/etc/ssh/ssh_known_hosts: Pliki known-hosts obejmujące cały klaster, odwołujące się do starej nazwy hosta, muszą zostać zaktualizowane.- Pliki konfiguracyjne aplikacji: Wszelkie zakodowane na stałe nazwy hostów w konfiguracjach aplikacji, ciągach połączeń JDBC lub reklamowanych listenerach brokerów wiadomości muszą zostać zaktualizowane.
Porównanie: metody konfiguracji nazwy hosta
| Metoda | Zgodność z dystrybucją | Wymaga ponownego uruchomienia | Obsługuje cloud-init | Aktualizacja atomowa |
|---|---|---|---|---|
hostnamectl set-hostname | Dystrybucje systemd | Nie | Nie (wymaga preserve_hostname) | Tak |
Ręczna edycja /etc/hostname | Wszystkie dystrybucje | Nie (z poleceniem hostname) | Nie | Nie |
Cloud-init preserve_hostname | Instancje chmurowe | Nie | Tak | N/A |
Konfiguracja klienta DHCP (supersede) | Wszystkie dystrybucje | Nie | Nie | Nie |
NetworkManager nmcli | Systemy zarządzane przez NM | Nie | Nie | Tak |
Rzeczywiste przypadki brzegowe i pułapki
Pułapka 1: Pętla ostrzeżeń sudo. Jeśli ustawisz nazwę hosta, ale zapomnisz zaktualizować /etc/hosts, każde wywołanie sudo wydrukuje sudo: unable to resolve host new-static-hostname. Nie jest to krytyczne, ale dodaje opóźnienie do każdego uprzywilejowanego polecenia i zalewa logi.
Pułapka 2: Usługi Java odmawiają uruchomienia. InetAddress.getLocalHost() Javy rozwiązuje nazwę hosta przez gethostbyname(). Jeśli nazwa hosta nie znajduje się w /etc/hosts ani nie jest rozwiązywalna przez DNS, usługi takie jak Elasticsearch, Kafka i Cassandra zgłaszają UnknownHostException podczas uruchamiania.
Pułapka 3: Nazwa hosta z podkreśleniami. Pomimo powszechnego nieformalnego użycia, podkreślenia w nazwach hostów naruszają RFC 952 i RFC 1123. Niektóre resolvery DNS, biblioteki TLS i komponenty Kubernetes odrzucą je lub nieprawidłowo je obsłużą. Zawsze używaj myślników.
Pułapka 4: FQDN a krótka nazwa hosta. hostnamectl przechowuje tylko krótką nazwę hosta (np. web01). FQDN (np. web01.example.com) jest rozwiązywana przez połączenie krótkiej nazwy hosta z listą wyszukiwania domen w /etc/resolv.conf lub /etc/systemd/resolved.conf. Ustaw Domains=example.com w resolved.conf lub search example.com w resolv.conf, aby hostname --fqdn zwracało poprawną wartość.
Pułapka 5: Izolacja kontenerów i przestrzeni nazw. Wewnątrz kontenera Docker lub przestrzeni nazw LXC hostnamectl może zakończyć się niepowodzeniem z Failed to connect to bus: No such file or directory, ponieważ systemd-hostnamed nie jest uruchomiony. Użyj bezpośrednio hostname new-name lub ustaw nazwę hosta podczas tworzenia kontenera za pomocą docker run --hostname lub klucza hostname: w docker-compose.yml.
Praktyczna lista kontrolna decyzji
Użyj tej listy kontrolnej przed i po każdej zmianie nazwy hosta w środowisku produkcyjnym:
- Potwierdź, że nowa nazwa hosta jest zgodna z RFC 1123 (małe litery, tylko myślniki, maks. 63 znaki na etykietę)
- Uruchom
hostnamectlprzed zmianą i zapisz wynik do celów audytowych - Ustaw statyczną nazwę hosta za pomocą
hostnamectl set-hostnamelub edytując/etc/hostname - Zaktualizuj
/etc/hostszarówno z krótką nazwą hosta, jak i FQDN w tej samej linii - Jeśli system jest instancją chmurową, ustaw
preserve_hostname: truew konfiguracji cloud-init - Jeśli DHCP jest aktywny, skonfiguruj klienta DHCP tak, aby ignorował nazwy hostów oferowane przez serwer
- Zaktualizuj rekordy DNS A i PTR
- Odnów lub ponownie wydaj wszelkie certyfikaty TLS odwołujące się do starej nazwy hosta
- Uruchom ponownie usługi zależne od nazwy hosta (syslog, agenty monitorowania, aplikacje Java)
- Otwórz nową sesję powłoki i sprawdź, czy
hostname,hostname --fqdnihostnamectlzwracają spójne wartości - Sprawdź
/var/log/sysloglubjournalctl -bpod kątem błędów po zmianie odwołujących się do starej nazwy hosta
FAQ
Czy hostnamectl set-hostname wymaga ponownego uruchomienia, aby wejść w życie?
Nie. hostnamectl natychmiast wywołuje wywołanie systemowe sethostname(2), aktualizując działające jądro w czasie rzeczywistym. Zmiana jest również zapisywana do /etc/hostname w celu zapewnienia trwałości. Nowe procesy i nowe sesje powłoki zobaczą zaktualizowaną nazwę hosta bez żadnego ponownego uruchomienia.
Dlaczego moja nazwa hosta wraca do poprzedniej wartości po każdym ponownym uruchomieniu na VPS w chmurze?
Cloud-init prawie na pewno ją nadpisuje. Dodaj preserve_hostname: true do /etc/cloud/cloud.cfg lub utwórz plik drop-in pod /etc/cloud/cloud.cfg.d/99_hostname.cfg z tą samą dyrektywą. Jest to najczęstsza przyczyna przywracania nazwy hosta na maszynach hostowanych w chmurze.
Jaka jest różnica między 127.0.0.1 a 127.0.1.1 w /etc/hosts?
127.0.0.1 to standardowy adres pętli zwrotnej mapowany na localhost. Dystrybucje z rodziny Debian używają 127.0.1.1 jako pomocniczego adresu pętli zwrotnej specjalnie dla własnej nazwy hosta maszyny, unikając konfliktów, gdy maszyna nie ma statycznego adresu IP. W systemach z rodziny RHEL i maszynach ze stałym adresem IP zamiast tego użyj rzeczywistego podstawowego adresu IP dla mapowania nazwy hosta.
Czy mogę używać podkreślenia w nazwie hosta Linux?
Technicznie system operacyjny to zaakceptuje, ale nie powinieneś tego robić. Podkreślenia naruszają RFC 952 i RFC 1123. Powodują błędy w rozwiązywaniu DNS (BIND domyślnie je odrzuca), walidacji certyfikatów TLS i nazewnictwie węzłów Kubernetes. Używaj wyłącznie myślników.
Jak sprawdzić, czy nazwa hosta jest w pełni spójna we wszystkich warstwach systemu?
Uruchom następującą sekwencję i potwierdź, że wszystkie wyniki są zgodne:
hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"Jeśli którakolwiek z tych wartości zwraca różne wyniki, jedna z warstw — cloud-init, klient DHCP lub NetworkManager — nadal nadpisuje ustawienie statyczne.
