15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
23.10.2024

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 HostnameLocație StocareDomeniuSupraviețuiește Repornirii
Static/etc/hostnameIdentitate persistentă a sistemuluiDa
TranzitoriuDoar runtime kernelTemporar, setat de NTP/DHCPNu
Estetic/etc/machine-infoNume 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:

hostnamectl

Exemplu 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-64

Dacă 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 -n

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

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

Pasul 2: Verificați Modificarea

hostnamectl

Confirmați că câmpul Static hostname afișează noua dvs. valoare. Verificați de asemenea că kernelul a preluat-o:

hostname

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

Fiș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-hostname

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

Dacă 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/hostname

Fiș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-hostname

Pasul 2: Actualizați /etc/hosts

sudo nano /etc/hosts

Aplicaț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-hostname

Pe sistemele cu systemd-hostnamed disponibil chiar și fără adoptarea completă a systemd:

sudo systemctl restart systemd-hostnamed

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

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

Găsiți sau adăugați următoarea directivă:

preserve_hostname: true

Alternativ, 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
EOF

După 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.conf

Adă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=no

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

Pentru a împiedica NetworkManager să accepte complet un hostname de la DHCP, adăugați în /etc/NetworkManager/NetworkManager.conf:

[main]
hostname-mode=none

Propagarea 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țieNecesită RepornireGestionează Cloud-InitActualizare Atomică
hostnamectl set-hostnameDistribuții systemdNuNu (necesită preserve_hostname)Da
Editare manuală /etc/hostnameToate distribuțiileNu (cu comanda hostname)NuNu
Cloud-init preserve_hostnameInstanțe cloudNuDaN/A
Config client DHCP (supersede)Toate distribuțiileNuNuNu
NetworkManager nmcliSisteme gestionate de NMNuNuDa

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-hostname sau prin editarea /etc/hostname
  • Actualizați /etc/hosts cu 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 și hostnamectl returnează toate valori consistente
  • Verificați /var/log/syslog sau journalctl -b pentru 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ă.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți