Як призначити статичне ім’я хоста машині Linux
Статичне ім’я хоста — це постійно налаштована, зрозуміла людині мітка, призначена Linux-системі, яка зберігається після перезавантаження і не перезаписується мережевими службами, такими як DHCP. На відміну від тимчасового імені хоста — яке може динамічно встановлюватися мережевим демоном і скидатися при наступному завантаженні — статичне ім’я хоста зберігається на диску і залишається авторитетним незалежно від того, як машина отримує свою IP-адресу.
Ця відмінність надзвичайно важлива у виробничих середовищах. Коли ви запускаєте VPS або виділений сервер, стабільне ім’я хоста є основою для записів SSH known-hosts, альтернативних імен суб’єктів TLS-сертифікатів, ідентифікаторів syslog, міток цілей Prometheus та імен принципалів Kerberos. Ім’я хоста, яке мовчки змінюється після оновлення DHCP, може одночасно зламати все це.
Що саме таке ім’я хоста Linux?
Linux відстежує три різні класи імен хостів, кожен з яких слугує різній меті:
| Тип імені хоста | Місце зберігання | Область застосування | Зберігається після перезавантаження |
|---|---|---|---|
| Статичне | /etc/hostname | Постійна ідентичність системи | Так |
| Тимчасове | Лише середовище виконання ядра | Тимчасове, встановлюється NTP/DHCP | Ні |
| Відображуване | /etc/machine-info | Відображувана назва UTF-8 (пробіли дозволені) | Так |
Статичне ім’я хоста — це те, що ви налаштовуєте навмисно. Тимчасове ім’я хоста — це те, що ядро використовує в даний момент — зазвичай ідентичне статичному, якщо тільки DHCP-сервер або systemd-timesyncd не перевизначив його. Відображуване ім’я хоста є суто косметичним (наприклад, "Alex's Web Server") і ніколи не використовується в DNS або SSH.
Дійсні статичні імена хостів відповідають правилам RFC 1123: лише малі літери, цифри та дефіси; без підкреслень; без початкових або кінцевих дефісів; максимум 63 символи на мітку; максимум 253 символи загалом для повністю кваліфікованого доменного імені (FQDN).
Перевірка поточного імені хоста
Перш ніж вносити будь-які зміни, перевірте поточний стан усіх трьох типів імен хостів:
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Якщо тимчасове ім’я хоста відрізняється від статичного імені хоста, ваш 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: Встановлення статичного імені хоста
sudo hostnamectl set-hostname new-static-hostnamehostnamectl записує значення до /etc/hostname, викликає системний виклик sethostname(2) для негайного оновлення запущеного ядра та сповіщає systemd-hostnamed — все атомарно. Перезавантаження не потрібне.
Щоб одночасно встановити всі три типи імен хостів:
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 відображає нове значення. Також перевірте, що ядро його підхопило:
hostnameКрок 3: Оновлення /etc/hosts
hostnamectl не оновлює /etc/hosts автоматично. Якщо не оновити цей файл, sudo видаватиме попередження unable to resolve host, це зламає застосунки, які викликають gethostbyname() для локального імені хоста, і може спричинити збій 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) для власного імені хоста машини в системах сімейства Debian. У системах сімейства RHEL замість цього використовуйте фактичну основну IP-адресу:
192.168.1.50 new-static-hostname.yourdomain.com new-static-hostnameЯкщо ви керуєте VPS з cPanel, інструмент зміни імені хоста cPanel обробляє /etc/hosts автоматично, але вам все одно слід вручну перевірити результат.
Метод 2: Ручне редагування /etc/hostname (дистрибутиви без systemd)
Цей метод застосовується до старіших випусків Debian/Ubuntu, що використовують SysVinit або Upstart, Alpine Linux, Gentoo з OpenRC, Void Linux та вбудованих систем.
Крок 1: Редагування /etc/hostname
sudo nano /etc/hostnameФайл повинен містити рівно один рядок — коротке ім’я хоста без кінцевих пробілів або символу нового рядка, крім стандартного термінатора рядка:
new-static-hostnameКрок 2: Оновлення /etc/hosts
sudo nano /etc/hostsЗастосуйте те саме відображення, описане в Методі 1.
Крок 3: Застосування змін без перезавантаження
Негайно сповістіть запущене ядро про нове ім’я хоста:
sudo hostname new-static-hostnameНа системах з systemd-hostnamed, доступним навіть без повного впровадження systemd:
sudo systemctl restart systemd-hostnamedНа чистих системах SysVinit наведеної вище команди hostname достатньо. Зміна набуває чинності для всіх нових процесів; існуючі оболонки все ще відображатимуть старий рядок запрошення, доки ви не відкриєте новий термінальний сеанс або не виконаєте:
exec bashМетод 3: Перевизначення через cloud-init (критично для хмарних екземплярів VPS)
Це найбільш часто пропускуваний сценарій. На хмарних платформах — включаючи більшість VPS-провайдерів — cloud-init запускається при кожному завантаженні та скидає ім’я хоста до того, що повертає API метаданих екземпляра. Ваша зміна /etc/hostname буде мовчки перезаписана при наступному перезавантаженні.
Щоб статичне ім’я хоста збереглося після cloud-init, відредагуйте /etc/cloud/cloud.cfg:
sudo nano /etc/cloud/cloud.cfgЗнайдіть або додайте наступну директиву:
preserve_hostname: trueАбо створіть файл перевизначення, щоб уникнути зміни конфігурації, керованої пакетом:
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 більше не торкатиметься імені хоста при наступних завантаженнях.
Запобігання перевизначенню статичного імені хоста через DHCP
Навіть без cloud-init DHCP-клієнт може перезаписати тимчасове ім’я хоста. Виправлення залежить від того, який 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 гарантує, що клієнт ігнорує будь-яке ім’я хоста, запропоноване DHCP-сервером.
Для systemd-networkd з systemd-resolved
Відредагуйте або створіть файл .network у /etc/systemd/network/:
[DHCP]
SendHostname=yes
UseHostname=noUseHostname=no запобігає перезапису статичного імені хоста ім’ям, запропонованим 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Щоб повністю запобігти прийняттю NetworkManager імені хоста від DHCP, додайте до /etc/NetworkManager/NetworkManager.conf:
[main]
hostname-mode=noneПоширення імені хоста: що ще потрібно знати
Встановлення імені хоста в ОС є необхідним, але недостатнім у мережевому середовищі. Зверніть увагу на ці залежні системи:
- Прямі та зворотні записи DNS: Оновіть запис A та запис PTR у вашій DNS-зоні. Без відповідного запису PTR багато поштових серверів відхилятимуть вихідну електронну пошту, а деякі інструменти безпеки позначатимуть хост як підозрілий.
- SSL/TLS-сертифікати: Якщо ваше ім’я хоста є частиною CN або SAN сертифіката, вам потрібен новий сертифікат. SSL-сертифікати, прив’язані до старого імені хоста, видаватимуть помилки перевірки.
- Реєстрація домену та поширення DNS: Якщо ім’я хоста відповідає публічному FQDN, оновіть DNS-запис у вашого реєстратора домену та зачекайте на час поширення на основі TTL.
- Агенти моніторингу: Prometheus node exporter, Datadog, Zabbix та подібні агенти використовують ім’я хоста як мітку. Після зміни імені хоста історичні метрики можуть відображатися під іншою ідентичністю хоста.
/etc/ssh/ssh_known_hosts: Файли known-hosts у масштабі кластера, що посилаються на старе ім’я хоста, необхідно оновити.- Файли конфігурації застосунків: Будь-яке жорстко закодоване ім’я хоста в конфігураціях застосунків, рядках підключення JDBC або оголошених слухачах брокерів повідомлень необхідно оновити.
Порівняння: методи налаштування імені хоста
| Метод | Сумісність з дистрибутивами | Потребує перезавантаження | Обробляє cloud-init | Атомарне оновлення |
|---|---|---|---|---|
hostnamectl set-hostname | Дистрибутиви з systemd | Ні | Ні (потребує preserve_hostname) | Так |
Ручне редагування /etc/hostname | Всі дистрибутиви | Ні (з командою hostname) | Ні | Ні |
preserve_hostname cloud-init | Хмарні екземпляри | Ні | Так | Н/Д |
Конфігурація DHCP-клієнта (supersede) | Всі дистрибутиви | Ні | Ні | Ні |
nmcli NetworkManager | Системи під управлінням NM | Ні | Ні | Так |
Реальні граничні випадки та підводні камені
Підводний камінь 1: Цикл попереджень sudo. Якщо ви встановили ім’я хоста, але забули оновити /etc/hosts, кожен виклик sudo виводитиме sudo: unable to resolve host new-static-hostname. Це не критично, але додає затримку до кожної привілейованої команди та засмічує журнали.
Підводний камінь 2: Java-сервіси відмовляються запускатися. InetAddress.getLocalHost() Java розв’язує ім’я хоста через gethostbyname(). Якщо ім’я хоста відсутнє в /etc/hosts або не розв’язується через DNS, такі сервіси, як Elasticsearch, Kafka та Cassandra, видають UnknownHostException під час запуску.
Підводний камінь 3: Ім’я хоста з підкресленнями. Незважаючи на широке неформальне використання, підкреслення в іменах хостів порушують RFC 952 та RFC 1123. Деякі DNS-резолвери, TLS-бібліотеки та компоненти Kubernetes відхилятимуть їх або оброблятимуть неправильно. Завжди використовуйте дефіси.
Підводний камінь 4: FQDN проти короткого імені хоста. hostnamectl зберігає лише коротке ім’я хоста (наприклад, web01). FQDN (наприклад, web01.example.com) розв’язується шляхом поєднання короткого імені хоста зі списком пошуку доменів у /etc/resolv.conf або /etc/systemd/resolved.conf. Встановіть Domains=example.com у resolved.conf або search example.com у resolv.conf, щоб hostname --fqdn повертав правильне значення.
Підводний камінь 5: Ізоляція контейнерів та просторів імен. Всередині контейнера Docker або простору імен LXC hostnamectl може завершитися з помилкою Failed to connect to bus: No such file or directory, оскільки systemd-hostnamed не запущено. Використовуйте hostname new-name безпосередньо або встановіть ім’я хоста під час створення контейнера через docker run --hostname або ключ hostname: у docker-compose.yml.
Практичний контрольний список
Використовуйте цей контрольний список до та після кожної зміни імені хоста у виробничому середовищі:
- Переконайтеся, що нове ім’я хоста відповідає RFC 1123 (малі літери, лише дефіси, максимум 63 символи на мітку)
- Запустіть
hostnamectlперед зміною та збережіть вивід для цілей аудиту - Встановіть статичне ім’я хоста за допомогою
hostnamectl set-hostnameабо шляхом редагування/etc/hostname - Оновіть
/etc/hosts, вказавши коротке ім’я хоста та FQDN в одному рядку - Якщо система є хмарним екземпляром, встановіть
preserve_hostname: trueу конфігурації cloud-init - Якщо DHCP активний, налаштуйте DHCP-клієнт на ігнорування імен хостів, запропонованих сервером
- Оновіть записи DNS A та PTR
- Поновіть або перевипустіть будь-які TLS-сертифікати, що посилаються на старе ім’я хоста
- Перезапустіть сервіси, залежні від імені хоста (syslog, агенти моніторингу, Java-застосунки)
- Відкрийте новий сеанс оболонки та переконайтеся, що
hostname,hostname --fqdnтаhostnamectlповертають узгоджені значення - Перевірте
/var/log/syslogабоjournalctl -bна наявність помилок після зміни, що посилаються на старе ім’я хоста
Часті запитання
Чи потребує hostnamectl set-hostname перезавантаження для набуття чинності?
Ні. hostnamectl негайно викликає системний виклик sethostname(2), оновлюючи запущене ядро в реальному часі. Зміна також записується до /etc/hostname для збереження. Нові процеси та нові сеанси оболонки побачать оновлене ім’я хоста без будь-якого перезавантаження.
Чому моє ім’я хоста скидається після кожного перезавантаження на хмарному VPS?
Майже напевно це cloud-init перезаписує його. Додайте preserve_hostname: true до /etc/cloud/cloud.cfg або створіть файл перевизначення за адресою /etc/cloud/cloud.cfg.d/99_hostname.cfg з тією самою директивою. Це найпоширеніша причина скидання імені хоста на хмарних машинах.
У чому різниця між 127.0.0.1 та 127.0.1.1 у /etc/hosts?
127.0.0.1 — це стандартна адреса зворотного зв’язку, зіставлена з localhost. Дистрибутиви сімейства Debian використовують 127.0.1.1 як вторинну адресу зворотного зв’язку спеціально для власного імені хоста машини, уникаючи конфліктів, коли машина не має статичної IP-адреси. У системах сімейства RHEL та машинах з фіксованою IP-адресою замість цього використовуйте фактичну основну IP-адресу для зіставлення імені хоста.
Чи можна використовувати підкреслення в імені хоста Linux?
Технічно ОС прийме його, але не варто цього робити. Підкреслення порушують RFC 952 та RFC 1123. Вони спричиняють збої в розв’язанні DNS (BIND відхиляє їх за замовчуванням), перевірці TLS-сертифікатів та іменуванні вузлів Kubernetes. Використовуйте виключно дефіси.
Як перевірити, що ім’я хоста повністю узгоджене на всіх рівнях системи?
Виконайте наступну послідовність та переконайтеся, що всі виводи збігаються:
hostname
hostname --fqdn
hostnamectl --static
cat /etc/hostname
systemd-resolve --status | grep "Current hostname"Якщо будь-яке з них повертає різні значення, один із рівнів — cloud-init, DHCP-клієнт або NetworkManager — все ще перевизначає статичне налаштування.
