如何重命名 Linux 主机而无需重新启动以使重命名生效?

Pet*_*tch 26 linux ubuntu hostname

我在 serverfault 上搜索了这个问题的答案,但找不到。我知道这是可能的,但我不记得怎么做。如何更改 Linux 主机的主机名并在不重新启动的情况下使更改生效?

我正在使用 Ubuntu 16 和 Ubuntu 18。

Ubuntu 的一大特色是图形桌面和图形系统实用程序。但是,我们在生产环境中运行 Ubuntu,因此我们选择不使用图形桌面或实用程序,以免这些功能消耗我们在生产环境中所需的资源。

我知道要重命名主机,我会编辑文件:

  • /etc/hostname
  • /etc/hosts

/etc/hostname一个只是用新的主机名替换当前的主机名(即将成为以前的主机名)。

/etc/hosts文件中的Ubuntu有一行:

127.0.1.1 your-hostname your-hostname
Run Code Online (Sandbox Code Playgroud)

当您的主机启动并在您的网络中建立自己时,它充当引导程序。在更改主机名之前,your-hostname是当前的(即将成为以前的主机名)并且作为更改主机的主机名的一部分,用新名称替换该名称。

我熟悉的是执行上述两个步骤,然后重新启动您的主机。但是很多时候,就像使用生产服务器一样,人们希望执行重命名,而不是重新启动主机。

如何更改主机上的主机名并在不重新启动主机的情况下使更改生效?

Mic*_*ton 49

您可以使用该hostnamectl工具在基于 systemd 的系统上更改内核对主机名的想法。例如:

hostnamectl set-hostname whatever
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令查看系统当前对主机名的看法:

hostnamectl             # equivalent to hostnamectl status
Run Code Online (Sandbox Code Playgroud)

请记住,这不会改变正在运行的进程对主机名的看法。这样的进程必须再次检查主机名才能更新,而且几乎没有进程这样做。因此,需要重新启动这样的过程。为了让每个进程开始使用新的主机名,它们必须重新启动。重新启动系统通常比单独重新启动每个服务更容易。

  • 一个常见的误解是,整个“网络”是一个可以重新启动的用户空间服务,仅仅因为 /etc/init.d 脚本是这样命名的。 (5认同)
  • @PeterJirak:完全没用。如果那些程序(需要知道主机名)以前不费心观察主机名更新,那么它们现在就不会费心了。告诉系统在 eth0 上重新配置 IP 地址不会有任何影响。 (3认同)
  • @PeterJirak 作为旁注,在`/etc/init.d` 中运行服务在 systemd 系统上是错误的。它只是为了向后兼容旧的 System V。 (2认同)

use*_*686 22

您可以使用以下方法更改内核中的主机名:

hostname NEWNAME
Run Code Online (Sandbox Code Playgroud)

在 Linux 上,这实际上等于以下任一项:

sysctl kernel.hostname=NEWNAME

echo NEWNAME > /proc/sys/kernel/hostname
Run Code Online (Sandbox Code Playgroud)

这并不取决于systemd(不像hostnamectl这需要systemd-hostnamed)或任何其他非标刀具,常(尤其是在shell脚本,初始化系统)是最初的主机名是如何在第一时间设置。

大多数程序和服务实际上并不使用主机名;少数这样做(例如 Postfix 或使用 Kerberos 的服务)可以一一重新启动。

(有些程序会缓存主机名直到重新启动,其他程序每次需要时都会查询它。程序还可以通过 poll(2) /proc/sys/kernel/hostname 来接收更改通知,但很少有人这样做。)

  • 幸运的是,OP 已经在他们的问题本身中涵盖了持久性。 (3认同)
  • 请记住,这些方法不是持久的,并且不会在重新启动后继续存在。 (2认同)
  • postfix 可能会将主机名硬编码在 `/etc/postfix/main.cf` 和 `/etc/mailname` 中的一两个位置,因此也需要编辑这些主机名。 (2认同)