hostnamectl 命令有什么意义?

hostnamectl 命令有什么意义?

与编辑 /etc/hostname 或相关的地方相反?

一定有一个很好的理由(我希望) - 一般来说,我更喜欢“旧”方式,其中所有内容都是文本文件。我并不是想引起争议——我真的很想知道,并自己决定这是否是一个很好的理由。谢谢。

答案1

背景

hostnamectl是 systemd 的一部分,并提供适当的 API 来以标准化方式设置服务器的主机名。

$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64

以前,每个不使用 systemd 的发行版都有自己的方法来执行此操作,这会带来很多不必要的复杂性。

DESCRIPTION
  hostnamectl may be used to query and change the system hostname and
  related settings.

  This tool distinguishes three different hostnames: the high-level 
  "pretty" hostname which might include all kinds of special characters 
  (e.g. "Lennart's Laptop"), the static hostname which is used to
  initialize the kernel hostname at boot (e.g. "lennarts-laptop"), and the 
  transient hostname which is a default received from network 
  configuration. If a static hostname is set, and is valid (something
   other than localhost), then the transient hostname is not used.

   Note that the pretty hostname has little restrictions on the characters 
   used, while the static and transient hostnames are limited to the 
   usually accepted characters of Internet domain names.

   The static hostname is stored in /etc/hostname, see hostname(5) for 
   more information. The pretty hostname, chassis type, and icon name are 
   stored in /etc/machine-info, see machine-info(5).

   Use systemd-firstboot(1) to initialize the system host name for mounted 
   (but not booted) system images.

hostnamectl还将大量不同的数据集中到一个位置进行启动:

$ hostnamectl
   Static hostname: centos7
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 1ec1e304541e429e8876ba9b8942a14a
           Boot ID: 37c39a452464482da8d261f0ee46dfa5
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-693.21.1.el7.x86_64
      Architecture: x86-64

这里的信息来自/etc/*releaseuname -a等,包括服务器的主机名。

文件呢?

顺便说一句,所有内容仍然在文件中,hostnamectl只是简化了我们与这些文件交互或了解它们的每个位置的方式。

作为证明,您可以使用strace -s 2000 hostnamectl并查看它从哪些文件中提取:

$ strace -s 2000 hostnamectl |& grep ^open | tail -5
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY|O_CLOEXEC) = 3
open("/etc/machine-id", O_RDONLY|O_NOCTTY|O_CLOEXEC) = 4
open("/proc/sys/kernel/random/boot_id", O_RDONLY|O_NOCTTY|O_CLOEXEC) = 4

systemd-主机名.service?

对于精明的观察者来说,您应该注意到上面strace并不是所有文件都存在。hostnamectl实际上是与服务交互,systemd-hostnamectl.service该服务实际上与大多数管理员熟悉的大多数文件进行“交互”,例如/etc/hostname.

因此,当您运行时,hostnamectl您将从服务中获取详细信息。这是一项按需服务,因此您不会看到是否一直在运行。仅当hostnamectl运行时。如果运行watch命令,然后开始运行hostnamectl多次,您可以看到它:

$ watch "ps -eaf|grep [h]ostname"
root      3162     1  0 10:35 ?        00:00:00 /usr/lib/systemd/systemd-hostnamed

它的来源在这里:https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c/etc/hostname如果你仔细查看它,你会看到对等的引用。

参考

答案2

它仍然是一个文本文件,你仍然可以编辑它,不会有问题。

文本文件已标准化为/etc/hostname.


根据维护者的说法,systemd-hostname、systemd-timedated 等服务很大程度上是为 GNOME 等现有 GUI 设计的。 systemd-hostnamed 允许 GUI 请求主机名更改,而无需以 root 身份运行(取决于 polkit 策略)。 Dbus 还提供了一种订阅更改的方法,适合 GUI 需求。在这些情况下,可能总共被一个应用程序使用:)。我不知道,也许时钟使用 systemd-timedated 来监听时区重新配置?

将 hostnamectl 视为运行 GUI 后端的存根,它可能是也可能不是有用的 CLI 实用程序。 systemd-hostnamed 特别不打算添加 GUI 代码未执行的全部功能。


systemd-hostnamed 服务是不是旨在抽象分布之间的差异。上游 systemd 在单个配置文件 上进行标准化,/etc/hostname其中以前在基于 Debian 和 Redhat 的发行版上有不同的配置文件。

这假设 hostnamectl 正在与 systemd-hostnamed 的标准实现进行对话。但据我所知,当前没有任何发行版可以修补所使用的文件名。

我想指出的是,/etc/hostname启动时的加载是由 systemd PID 1 早期执行的。它不依赖于运行 systemd-hostnamed。


我想象你可能如果您打开系统设置 GUI 并且同时显示主机名,请注意一个无害的差异。如果您进行编辑/etc/hostname,然后将hostname --file /etc/hostname更改应用到正在运行的系统,GUI 显示可能不会立即更新。 systemd-hostnamed 提供有关其维护的所有主机名版本更改的 dbus 通知,因此 GUI 可能不会费心去侦听现代 Linux 内核上提供的系统主机名通知。

(传统上,在运行时更改主机名是一个坏主意。 可能会导致X等软件出现问题。我确信这个问题没有得到解决通过系统。也许使用 systemd 的发行版已经解决了这个问题。

相关内容