Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

Как изменить имя компьютера в Linux и не сломать сеть

Смена имени компьютера Linux: hostnamectl, /etc/hosts, cloud-init, DHCP, DNS, сертификаты, сервисы, проверка и быстрый возврат.
Как изменить имя компьютера в Linux и не сломать сеть — техническая иллюстрация

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

Смена hostname Linux: зависимости, hostnamectl, hosts, 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.