Как переименовать хост Linux без необходимости перезагрузки, чтобы переименование вступило в силу?

26

Я искал ответ на этот вопрос о сбое сервера и не смог его найти. Я знаю, что это возможно, но я не могу вспомнить, как это сделать. Как изменить имя хоста Linux-узла и заставить это изменение вступить в силу без перезагрузки?

Я использую Ubuntu 16 и Ubuntu 18.

Большой особенностью Ubuntu являются графические утилиты рабочего стола и графические системы. Тем не менее, мы используем Ubuntu в нашей производственной среде, поэтому мы решили не использовать графический рабочий стол или утилиты, чтобы эти функции не потребляли ресурсы, которые нам нужны в нашей производственной среде.

Я знаю, что для переименования хоста я редактирую файлы:

  • /etc/hostname
  • /etc/hosts

В /etc/hostnameодном просто заменяется текущее имя хоста (скоро будет прежним именем хоста) новым именем хоста.

Ubuntu в /etc/hostsфайле имеет строку:

127.0.1.1 your-hostname your-hostname

Он действует как начальная загрузка, пока ваш хост загружается и устанавливает себя в вашей сети. Прежде чем изменить имя хоста, оно your-hostnameявляется текущим (которое вскоре станет прежним именем хоста) и, как часть изменения имени хоста вашего хоста, один заменяет это имя новым именем.

Я знаком с тем, что выполнил два вышеупомянутых шага и затем перезагрузил ваш хост. Но во многих случаях, как и на производственном сервере, хотелось бы выполнить это переименование, но не перезагружать хост.

Как я могу изменить имя хоста на хосте и заставить это изменение вступить в силу без перезагрузки хоста?

Питер Джирак Элдрич
источник
1
Не существует таких понятий, как «Ubuntu 16» и «Ubuntu 18», между 16.04 и 16.10 могут быть такие большие различия, как между 16.10 и 17.04.
труба

Ответы:

49

Вы можете изменить представление ядра об имени хоста в системной системе, используя hostnamectlинструмент. Например:

hostnamectl set-hostname whatever

Вы можете просмотреть текущую идею системы об имени хоста с помощью:

hostnamectl             # equivalent to hostnamectl status

Имейте в виду, что это не меняет представление запущенного процесса об имени хоста. Такой процесс должен был бы проверить имя хоста снова, чтобы быть обновленным, и почти никакой процесс не делает. Таким образом, такой процесс должен быть перезапущен. Чтобы каждый процесс начал использовать новое имя хоста, их необходимо перезапустить. Обычно проще просто перезагрузить систему, чем перезапускать каждый сервис по отдельности.

Майкл Хэмптон
источник
1
Нужно ли перезапускать сеть на моем сервере, если я не хочу перезагружать его после переименования? Я обнаружил следующее: sudo /etc/init.d/network restart кроме этого, перезапуская сеть на моем сервере с помощью этой команды, вы указываете на перезапуск любого запущенного процесса, который должен знать, что имя сервера является действительным. Договорились, что перезапуск хоста это исправит. Тем не менее, бывают случаи, когда я действительно хочу переименовать хост, но на самом деле не хочу его перезагружать. Есть мнение sudo /etc/init.d/network restartи его полезность для получения нового имени хоста после перезагрузки?
Питер Джирак Элдрич
3
@PeterJirak: совершенно бесполезно. Если те программы (которым нужно знать имя хоста) раньше не удосужились следить за обновлениями имени хоста, то теперь они не будут беспокоиться. Указание системе перенастроить IP-адреса на eth0 ни на что не повлияет.
Гравитация
@PeterJirak Что вы подразумеваете под "получением нового имени хоста для вступления в силу"? Как обсуждалось ранее, он вступает в силу немедленно, и любой новый процесс будет знать об этом. Я также не понимаю, почему вы спрашиваете о перезагрузке сети? Какое это имеет отношение к имени хоста?
Майкл Хэмптон
5
Распространенным заблуждением является то, что весь «сетевой» сервис - это сервис пользовательского пространства, который можно перезапустить только потому, что есть скрипт /etc/init.d с таким названием.
Гравитация
2
@PeterJirak Как примечание, запуск служб в /etc/init.dсистемах systemd является неправильным способом. Это просто для обратной совместимости со старой Системой V.
rexkogitans
22

Вы можете изменить имя хоста в ядре, используя:

hostname NEWNAME

В Linux это практически равно одному из следующих:

sysctl kernel.hostname=NEWNAME

echo NEWNAME > /proc/sys/kernel/hostname

Это не зависит от systemd (в отличие от hostnamectl, который требует systemd-hostname) или любых других нестандартных инструментов, и часто (особенно в системах с шеллскриптом-init) в первую очередь задается исходное имя хоста.

Большинство программ и сервисов фактически не используют имя хоста; некоторые из них (например, Postfix или службы, использующие Kerberos) могут быть перезапущены один за другим.

(Некоторые программы кэшируют имя хоста до перезапуска, другие запрашивают его каждый раз, когда им это необходимо. Программы также имеют возможность опроса (2) / proc / sys / kernel / hostname для получения уведомлений об изменениях, но немногие делают.)

grawity
источник
2
Имейте в виду, что эти методы не являются постоянными и не переживут перезагрузку.
Майкл Хэмптон
3
К счастью, OP уже рассмотрел упорство в их вопросе.
Гравитация
1
В postfix имя хоста может быть жестко запрограммировано в одном или двух местах, /etc/postfix/main.cfи /etc/mailnameпоэтому их тоже нужно будет отредактировать.
Марк Плотник