
Имя Linux-системы участвует в приглашении shell, журналах, DHCP, мониторинге, сертификатах и конфигурации приложений. Простая правка /etc/hostname меняет не все зависимости. Безопасная процедура начинается с инвентаризации и заканчивается проверкой DNS и сервисов.

1. Определите текущее имя и его источники
Сравните static, transient и pretty hostname, FQDN, /etc/hostname и записи resolver. Transient-имя может прийти от DHCP и измениться после перезагрузки.
hostnamectl status
hostname
hostname -f || true
cat /etc/hostname
getent hosts "$(hostname)"
Запишите вывод вместе с IP и ролью узла.
Учебная среда и предварительные проверки
Полный сценарий ниже рассчитан на обычный Debian/Ubuntu-сервер с systemd, постоянным адресом 192.0.2.20 и новым именем app-02.example.net. Адрес является документальным: подставьте фактический адрес своей среды. Для узла Kubernetes, Pacemaker, FreeIPA/AD, базы с репликацией или лицензированного приложения сначала требуется регламент этой платформы. Название узла может быть частью идентификатора кластера, SPN Kerberos или доверия агента; штатное изменение hostname не переименует эти объекты.
Проверьте права sudo и доступ к консоли гипервизора. Оставьте текущую административную сессию открытой до проверки нового подключения. Инвентаризируйте сервисы и клиентские имена: иногда пользователи ходят на portal.example.net, а сервер называется app-01. Тогда переименование сервера не требует менять пользовательский адрес приложения и сертификат портала. Не смешивайте hostname ОС с доменным именем сервиса.
hostnamectl --static
hostnamectl --transient
hostnamectl --pretty
ip -br address
ip route
resolvectl status
systemctl list-units --type=service --state=running --no-pager
Static хранится постоянно; transient применяется во время работы и может изменяться сетевыми компонентами; pretty предназначен для человекочитаемого отображения и может содержать пробелы. hostname -f использует разрешение имени через NSS: результат зависит от /etc/hosts, DNS и порядка hosts: в /etc/nsswitch.conf. Это не независимая проверка корректности DNS. resolvectl применим при systemd-resolved; если служба отсутствует, изучите /etc/resolv.conf и владельца его генерации.
2. Найдите зависимости от старого имени
Ищите hostname в конфигурации мониторинга, резервного копирования, SMTP, кластера, лицензий, TLS, /etc/hosts, systemd unit и CMDB. Ограничьте поиск конфигурационными каталогами, чтобы не сканировать данные пользователей.
old=$(hostnamectl --static)
sudo grep -RIl --exclude='*.log' -- "$old" /etc 2>/dev/null
sudo systemctl --failed
Не заменяйте строки автоматически без понимания формата файла.
3. Выберите корректное новое имя
Используйте короткое стабильное имя из букв ASCII, цифр и дефисов. FQDN формируется DNS-доменом; не записывайте случайный FQDN в static hostname только ради hostname -f. Согласуйте имя с DNS, DHCP и правилами инвентаризации.
new='app-02'
printf '%s\n' "$new"
4. Создайте копии файлов
Перед изменением сохраните /etc/hostname, /etc/hosts и файлы сервисов, где найдено старое имя. Права и владелец должны сохраниться.
sudo cp -a /etc/hostname /etc/hostname.before-rename
sudo cp -a /etc/hosts /etc/hosts.before-rename
Для виртуальной машины полезен снимок, но он не заменяет резервную копию приложений.
Сохранение состояния без конфликта резервных копий
Одно имя hostname.before-rename легко перезаписать повторным запуском. Для реального окна создайте отдельный каталог изменения. Следующие команды не архивируют содержимое приложений; они сохраняют только имена и два системных файла.
backup="/var/backups/hostname-$(date +%Y%m%d-%H%M%S)"
sudo install -d -m 700 "$backup"
sudo cp -a /etc/hostname "$backup/hostname"
sudo cp -a /etc/hosts "$backup/hosts"
hostnamectl --static | sudo tee "$backup/static-name.txt" >/dev/null
printf 'Backup: %s\n' "$backup"
Сохраните выведенный путь в заявке на изменение. Конфигурации найденных зависимых сервисов добавляют в этот же каталог поштучно. Не выполняйте замену старого имени во всех файлах /etc: часть совпадений находится в истории, сертификатах, бинарных форматах и DNS-алиасах, которые должны остаться.
5. Установите static hostname через hostnamectl
На системах с systemd используйте штатный интерфейс. Изменение применяется сразу и сохраняется после перезагрузки.
sudo hostnamectl set-hostname app-02
hostnamectl status
На системах без systemd следуйте документации дистрибутива и обновите /etc/hostname атомарно.
Конкретная правка hostname и hosts
Для выбранной политики short static hostname установите только static-имя:
sudo hostnamectl set-hostname app-02 --static
sudoedit /etc/hosts
hostnamectl status
--static явно выбирает постоянное имя. Если transient всё ещё показывает старое значение, выясните, кто им управляет; для обычного локального сценария можно согласованно изменить transient через hostnamectl set-hostname app-02 --transient. Не заставляйте сетевой менеджер бороться с метаданными провайдера. Pretty-имя при необходимости задаётся отдельно.
Для Debian-хоста без постоянного адреса в hosts распространена строка 127.0.1.1 app-02.example.net app-02. Для хоста со статическим адресом в согласованной политике вместо неё может использоваться 192.0.2.20 app-02.example.net app-02. Выберите одну понятную схему, а не добавляйте две противоречивые строки. Первое имя после адреса считается каноническим; это влияет на hostname -f. Сохраните строки localhost и IPv6. Не направляйте бизнес-домен портала на loopback только ради устранения сообщения sudo.
getent hosts app-02
getent hosts app-02.example.net
hostname -f
sudo -v
Ожидается разрешение короткого и полного имени по принятой схеме; sudo не должен выдавать unable to resolve host. Такое предупреждение часто связано с несоответствием локального hostname и hosts, но не оправдывает подмену всех DNS-записей.
6. Обновите /etc/hosts осознанно
Сохраните localhost и IPv6-записи. На Debian/Ubuntu часто используется 127.0.1.1 shortname, но схема зависит от среды. Если сервер имеет стабильный адрес и FQDN, согласуйте строку с DNS-политикой.
127.0.0.1 localhost
127.0.1.1 app-02
После правки проверьте getent hosts app-02; не подменяйте внешний DNS локальной записью без причины.
7. Учтите cloud-init, DHCP и NetworkManager
В облачном образе cloud-init может вернуть старое имя. Проверьте preserve_hostname, метаданные провайдера и DHCP hostname. Не отключайте cloud-init целиком ради одного параметра.
grep -R "preserve_hostname" /etc/cloud /etc/cloud.cfg.d 2>/dev/null || true
nmcli general hostname 2>/dev/null || true
journalctl -u systemd-hostnamed -b --no-pager
Cloud-init, DHCP и NetworkManager: как избежать возврата имени
Проверьте, кто является источником истины в облаке. Если имя должно приходить от провайдера, измените метаданные там и выполните процедуру провайдера. Если именем управляет локальная конфигурация, отдельный файл /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg может содержать preserve_hostname: true. Проверьте установленную версию cloud-init и порядок объединения конфигурации. Этот параметр не исправляет другие компоненты, которые независимо задают transient-имя.
# /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg
preserve_hostname: true
Не запускайте cloud-init clean на рабочем сервере ради переименования: повторная инициализация затрагивает больше настроек. На NetworkManager сначала найдите активный профиль:
nmcli -t -f NAME,DEVICE connection show --active
nmcli -f ipv4.dhcp-hostname,ipv6.dhcp-hostname connection show 'Wired connection 1'
Если политикой требуется новое имя в DHCP-запросах, измените свойства конкретного профиля, сохранив старые значения. Применение сетевого профиля может оборвать удалённое соединение; выполняйте его через консоль в окно, а не слепой командой connection down/up. Статический DNS и DHCP DDNS могут иметь разных владельцев, поэтому локальная правка не гарантирует обновления PTR.
8. Обновите DNS, сертификаты и интеграции
Создайте/измените A/AAAA и PTR по принятой процедуре. Сертификат должен включать новое DNS-имя. Проверьте агенты мониторинга, backup и конфигурацию приложения. Старое имя иногда оставляют временным DNS-алиасом с датой удаления.
getent ahosts app-02.example.net
openssl s_client -connect app-02.example.net:443 -servername app-02.example.net </dev/null 2>/dev/null |
openssl x509 -noout -subject -ext subjectAltName
9. Перезапустите только зависимые сервисы
Большинство процессов увидит новое имя после перезапуска, но слепая перезагрузка скрывает, какой компонент зависел от старого. Сначала проверьте конфигурации и перезапустите согласованные сервисы; затем запланируйте reboot, если это требуется платформой.
sudo systemctl daemon-reload
sudo systemctl restart monitoring-agent.service
sudo systemctl status monitoring-agent.service --no-pager
Имя unit в примере замените на фактическое.
10. Проверьте и подготовьте возврат
После перезагрузки сравните static hostname, FQDN, DNS, журналы и бизнес-функцию. Для возврата выполните hostnamectl set-hostname со старым именем, восстановите файлы и DNS, затем повторите тесты.
hostnamectl --static
hostname -f || true
getent hosts app-02.example.net
journalctl -b -p warning --no-pager
Проверки со стороны клиента и порядок возврата
Проверьте имя с независимой клиентской машины, а не только с самого сервера. A/AAAA должны указывать на предназначенный адрес; PTR на выбранное каноническое имя. Старые DNS-ответы сохраняются в кэше до TTL. Старый алиас оставляют только при намеренной совместимости и с датой удаления. Сертификат проверяют по имени приложения, которое используют клиенты, включая hostname verification, а не только просмотр SAN.
getent ahosts app-02.example.net
curl --connect-timeout 5 --max-time 15 --fail --show-error https://portal.example.net/health
Путь /health — пример endpoint приложения; замените его утверждённым тестом. Если endpoint отсутствует, проверяйте реальную бизнес-функцию. После перезагрузки подтвердите постоянство имени, доставку журналов и отсутствие второй записи того же агента мониторинга. Возврат выполняют в обратном порядке: зависимости и DNS, hostname, hosts, затем контролируемый перезапуск. Восстановление файлов не отменяет изменений метаданных провайдера и объекта AD. Перед возвратом сравните текущие файлы с резервными, чтобы не стереть чужие последующие изменения.
Источники: hostnamectl, hostname(5), hosts(5).
Дополнительная документация: cloud-init: модули hostname, NetworkManager: IPv4/DHCP.
