Смена имени машины ломает работу служб
Имя машины попадает в настройки служб, сертификаты, идентификаторы участников кластеров и записи журнала. Смена имени на работающей системе задевает всё это сразу, и отказы проявляются не при переименовании, а при следующем перезапуске служб.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Имя запомнено в настройках службы
Службы кластеров и очередей запоминают имя узла в своих данных. После переименования они не находят своё состояние.
-
Имя не совпадает с сертификатом
Сертификаты выписаны на конкретное имя. После переименования клиенты получают предупреждения о несовпадении.
-
Имя не прописано в файле узлов
Без записи в файле узлов разрешение собственного имени отказывает, и часть служб не запускается вовсе.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Текущее имя машины во всех его видах.
hostnamectl statusРазрешается ли собственное имя машины.
getent hosts "$(hostname)" || echo имя не разрешаетсяЧто службы говорят об имени узла.
journalctl -b --no-pager | grep -iE "hostname|nodename" | tail -15Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Службы кластеров и очередей запоминают имя узла в своих данных. После переименования они не находят своё состояние.
- Как проверить
-
Посмотрите текущее имя и сообщения служб.
hostnamectl status | head -5 journalctl -b --no-pager | grep -iE "nodename|hostname" | tail -10
- Как исправить
- Верните прежнее имя либо выполните штатную процедуру смены имени узла для каждой затронутой службы. Порядок зависит от службы, общего способа нет.
- Почему происходит
- Сертификаты выписаны на конкретное имя. После переименования клиенты получают предупреждения о несовпадении.
- Как проверить
-
Сравните имя в сертификате и текущее.
hostname -f openssl x509 -in /etc/ssl/certs/server.pem -noout -subject 2>/dev/null
- Как исправить
- Перевыпустите сертификаты на новое имя. Проверять надо и дополнительные имена в сертификате, а не только основное.
- Почему происходит
- Без записи в файле узлов разрешение собственного имени отказывает, и часть служб не запускается вовсе.
- Как проверить
-
Посмотрите файл узлов и разрешение имени.
grep -nE "127\.0\.(0|1)\.1" /etc/hosts getent hosts "$(hostname)" || echo имя не разрешается
- Как исправить
- Добавьте новое имя в файл узлов. Это первое, что нужно сделать после переименования: многие службы разрешают собственное имя при старте.
Пример вывода
Служба не находит своё состояние под новым именем. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Started rabbitmq-server.service - RabbitMQ Messaging Server.
rabbitmq[10100]: Error: unable to perform an operation on node 'rabbit@old-name'
rabbitmq[10100]: * connected to epmd (port 4369) on new-name
rabbitmq[10100]: * epmd reports: node 'rabbit' not running at all
Связанные ошибки
- RabbitMQ: узел не находит свои данные после смены имени машины Имя узла RabbitMQ включает имя хоста. После его смены брокер не видит прежние очереди.
- etcd: узел не входит в кластер после переустановки Узел отказывается присоединяться: идентификатор кластера не совпадает с остальными. Разбор и безопасный порядок действий.
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- Узел кластера не поднимается: включён раздел подкачки Служба узла кластера отказывается стартовать при включённой подкачке. Как отключить правильно.
- Узел поиска не входит в кластер: имя кластера не совпадает Узел работает сам по себе: имя кластера или список узлов для обнаружения заданы иначе, чем у остальных.
- Узлы очередей не соединяются: не совпадает файл общего секрета Узлы не видят друг друга, а команды управления отказывают: файл общего секрета различается или недоступен.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
Где встречается чаще всего
Источники
-
hostnamectl(1)
Виды имени машины и их смена. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено переименованием машины с работающей службой очередей.