15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
23.10.2024

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 hostaLokalizacja przechowywaniaZakresPrzeżywa ponowne uruchomienie
Statyczna/etc/hostnameTrwała tożsamość systemuTak
PrzejściowaTylko środowisko uruchomieniowe jądraTymczasowa, ustawiana przez NTP/DHCPNie
Ładna/etc/machine-infoNazwa 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:

hostnamectl

Przykł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-64

Jeś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 -n

Metoda 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-hostname

hostnamectl 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" --transient

Krok 2: Zweryfikuj zmianę

hostnamectl

Upewnij się, że pole Static hostname pokazuje nową wartość. Sprawdź również, czy jądro ją odebrało:

hostname

Krok 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/hosts

Plik powinien zawierać co najmniej:

127.0.0.1   localhost
127.0.1.1   new-static-hostname.yourdomain.com  new-static-hostname

Druga 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-hostname

Jeś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/hostname

Plik 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-hostname

Krok 2: Zaktualizuj /etc/hosts

sudo nano /etc/hosts

Zastosuj 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-hostname

W systemach z dostępnym systemd-hostnamed nawet bez pełnej adopcji systemd:

sudo systemctl restart systemd-hostnamed

W 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 bash

Metoda 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.cfg

Znajdź lub dodaj następującą dyrektywę:

preserve_hostname: true

Alternatywnie 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
EOF

Po 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.conf

Dodaj 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=no

UseHostname=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 yes

Aby całkowicie uniemożliwić NetworkManager akceptowanie nazwy hosta z DHCP, dodaj do /etc/NetworkManager/NetworkManager.conf:

[main]
hostname-mode=none

Propagacja 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

MetodaZgodność z dystrybucjąWymaga ponownego uruchomieniaObsługuje cloud-initAktualizacja atomowa
hostnamectl set-hostnameDystrybucje systemdNieNie (wymaga preserve_hostname)Tak
Ręczna edycja /etc/hostnameWszystkie dystrybucjeNie (z poleceniem hostname)NieNie
Cloud-init preserve_hostnameInstancje chmuroweNieTakN/A
Konfiguracja klienta DHCP (supersede)Wszystkie dystrybucjeNieNieNie
NetworkManager nmcliSystemy zarządzane przez NMNieNieTak

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 hostnamectl przed zmianą i zapisz wynik do celów audytowych
  • Ustaw statyczną nazwę hosta za pomocą hostnamectl set-hostname lub edytując /etc/hostname
  • Zaktualizuj /etc/hosts zarówno z krótką nazwą hosta, jak i FQDN w tej samej linii
  • Jeśli system jest instancją chmurową, ustaw preserve_hostname: true w 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 --fqdn i hostnamectl zwracają spójne wartości
  • Sprawdź /var/log/syslog lub journalctl -b pod 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.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij