Как да присвоите статично хост име на 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-info | UTF-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-hostnamehostnamectl записва стойността в /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=noUseHostname=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-hostname | systemd дистрибуции | Не | Не (изисква preserve_hostname) | Да |
Ръчно редактиране на /etc/hostname | Всички дистрибуции | Не (с команда hostname) | Не | Не |
Cloud-init preserve_hostname | Cloud инстанции | Не | Да | N/A |
Конфигурация на DHCP клиент (supersede) | Всички дистрибуции | Не | Не | Не |
NetworkManager nmcli | NM-управлявани системи | Не | Не | Да |
Реални крайни случаи и клопани
Клопан 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 — все още заменя статичната настройка.
