Cum să Atribuiți un Nume de Gazdă Static unei Mașini Linux
Un hostname static este o etichetă permanent configurată, ușor de citit de oameni, atribuită unui sistem Linux, care persistă după reporniri și nu este suprascrisă de servicii de rețea precum DHCP. Spre deosebire de un hostname tranzitoriu — care poate fi setat dinamic de daemonul de rețea și resetat la următoarea pornire — un hostname static este stocat pe disc și rămâne autoritar indiferent de modul în care mașina obține adresa sa IP.
Această distincție contează enorm în mediile de producție. Când rulați un VPS sau un server dedicat, un hostname stabil este ancora pentru intrările SSH known-hosts, Numele Alternative ale Subiectului certificatelor TLS, identificatorii syslog, etichetele țintă Prometheus și numele principale Kerberos. Un hostname care se schimbă silențios după o reînnoire DHCP poate rupe toate acestea simultan.
Ce Este Exact un Hostname Linux?
Linux urmărește trei clase distincte de hostname, fiecare servind unui scop diferit:
| Tip Hostname | Locație Stocare | Domeniu | Supraviețuiește Repornirii |
|---|---|---|---|
| Static | /etc/hostname | Identitate persistentă a sistemului | Da |
| Tranzitoriu | Doar runtime kernel | Temporar, setat de NTP/DHCP | Nu |
| Estetic | /etc/machine-info | Nume de afișare UTF-8 (spațiile sunt permise) | Da |
Hostname-ul static este cel pe care îl configurați intenționat. Hostname-ul tranzitoriu este cel pe care kernelul îl folosește în prezent — de obicei identic cu cel static, cu excepția cazului în care un server DHCP sau systemd-timesyncd l-a suprascris. Hostname-ul estetic este pur cosmetic (ex., "Alex's Web Server") și nu este niciodată folosit în DNS sau SSH.
Hostname-urile statice valide urmează regulile RFC 1123: doar litere mici, cifre și cratime; fără underscore-uri; fără cratime la început sau la sfârșit; maximum 63 de caractere per etichetă; maximum 253 de caractere total pentru un nume de domeniu complet calificat (FQDN).
Verificarea Hostname-ului Curent
Înainte de a face orice modificări, auditați starea curentă a tuturor celor trei tipuri de hostname:
hostnamectlExemplu de ieșire pe un sistem bazat pe 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-64Dacă Hostname-ul Tranzitoriu diferă de Hostname-ul Static, clientul dvs. DHCP suprascrie valoarea statică — o problemă abordată în secțiunea de persistență de mai jos.
Pentru sistemele fără hostnamectl, folosiți:
hostname
cat /etc/hostname
uname -nMetoda 1: Utilizarea hostnamectl (Distribuții bazate pe systemd)
Această metodă se aplică pentru Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux și orice distribuție care rulează systemd ca PID 1.
Pasul 1: Setați Hostname-ul Static
sudo hostnamectl set-hostname new-static-hostnamehostnamectl scrie valoarea în /etc/hostname, apelează syscall-ul sethostname(2) pentru a actualiza kernelul care rulează imediat și notifică systemd-hostnamed — toate atomic. Nu este necesară repornirea.
Pentru a seta simultan toate cele trei tipuri de hostname:
sudo hostnamectl set-hostname "new-static-hostname" --static
sudo hostnamectl set-hostname "New Static Hostname" --pretty
sudo hostnamectl set-hostname "new-static-hostname" --transientPasul 2: Verificați Modificarea
hostnamectlConfirmați că câmpul Static hostname afișează noua dvs. valoare. Verificați de asemenea că kernelul a preluat-o:
hostnamePasul 3: Actualizați /etc/hosts
hostnamectl nu actualizează /etc/hosts automat. Neactualizarea acestui fișier determină sudo să emită avertismentul unable to resolve host, strică aplicațiile care apelează gethostbyname() pe hostname-ul local și poate cauza eșecul serviciilor bazate pe Java (Elasticsearch, Kafka) la pornire.
sudo nano /etc/hostsFișierul ar trebui să conțină cel puțin:
127.0.0.1 localhost
127.0.1.1 new-static-hostname.yourdomain.com new-static-hostnameA doua linie folosește 127.0.1.1 (nu 127.0.0.1) pentru hostname-ul propriu al mașinii pe sistemele din familia Debian. Pe sistemele din familia RHEL, folosiți în schimb adresa IP primară reală:
192.168.1.50 new-static-hostname.yourdomain.com new-static-hostnameDacă gestionați un VPS cu cPanel, instrumentul de schimbare a hostname-ului din cPanel gestionează /etc/hosts automat, dar ar trebui să verificați totuși rezultatul manual.
Metoda 2: Editarea Manuală a /etc/hostname (Distribuții non-systemd)
Această metodă se aplică pentru versiunile mai vechi de Debian/Ubuntu care folosesc SysVinit sau Upstart, Alpine Linux, Gentoo cu OpenRC, Void Linux și sisteme embedded.
Pasul 1: Editați /etc/hostname
sudo nano /etc/hostnameFișierul ar trebui să conțină exact o linie — hostname-ul scurt fără spații albe finale sau linie nouă dincolo de terminatorul standard de linie:
new-static-hostnamePasul 2: Actualizați /etc/hosts
sudo nano /etc/hostsAplicați aceeași mapare descrisă în Metoda 1.
Pasul 3: Aplicați Modificarea Fără Repornire
Notificați kernelul care rulează despre noul hostname imediat:
sudo hostname new-static-hostnamePe sistemele cu systemd-hostnamed disponibil chiar și fără adoptarea completă a systemd:
sudo systemctl restart systemd-hostnamedPe sistemele SysVinit pure, comanda hostname de mai sus este suficientă. Modificarea intră în vigoare pentru toate procesele noi; shell-urile existente vor afișa în continuare promptul vechi până când deschideți o nouă sesiune de terminal sau rulați:
exec bashMetoda 3: Suprascrierea Cloud-Init (Critică pentru Instanțele Cloud VPS)
Acesta este cel mai frecvent scenariu ratat. Pe platformele cloud — inclusiv majoritatea furnizorilor VPS — cloud-init rulează la fiecare pornire și resetează hostname-ul la ceea ce returnează API-ul de metadate al instanței. Modificarea dvs. /etc/hostname va fi suprascrisă silențios la următoarea repornire.
Pentru a face un hostname static să supraviețuiască cloud-init, editați /etc/cloud/cloud.cfg:
sudo nano /etc/cloud/cloud.cfgGăsiți sau adăugați următoarea directivă:
preserve_hostname: trueAlternativ, creați un fișier de suprascrie drop-in pentru a evita modificarea configurației gestionate de pachet:
sudo mkdir -p /etc/cloud/cloud.cfg.d/
sudo tee /etc/cloud/cloud.cfg.d/99_hostname.cfg > /dev/null <<EOF
preserve_hostname: true
EOFDupă această modificare, cloud-init nu va mai atinge hostname-ul la pornirile ulterioare.
Prevenirea Suprascrierii Hostname-ului Static de către DHCP
Chiar și fără cloud-init, un client DHCP poate suprascrie hostname-ul tranzitoriu. Remedierea depinde de clientul DHCP pe care îl folosește distribuția dvs.
Pentru dhclient (Debian/Ubuntu legacy)
Editați /etc/dhcp/dhclient.conf:
sudo nano /etc/dhcp/dhclient.confAdăugați sau modificați:
send host-name "new-static-hostname";
supersede host-name "new-static-hostname";Directiva supersede asigură că clientul ignoră orice hostname oferit de serverul DHCP.
Pentru systemd-networkd cu systemd-resolved
Editați sau creați un fișier .network în /etc/systemd/network/:
[DHCP]
SendHostname=yes
UseHostname=noUseHostname=no împiedică hostname-ul oferit de DHCP să suprascrie cel static.
Pentru NetworkManager (majoritatea distribuțiilor desktop și server moderne)
sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yesPentru a împiedica NetworkManager să accepte complet un hostname de la DHCP, adăugați în /etc/NetworkManager/NetworkManager.conf:
[main]
hostname-mode=nonePropagarea Hostname-ului: Ce Altceva Trebuie să Știe
Setarea hostname-ului în sistemul de operare este necesară, dar nu suficientă într-un mediu în rețea. Luați în considerare aceste sisteme din aval:
- Înregistrările DNS forward și reverse: Actualizați înregistrarea A și înregistrarea PTR din zona dvs. DNS. Fără o înregistrare PTR corespunzătoare, multe servere de mail vor respinge emailul de ieșire, iar unele instrumente de securitate vor marca gazda ca suspectă.
- Certificate SSL/TLS: Dacă hostname-ul dvs. face parte din CN sau SAN al unui certificat, aveți nevoie de un certificat nou. Certificatele SSL legate de hostname-ul vechi vor produce erori de validare.
- Înregistrarea domeniului și propagarea DNS: Dacă hostname-ul corespunde unui FQDN public, actualizați înregistrarea DNS la registratorul dvs. de domenii și așteptați timpul de propagare bazat pe TTL.
- Agenți de monitorizare: Exportatorul de noduri Prometheus, Datadog, Zabbix și agenți similari folosesc hostname-ul ca etichetă. După o schimbare de hostname, metricile istorice pot apărea sub o identitate de gazdă diferită.
/etc/ssh/ssh_known_hosts: Fișierele known-hosts la nivel de cluster care referențiază hostname-ul vechi trebuie actualizate.- Fișiere de configurare ale aplicațiilor: Orice hostname hardcodat în configurațiile aplicațiilor, șirurile de conexiune JDBC sau ascultătorii anunțați ai brokerilor de mesaje trebuie actualizat.
Comparație: Metode de Configurare a Hostname-ului
| Metodă | Compatibilitate Distribuție | Necesită Repornire | Gestionează Cloud-Init | Actualizare Atomică |
|---|---|---|---|---|
hostnamectl set-hostname | Distribuții systemd | Nu | Nu (necesită preserve_hostname) | Da |
Editare manuală /etc/hostname | Toate distribuțiile | Nu (cu comanda hostname) | Nu | Nu |
Cloud-init preserve_hostname | Instanțe cloud | Nu | Da | N/A |
Config client DHCP (supersede) | Toate distribuțiile | Nu | Nu | Nu |
NetworkManager nmcli | Sisteme gestionate de NM | Nu | Nu | Da |
Cazuri Limită și Capcane din Lumea Reală
Capcana 1: Bucla de avertisment sudo. Dacă setați hostname-ul dar uitați să actualizați /etc/hosts, fiecare invocare sudo va afișa sudo: unable to resolve host new-static-hostname. Aceasta nu este fatală, dar adaugă latență la fiecare comandă privilegiată și inundă jurnalele.
Capcana 2: Serviciile Java refuză să pornească. InetAddress.getLocalHost() din Java rezolvă hostname-ul prin gethostbyname(). Dacă hostname-ul nu se află în /etc/hosts sau nu poate fi rezolvat prin DNS, servicii precum Elasticsearch, Kafka și Cassandra aruncă UnknownHostException la pornire.
Capcana 3: Hostname cu underscore-uri. Deși sunt utilizate pe scară largă informal, underscore-urile în hostname-uri violează RFC 952 și RFC 1123. Unii rezolvatori DNS, biblioteci TLS și componente Kubernetes le vor respinge sau le vor gestiona greșit. Folosiți întotdeauna cratime.
Capcana 4: FQDN vs. hostname scurt. hostnamectl stochează doar hostname-ul scurt (ex., web01). FQDN-ul (ex., web01.example.com) este rezolvat prin combinarea hostname-ului scurt cu lista de căutare a domeniului din /etc/resolv.conf sau /etc/systemd/resolved.conf. Setați Domains=example.com în resolved.conf sau search example.com în resolv.conf pentru ca hostname --fqdn să returneze valoarea corectă.
Capcana 5: Izolarea containerelor și a spațiilor de nume. În interiorul unui container Docker sau al unui spațiu de nume LXC, hostnamectl poate eșua cu Failed to connect to bus: No such file or directory deoarece systemd-hostnamed nu rulează. Folosiți hostname new-name direct, sau setați hostname-ul la momentul creării containerului prin docker run --hostname sau cheia hostname: din docker-compose.yml.
Listă de Verificare Practică pentru Decizii
Folosiți această listă de verificare înainte și după fiecare schimbare de hostname într-un mediu de producție:
- Confirmați că noul hostname este conform RFC 1123 (litere mici, doar cratime, max 63 caractere per etichetă)
- Rulați
hostnamectlînainte de modificare și salvați ieșirea în scopuri de audit - Setați hostname-ul static cu
hostnamectl set-hostnamesau prin editarea/etc/hostname - Actualizați
/etc/hostscu atât hostname-ul scurt cât și FQDN-ul pe aceeași linie - Dacă sistemul este o instanță cloud, setați
preserve_hostname: trueîn configurația cloud-init - Dacă DHCP este activ, configurați clientul DHCP să ignore hostname-urile oferite de server
- Actualizați înregistrările DNS A și PTR
- Reînnoiți sau reemiteți orice certificate TLS care referențiază hostname-ul vechi
- Reporniți serviciile dependente de hostname (syslog, agenți de monitorizare, aplicații Java)
- Deschideți o nouă sesiune shell și verificați că
hostname,hostname --fqdnșihostnamectlreturnează toate valori consistente - Verificați
/var/log/syslogsaujournalctl -bpentru orice erori post-modificare care referențiază hostname-ul vechi
Întrebări Frecvente
hostnamectl set-hostname necesită o repornire pentru a intra în vigoare?
Nu. hostnamectl apelează apelul de sistem sethostname(2) imediat, actualizând kernelul care rulează în timp real. Modificarea este de asemenea scrisă în /etc/hostname pentru persistență. Procesele noi și sesiunile noi de shell vor vedea hostname-ul actualizat fără nicio repornire.
De ce hostname-ul meu revine după fiecare repornire pe un cloud VPS?
Cloud-init îl suprascrie aproape sigur. Adăugați preserve_hostname: true în /etc/cloud/cloud.cfg sau creați un fișier drop-in la /etc/cloud/cloud.cfg.d/99_hostname.cfg cu aceeași directivă. Aceasta este cea mai frecventă cauză a revertirii hostname-ului pe mașinile găzduite în cloud.
Care este diferența dintre 127.0.0.1 și 127.0.1.1 în /etc/hosts?
127.0.0.1 este adresa standard de loopback mapată la localhost. Distribuțiile din familia Debian folosesc 127.0.1.1 ca adresă de loopback secundară specific pentru hostname-ul propriu al mașinii, evitând conflictele când mașina nu are un IP static. Pe sistemele din familia RHEL și mașinile cu un IP fix, folosiți în schimb adresa IP primară reală pentru maparea hostname-ului.
Pot folosi un underscore într-un hostname Linux?
Tehnic, sistemul de operare îl va accepta, dar nu ar trebui. Underscore-urile violează RFC 952 și RFC 1123. Cauzează eșecuri în rezoluția DNS (BIND le respinge implicit), validarea certificatelor TLS și denumirea nodurilor Kubernetes. Folosiți exclusiv cratime.
Cum verific că hostname-ul este complet consistent în toate straturile sistemului?
Rulați următoarea secvență și confirmați că toate ieșirile se potrivesc:
hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"Dacă oricare dintre acestea returnează valori diferite, unul dintre straturi — cloud-init, clientul DHCP sau NetworkManager — încă suprascrie setarea statică.
