15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
23.10.2024

Как да присвоите статично хост име на Linux машина

Статичното hostname е постоянно конфигуриран, четим от човека етикет, присвоен на Linux система, който се запазва след рестартиране и не се презаписва от мрежови услуги като DHCP. За разлика от временното hostname — което може да бъде зададено динамично от мрежовия демон и да се нулира при следващото стартиране — статичното hostname се съхранява на диска и остава авторитетно независимо от начина, по който машината получава своя IP адрес.

Това разграничение е изключително важно в производствени среди. Когато управлявате VPS или dedicated сървър, стабилното hostname е основата за SSH known-hosts записи, TLS сертификат Subject Alternative Names, syslog идентификатори, Prometheus целеви етикети и Kerberos principal имена. Hostname, което тихо се променя след DHCP подновяване, може да наруши всичко това едновременно.

Какво точно е Linux Hostname?

Linux проследява три различни класа hostname, всеки от които служи за различна цел:

Тип HostnameМестоположение на съхранениеОбхватОцелява след рестартиране
Статично/etc/hostnameПостоянна системна идентичностДа
ВременноСамо в kernel runtimeВременно, задавано от NTP/DHCPНе
Красиво/etc/machine-infoUTF-8 показвано име (позволени са интервали)Да

Статичното hostname е това, което конфигурирате умишлено. Временното hostname е това, което kernel използва в момента — обикновено идентично със статичното, освен ако DHCP сървър или systemd-timesyncd не го е заменил. Красивото hostname е чисто козметично (напр. "Alex's Web Server") и никога не се използва в DNS или SSH.

Валидните статични hostname следват правилата на RFC 1123: само малки букви, цифри и тирета; без долни черти; без водещи или завършващи тирета; максимум 63 символа на етикет; максимум 253 символа общо за напълно квалифицирано домейн име (FQDN).

Проверка на текущото Hostname

Преди да правите каквито и да е промени, проверете текущото състояние на всичките три типа hostname:

hostnamectl

Примерен изход на система базирана на 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

Ако Transient hostname се различава от Static hostname, вашият DHCP клиент заменя статичната стойност — проблем, разгледан в раздела за устойчивост по-долу.

За системи без hostnamectl, използвайте:

hostname
cat /etc/hostname
uname -n

Метод 1: Използване на hostnamectl (Дистрибуции базирани на systemd)

Този метод се прилага за Ubuntu 16.04+, Debian 8+, CentOS 7+, RHEL 7+, Fedora 15+, AlmaLinux, Rocky Linux и всяка дистрибуция, работеща с systemd като PID 1.

Стъпка 1: Задайте статичното Hostname

sudo hostnamectl set-hostname new-static-hostname

hostnamectl записва стойността в /etc/hostname, извиква системното извикване sethostname(2) за незабавно актуализиране на работещия kernel и уведомява systemd-hostnamed — всичко атомарно. Не се изисква рестартиране.

За едновременно задаване на всичките три типа 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

Стъпка 2: Проверете промяната

hostnamectl

Потвърдете, че полето Static hostname показва новата ви стойност. Проверете също дали kernel я е приел:

hostname

Стъпка 3: Актуализирайте /etc/hosts

hostnamectl не актуализира /etc/hosts автоматично. Неактуализирането на този файл кара sudo да издава предупреждението unable to resolve host, нарушава приложения, които извикват gethostbyname() на локалното hostname, и може да причини неуспешно стартиране на базирани на Java услуги (Elasticsearch, Kafka).

sudo nano /etc/hosts

Файлът трябва да съдържа минимум:

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

Вторият ред използва 127.0.1.1 (не 127.0.0.1) за собственото hostname на машината в Debian-базирани системи. В RHEL-базирани системи използвайте действителния основен IP адрес вместо това:

192.168.1.50  new-static-hostname.yourdomain.com  new-static-hostname

Ако управлявате VPS с cPanel, инструментът за промяна на hostname на cPanel обработва /etc/hosts автоматично, но все пак трябва да проверите резултата ръчно.

Метод 2: Ръчно редактиране на /etc/hostname (Дистрибуции без systemd)

Този метод се прилага за по-стари версии на Debian/Ubuntu, използващи SysVinit или Upstart, Alpine Linux, Gentoo с OpenRC, Void Linux и вградени системи.

Стъпка 1: Редактирайте /etc/hostname

sudo nano /etc/hostname

Файлът трябва да съдържа точно един ред — краткото hostname без последващи интервали или нов ред извън стандартния терминатор на ред:

new-static-hostname

Стъпка 2: Актуализирайте /etc/hosts

sudo nano /etc/hosts

Приложете същото съпоставяне, описано в Метод 1.

Стъпка 3: Приложете промяната без рестартиране

Уведомете незабавно работещия kernel за новото hostname:

sudo hostname new-static-hostname

В системи с systemd-hostnamed, налично дори без пълно приемане на systemd:

sudo systemctl restart systemd-hostnamed

В чисти SysVinit системи командата hostname по-горе е достатъчна. Промяната влиза в сила за всички нови процеси; съществуващите обвивки ще показват старата подкана, докато не отворите нова терминална сесия или не изпълните:

exec bash

Метод 3: Заместване чрез Cloud-Init (Критично за Cloud VPS инстанции)

Това е най-често пропусканият сценарий. На облачни платформи — включително повечето VPS доставчици — cloud-init се изпълнява при всяко стартиране и нулира hostname до каквото връща API-то на метаданните на инстанцията. Вашата промяна в /etc/hostname ще бъде тихо презаписана при следващото рестартиране.

За да оцелее статичното hostname след cloud-init, редактирайте /etc/cloud/cloud.cfg:

sudo nano /etc/cloud/cloud.cfg

Намерете или добавете следната директива:

preserve_hostname: true

Алтернативно, създайте drop-in файл за заместване, за да избегнете промяна на конфигурацията, управлявана от пакета:

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

След тази промяна cloud-init вече няма да докосва hostname при следващи стартирания.

Предотвратяване на заместването на статичното Hostname от DHCP

Дори без cloud-init, DHCP клиент може да презапише временното hostname. Решението зависи от това кой DHCP клиент използва вашата дистрибуция.

За dhclient (Debian/Ubuntu наследен)

Редактирайте /etc/dhcp/dhclient.conf:

sudo nano /etc/dhcp/dhclient.conf

Добавете или променете:

send host-name "new-static-hostname";
supersede host-name "new-static-hostname";

Директивата supersede гарантира, че клиентът игнорира всяко hostname, предложено от DHCP сървъра.

За systemd-networkd с systemd-resolved

Редактирайте или създайте файл .network в /etc/systemd/network/:

[DHCP]
SendHostname=yes
UseHostname=no

UseHostname=no предотвратява презаписването на статичното hostname с предложеното от DHCP.

За NetworkManager (повечето десктоп и модерни сървърни дистрибуции)

sudo nmcli con modify "connection-name" ipv4.dhcp-hostname "new-static-hostname"
sudo nmcli con modify "connection-name" ipv4.dhcp-send-hostname yes

За да предотвратите изцяло приемането на hostname от DHCP от NetworkManager, добавете към /etc/NetworkManager/NetworkManager.conf:

[main]
hostname-mode=none

Разпространение на Hostname: Какво друго трябва да знае

Задаването на hostname в операционната система е необходимо, но не достатъчно в мрежова среда. Вземете предвид тези downstream системи:

  • DNS forward и reverse записи: Актуализирайте A записа и PTR записа на вашата DNS зона. Без съответстващ PTR запис, много пощенски сървъри ще отхвърлят изходящата поща, а някои инструменти за сигурност маркират хоста като подозрителен.
  • SSL/TLS сертификати: Ако вашето hostname е част от CN или SAN на сертификат, имате нужда от нов сертификат. SSL сертификати, обвързани със старото hostname, ще генерират грешки при валидиране.
  • Регистрация на домейн и разпространение на DNS: Ако hostname се съпоставя с публичен FQDN, актуализирайте DNS записа при вашия регистратор на домейни и изчакайте времето за разпространение, базирано на TTL.
  • Агенти за мониторинг: Prometheus node exporter, Datadog, Zabbix и подобни агенти използват hostname като етикет. След промяна на hostname, историческите метрики може да се появят под различна хост идентичност.
  • /etc/ssh/ssh_known_hosts: Клъстерните known-hosts файлове, препращащи към старото hostname, трябва да бъдат актуализирани.
  • Конфигурационни файлове на приложения: Всяко твърдо кодирано hostname в конфигурации на приложения, JDBC connection strings или advertised listeners на message broker трябва да бъде актуализирано.

Сравнение: Методи за конфигуриране на Hostname

МетодСъвместимост с дистрибуцииИзисква рестартиранеОбработва Cloud-InitАтомарна актуализация
hostnamectl set-hostnamesystemd дистрибуцииНеНе (изисква preserve_hostname)Да
Ръчно редактиране на /etc/hostnameВсички дистрибуцииНе (с команда hostname)НеНе
Cloud-init preserve_hostnameCloud инстанцииНеДаN/A
Конфигурация на DHCP клиент (supersede)Всички дистрибуцииНеНеНе
NetworkManager nmcliNM-управлявани системиНеНеДа

Реални крайни случаи и клопани

Клопан 1: Цикълът на предупреждението sudo. Ако зададете hostname, но забравите да актуализирате /etc/hosts, всяко извикване на sudo ще отпечатва sudo: unable to resolve host new-static-hostname. Това не е фатално, но добавя латентност към всяка привилегирована команда и запълва логовете.

Клопан 2: Java услугите отказват да стартират. InetAddress.getLocalHost() на Java разрешава hostname чрез gethostbyname(). Ако hostname не е в /etc/hosts или не може да се разреши чрез DNS, услуги като Elasticsearch, Kafka и Cassandra хвърлят UnknownHostException при стартиране.

Клопан 3: Hostname с долни черти. Въпреки широкото неформално използване, долните черти в hostname нарушават RFC 952 и RFC 1123. Някои DNS резолвери, TLS библиотеки и Kubernetes компоненти ще ги отхвърлят или ще ги обработват неправилно. Винаги използвайте тирета.

Клопан 4: FQDN срещу кратко hostname. hostnamectl съхранява само краткото hostname (напр. web01). FQDN (напр. web01.example.com) се разрешава чрез комбиниране на краткото hostname със списъка за търсене на домейни в /etc/resolv.conf или /etc/systemd/resolved.conf. Задайте Domains=example.com в resolved.conf или search example.com в resolv.conf, за да накарате hostname --fqdn да връща правилната стойност.

Клопан 5: Изолация на контейнери и пространства от имена. Вътре в Docker контейнер или LXC namespace, hostnamectl може да се провали с Failed to connect to bus: No such file or directory, защото systemd-hostnamed не работи. Използвайте hostname new-name директно или задайте hostname при създаването на контейнера чрез docker run --hostname или ключа hostname: в docker-compose.yml.

Практически контролен списък за вземане на решения

Използвайте този контролен списък преди и след всяка промяна на hostname в производствена среда:

  • Потвърдете, че новото hostname е съвместимо с RFC 1123 (малки букви, само тирета, максимум 63 символа на етикет)
  • Изпълнете hostnamectl преди промяната и запазете изхода за одиторски цели
  • Задайте статичното hostname с hostnamectl set-hostname или чрез редактиране на /etc/hostname
  • Актуализирайте /etc/hosts с краткото hostname и FQDN на един и същи ред
  • Ако системата е cloud инстанция, задайте preserve_hostname: true в конфигурацията на cloud-init
  • Ако DHCP е активен, конфигурирайте DHCP клиента да игнорира hostname, предлагани от сървъра
  • Актуализирайте DNS A и PTR записите
  • Подновете или преиздайте всички TLS сертификати, препращащи към старото hostname
  • Рестартирайте услуги, зависещи от hostname (syslog, агенти за мониторинг, Java приложения)
  • Отворете нова обвивка и проверете дали hostname, hostname --fqdn и hostnamectl връщат последователни стойности
  • Проверете /var/log/syslog или journalctl -b за грешки след промяната, препращащи към старото hostname

ЧЗВ

Изисква ли hostnamectl set-hostname рестартиране, за да влезе в сила?

Не. hostnamectl извиква системното извикване sethostname(2) незабавно, актуализирайки работещия kernel в реално време. Промяната се записва и в /etc/hostname за устойчивост. Новите процеси и новите обвивки ще виждат актуализираното hostname без рестартиране.

Защо моето hostname се връща след всяко рестартиране на cloud VPS?

Cloud-init почти сигурно го презаписва. Добавете preserve_hostname: true към /etc/cloud/cloud.cfg или създайте drop-in файл в /etc/cloud/cloud.cfg.d/99_hostname.cfg със същата директива. Това е най-честата причина за връщане на hostname на cloud-хоствани машини.

Каква е разликата между 127.0.0.1 и 127.0.1.1 в /etc/hosts?

127.0.0.1 е стандартният loopback адрес, съпоставен с localhost. Debian-базираните дистрибуции използват 127.0.1.1 като вторичен loopback адрес специално за собственото hostname на машината, избягвайки конфликти, когато машината няма статичен IP. В RHEL-базирани системи и машини с фиксиран IP, използвайте действителния основен IP адрес за съпоставянето на hostname.

Мога ли да използвам долна черта в Linux hostname?

Технически операционната система ще го приеме, но не трябва. Долните черти нарушават RFC 952 и RFC 1123. Те причиняват неуспехи при DNS разрешаване (BIND ги отхвърля по подразбиране), валидиране на TLS сертификати и именуване на Kubernetes възли. Използвайте изключително тирета.

Как да проверя дали hostname е напълно последователно на всички системни нива?

Изпълнете следната последователност и потвърдете, че всички изходи съвпадат:

hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"

Ако някое от тях върне различни стойности, едно от нивата — cloud-init, DHCP клиент или NetworkManager — все още заменя статичната настройка.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало