Объяснение типов имен хостов в Linux: статические, переходные и временные
Современные системы Linux, использующие systemd, поддерживают три типа имен хостов:
- Красивое имя хоста (Pretty hostname) — понятное человеку имя для отображения.
- Статическое имя хоста (Static hostname) — постоянное имя хоста системы, хранящееся на диске.
- Временное имя хоста (Transient hostname) — временное имя хоста, используемое во время работы.
Каждый тип имени хоста служит определенной цели и имеет свой порядок приоритетности. Понимание различий между ними поможет вам выбрать правильное имя хоста для вашего случая использования и избежать путаницы с идентификацией системы, разрешением имени хоста, ведением журналов и настройкой сетевых параметров.
Что такое имя хоста в Linux?
hostname — это сетевой идентификатор вашего компьютера. Проще говоря, имя хоста — это имя, которое система Linux использует для идентификации.
Когда вы вводите hostname в терминале, вы видите, как ваша система называет себя в данный момент.
Имя хоста отображается в:
- Приглашения оболочки
- Журналы
- Сетевые службы
- Удаленные подключения
Это поведение применимо только к системам на базе systemd.
Понимание разницы поможет избежать путаницы, если имя хоста неожиданно изменится или не сохранится после перезагрузки.
В дистрибутивах до Systemd (RHEL 6, Debian 7, Fedora 14 и более ранних версиях) статическое имя хоста хранилось в:
- Debian/Ubuntu:
/etc/hostname - RHEL/CentOS 6:
/etc/sysconfig/network - Slackware:
/etc/HOSTNAME
Три типа имён хостов
Статическое имя хоста
Это постоянное имя вашей системы.
Оно хранится в файле /etc/hostname . При загрузке системы она считывает этот файл и устанавливает имя хоста в соответствии с ним.
Изменения в статическом имени хоста сохраняются после перезагрузки. Это имя, которое вы задаёте при установке Debian/Ubuntu или настройке нового сервера.
Временное имя хоста
Это текущее имя хоста, используемое ядром.
Оно существует только в памяти. Сейчас ядро использует это имя для всех реальных сетевых операций.
При загрузке временное имя хоста копируется из статического имени хоста. Но такие программы, как DHCP-клиенты или сетевые менеджеры, могут изменять его во время работы.
При перезагрузке временное имя хоста снова становится таким же, как статическое имя хоста.
Красивое имя хоста
Это удобочитаемое описание.
Оно может содержать пробелы, специальные символы и символы в кодировке UTF-8. Оно хранится в /etc/machine-info и служит метаданными.
Большинство инструментов его игнорируют. Вам редко придется его менять.
Одинаковы ли временные и переходные имена хостов?
В системах Linux, использующих systemd, временное имя хоста — это официальный термин для обозначения имени хоста, которое хранится только в памяти и не сохраняется в /etc/hostname. Обычно оно сбрасывается после перезагрузки.
Термин временное имя хоста не является официальным термином systemd. Люди часто используют его в неформальном общении для обозначения имени хоста, которое не сохраняется после перезагрузки. На практике, когда в документации или обучающих материалах упоминается временное имя хоста, обычно имеется в виду преходящее имя хоста.
Таким образом, хотя эти термины не являются технически идентичными, в целом они обозначают одно и то же: изменение имени хоста, которое не сохраняется после перезагрузки.
В чем разница между временным и статическим именами хоста
Статическое имя хоста — это ваша конфигурация. Временное имя хоста — это ваше текущее состояние.
Считайте, что статическое имя хоста — это «то, что вам нужно», а временное — «то, что у вас есть прямо сейчас».
DHCP-серверы, VPN и оркестраторы контейнеров часто динамически изменяют временное имя хоста. При этом статическое имя хоста остается неизменным.
Такое разделение позволяет вашей системе адаптироваться к различным сетям, не теряя своей идентичности.
Ключевой момент: для сетевых операций имеет значение только временное имя хоста. Программы разрешают имена, отправляют пакеты и регистрируют события, используя временное имя хоста.
Вкратце: три типа имен хостов в Linux
| Тип | Место хранения | Переживет перезагрузку? | Изменено С Помощью | Пример использования |
|---|---|---|---|---|
| Статический | /etc/hostname | ДА | Администрирование вручную | Постоянная идентификация сервера |
| Преходящий | Память ядра | НЕТ | systemd, DHCP, NetworkManager | Гибкость во время выполнения |
| Хорошенькая | /etc/machine-info | ДА | Администрирование вручную | Понятное для человека описание |
Это важно при настройке серверов, устранении сетевых неполадок или управлении динамическими средами, в которых меняются имена хостов.
Как проверить текущее имя хоста
1. С помощью команды hostnamectl (рекомендуется)
hostnamectl
Здесь показаны все типы имен хостов, а также системная информация:
Static hostname: Ubuntu2604
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: c315a5ec7511408d8c2f9bf97f5adeaf
Boot ID: 02d8a23f494e44508d1c6ca1079849d8
Virtualization: kvm
Operating System: Ubuntu 26.04 LTS
Kernel: Linux 7.0.0-22-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _Q35 + ICH9, 2009_
Hardware Version: pc-q35-9.2
Firmware Version: rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org
Firmware Date: Tue 2014-04-01
Firmware Age: 12y 2month 1w 3dОбратите внимание, что команда hostnamectl не отображает строку с временным именем хоста, если оно не отличается от статического.
Чтобы просмотреть только статическое имя хоста:
hostnamectl --static
2. Использование команды hostname
hostname
Здесь отображается только текущее временное имя хоста (то, которое использует ядро в данный момент).
3. Проверка файла со статическими именами хостов
cat /etc/hostname
Здесь показано, какое имя хоста загружается при загрузке системы.
4. Проверка того, что видят программы
uname -n
Эта команда возвращает временное имя хоста, которое используют приложения, идентичное команде hostname.
Как изменить имена хостов в Linux (пошаговая инструкция)
1. Установка только временного имени хоста
Временное имя хоста в основном предназначено для систем, в которых не настроено статическое имя хоста. Например:
- DHCP-сервер предоставляет имя хоста
- Cloud-init назначает имя хоста
- Среда выполнения контейнеров назначает имя хоста
Если существует статическое имя хоста, systemd предполагает, что администратор сделал выбор в его пользу, и игнорирует временное имя хоста.
Например, если вы попытаетесь задать временное имя хоста с помощью следующей команды, когда статическое имя хоста уже задано:
sudo hostnamectl set-hostname webserver01 --transient
Вы увидите следующее сообщение:
Hint: static hostname is already set, so the specified transient hostname will not be used.
Это означает:
- В вашей системе уже настроено статическое имя хоста в
/etc/hostname. - systemd отдает статическому имени хоста приоритет перед временным именем хоста.
- Поэтому, даже если вы укажете временное имя хоста, приложения и система продолжат использовать статическое имя хоста.
Как протестировать временное имя хоста
Сначала нужно удалить статическое имя хоста:
sudo hostnamectl set-hostname "" --static
или очистите /etc/hostname вручную (обычно не рекомендуется делать это в рабочей системе).
Затем задайте временное имя хоста:
sudo hostnamectl set-hostname webserver01 --transient
Проверьте результат:
Transient hostname: webserver01
Static hostname: (unset)
Pretty hostname: Ubuntu2604
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: c315a5ec7511408d8c2f9bf97f5adeaf
Boot ID: 02d8a23f494e44508d1c6ca1079849d8
Virtualization: kvm
Operating System: Ubuntu 26.04 LTS
Kernel: Linux 7.0.0-22-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _Q35 + ICH9, 2009_
Hardware Version: pc-q35-9.2
Firmware Version: rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org
Firmware Date: Tue 2014-04-01
Firmware Age: 12y 2month 1w 3d
Как видно из приведенного выше вывода, временное имя хоста — webserver01, статическое имя хоста — пусто (не задано), а красивое имя хоста — Ubuntu2604.
Теперь ядро использует webserver01 для всех целей. Но после перезагрузки оно возвращается к Ubuntu2604 или исходному статическому имени хоста, которое вы указали при установке.
2. Настройка статического имени хоста
sudo hostnamectl set-hostname production-db --static
Это записывается в /etc/hostname:
cat /etc/hostname
Вы увидите результат: production-db
После перезагрузки и статические, и временные настройки будут production-db. Вы можете проверить это с помощью следующих команд:
hostnamectl --static hostnamectl --transient
Красивое имя хоста (если задано) остается без изменений.
3. Установка обоих параметров одновременно
sudo hostnamectl set-hostname my-server
Без каких-либо флагов это приводит к тому, что и статическое, и временное значение имеют одно и то же значение.
В большинстве случаев это то, что вам нужно.
4. Старый способ (не рекомендуется, только в образовательных целях)
sudo hostname quick-test
Это приводит к изменению временного имени хоста непосредственно в ядре.
Это работает, но systemd не отслеживает изменения должным образом. Для единообразия используйте hostnamectl вместо этого.
Реальные сценарии
Сети с протоколом DHCP
Вы задали для своего ноутбука статическое имя хоста my-laptop.
При подключении к корпоративной сети DHCP-сервер может присвоить вашему временному имени хоста значение client-192-168-1-100.
Во время подключения ваша система использует имя client-192-168-1-100. При отключении или перезагрузке система возвращается к имени my-laptop.
Это происходит автоматически. За это отвечают NetworkManager и dhclient.
Среды контейнеров
Docker и Kubernetes устанавливают временные имена хостов на основе идентификаторов контейнеров или имен подов.
Статическое имя хоста вашего компьютера остается неизменным. Каждый контейнер получает собственное временное имя хоста во время работы.
Такая изоляция предотвращает конфликты и упрощает управление.
Режим обслуживания
Вы работаете на производственном сервере и хотите сообщить, что он находится на техническом обслуживании.
Установите временное имя хоста:
sudo hostnamectl set-hostname MAINTENANCE-DO-NOT-USE --transient
Это сразу же отображается во всех журналах и в приглашениях терминала.
После завершения обслуживания перезагрузите систему. Имя хоста вернется к исходному статическому значению.
Файлы конфигурации не изменялись. Нет риска забыть вернуть все как было.
Распространенные проблемы с именем хоста
Проблема 1: имя хоста не сохраняется после перезагрузки
Проблема: вы изменили имя хоста, но после перезагрузки оно вернулось к исходному значению.
Причина: вы изменили только временное имя хоста.
Решение: установите статическое имя хоста. Чтобы немедленно обновить текущее имя хоста:
# Обновите одновременно статическое и временное имя хоста (рекомендуется) sudo hostnamectl set-hostname your-hostname # ИЛИ обновите только статическое значение (временное значение изменится после перезагрузки) sudo hostnamectl set-hostname your-hostname --static
Проблема 2: имя хоста постоянно меняется автоматически
Симптом: при подключении к разным сетям имя хоста меняется.
Причина: DHCP-сервер переопределяет ваше временное имя хоста.
Решение для NetworkManager (наиболее распространенный случай):
# Задайте постоянное имя хоста, которое не может быть изменено с помощью DHCP sudo nmcli general hostname your-permanent-hostname sudo systemctl restart NetworkManager
Альтернативный метод (редактирование файла конфигурации):
Редактировать /etc/NetworkManager/NetworkManager.conf:
[main] hostname-mode=none
Затем перезапустите NetworkManager:
sudo systemctl restart NetworkManager
Исправление для устаревшего dhclient (если используется статическая конфигурация сети без NetworkManager):
отредактируйте /etc/dhcp/dhclient.conf и добавьте:
supersede host-name "your-permanent-hostname";
Проблема 3: hostnamectl показывает значения, отличные от значений команды hostname
Симптом: hostnamectl и hostname показывают разные имена.
Причина: что-то изменило имя хоста ядра без обновления systemd.
Решение: перезапустите systemd-hostnamed:
sudo systemctl restart systemd-hostnamed
Или снова задайте имя хоста с помощью команды hostnamectl.
Проблема 4. Некорректное имя хоста приводит к сбоям в работе DNS или служб
Симптом: службы не работают, DNS не отвечает, SSL-сертификаты не работают.
Причина: имя хоста содержит недопустимые символы.
Допустимые правила для имени хоста (RFC 1123):
- Только строчные буквы (a-z), цифры (0-9) и дефисы (-)
- Должно начинаться и заканчиваться буквой или цифрой
- Не более 64 символов
- Без пробелов, подчеркиваний и специальных символов
Исправление: укажите действительное имя хоста:
sudo hostnamectl set-hostname valid-hostname-01
Примечание: Красивые имена хостов (удобные для восприятия человеком) не имеют ограничений по количеству символов. Они могут содержать пробелы, заглавные буквы, эмодзи и специальные символы.
4 команды Linux для проверки имени хоста
Проверьте все типы имен хостов:
hostnamectl
Проверьте файл со статическим именем хоста:
cat /etc/hostname
Узнайте, что думает ядро:
hostname
Смотрите, что видят программы:
uname -n
Все эти команды должны давать одинаковые результаты, если вы настроили как статическую, так и временную синхронизацию.
Ограничения и риски
Отсутствие гарантий синхронизации
Если программа напрямую изменяет временное имя хоста с помощью команды hostname, systemd-hostnamed может временно оказаться в несогласованном состоянии. Однако systemd отслеживает изменения имени хоста ядра при чтении.
Рекомендация: при любых изменениях имени хоста используйте hostnamectl для обеспечения единообразия. Если вы столкнулись с несоответствиями, перезапустите службу.
sudo systemctl restart systemd-hostnamed
DHCP может переопределить ваши настройки
В сетях с протоколом DHCP ваше временное имя хоста может измениться без предупреждения. DHCP-сервер может отправить параметр имени хоста, который переопределит ваше временное значение.
Если для вас важна стабильность имени хоста, настройте NetworkManager или DHCP-клиент так, чтобы они игнорировали имена хостов, предоставляемые сервером (см. распространенную проблему № 2).
Путаница с контейнерами и виртуальными машинами
В контейнерах и виртуальных машинах поведение имени хоста зависит от среды виртуализации или выполнения контейнера:
- Docker: наследует имя хоста, если не указано
--hostname - LXC/LXD: отдельное пространство имен UTS с независимым именем хоста
- Облачные виртуальные машины: cloud-init часто задает имя хоста при загрузке
Всегда проверяйте фактическое имя хоста в той среде, где это важно:
hostname
Проверка статического имени хоста
hostnamectl выполняет проверку статических имен хостов на соответствие стандартам RFC 1123. Недопустимые символы (пробелы, знаки подчеркивания, специальные символы) отклоняются с выдачей ошибки.
Однако команда hostname (в обход systemd) и красивые имена хостов принимают любую строку.
Важное правило для статических имен хостов:
- Только строчные буквы (
a-z), цифры (0-9), дефисы (-) - должны начинаться и заканчиваться буквой или цифрой
- максимум 64 символа
- без пробелов, подчеркиваний (_) и специальных символов
Примечание: hostnamectl проверяет имена хостов перед их применением. Если вы укажете имя хоста, содержащее неподдерживаемые символы, команда может автоматически удалить или изменить эти символы вместо того, чтобы выдать сообщение об ошибке. Точное поведение может различаться в зависимости от дистрибутива Linux и версии systemd.
Например, в нашей тестовой системе Ubuntu 26.04 используется следующая команда:
sudo hostnamectl set-hostname 'bad_hostname#$!'
автоматически удалила неподдерживаемые символы и установила имя хоста следующим образом: badhostname
Итак, как мы уже говорили, имена хостов в Linux должны содержать только буквы, цифры и дефисы (-). Чтобы избежать непредвиденных результатов, с самого начала выбирайте имя хоста, соответствующее этим правилам.
Когда использовать временные имена хостов, а когда — статические
Используйте временные имена хостов в следующих случаях:
- Временное тестирование изменений в конфигурации
- Работа в средах DHCP, где имена часто меняются
- Сигнализация о специальных состояниях (техническое обслуживание, тестирование, промежуточный режим)
- Вам нужна гибкость в работе без постоянных изменений
Используйте статические имена хостов в следующих случаях:
- Настройка рабочих серверов с фиксированными идентификаторами
- Настройка служб, зависящих от постоянных имен хостов
- Управление DNS-записями, указывающими на конкретные компьютеры
- Имя хоста должно сохраняться после перезагрузки
Установите оба, когда:
- Развертывание новой системы, для которой требуется постоянная идентификация
- Вам нужна мгновенная согласованность по всем направлениям
- Стандартная настройка сервера или рабочей станции
FAQ
Требуется ли перезагрузка для изменения имени хоста?
Нет. При использовании hostnamectl имя хоста меняется немедленно. Для вступления в силу изменений, внесенных вручную в /etc/hostname, требуется перезагрузка или systemctl restart systemd-hostnamed .
Можно ли использовать заглавные буквы в именах хостов?
Для статических имен хостов. hostnamectl недопустимы заглавные буквы. В красивых именах хостов можно свободно использовать заглавные буквы. Для статических имен хостов всегда используйте строчные буквы, цифры и дефисы, чтобы избежать проблем с совместимостью сервисов.
Какова максимальная длина имени хоста?
Согласно стандартам POSIX, 64 символа. Для совместимости используйте имена длиной не более 64 символов.
Не нарушит ли смена имени хоста работу моих SSH-соединений?
Нет. Существующие SSH-соединения остаются активными. В новых соединениях используется новое имя хоста в приглашениях и журналах.
Нужно ли обновлять /etc/hosts после смены имени хоста?
Это зависит от вашего дистрибутива.
В Debian/ Ubuntu:
Добавить:
127.0.1.1 your-hostname
Fedora/RHEL:
Обычно в этом нет необходимости.
Современные системы с systemd-resolved или nss-myhostname:
Обычно это не требуется.
Проверьте существующий /etc/hosts формат. Если вы видите запись для своего старого имени хоста, обновите ее. Если нет, то, скорее всего, она вам не нужна.
Вывод
Transient и временный означают одно и то же в обычном разговоре, но transient — точный термин systemd.
Статические имена хостов сохраняются. Временные имена хостов существуют только до перезагрузки или изменения вручную. Оба служат понятным целям в разных сценариях.
Используйте hostnamectl для всех изменений имени хоста. Проверьте свою работу с hostnamectl, чтобы увидеть все три типа сразу.
Установите статические имена хостов для постоянной идентификации. Используйте временные имена хостов для временных состояний или когда внешние системы управляют именем хоста динамически.
Вы должны знать, какой тип данных вы изменяете, когда он сохраняется, а когда нет.
Ресурсы:
- Документация по имени хоста systemd
- Страница руководства по команде hostnamectl
- Служба systemd-hostnamed
- Руководство администратора Debian по настройке сети
- RFC 1178: Выбор имени для вашего компьютера
- RFC 1123: Требования к интернет-хостам
- Arch Linux Wiki: Настройка сети
- Обработка имени хоста в NetworkManager
- Debian Wiki: Имя хоста
- Репозиторий systemd на GitHub — исходный код hostnamed
Редактор: AndreyEx