hostnamectl命令的意义是什么?


17

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

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


2
您绝对不是唯一一个人--- Systemd引入了许多新接口,因此它吸引了许多人的青睐,这些人更喜欢“一切都是文本文件的旧方法”。
Federico Poloni '18

1
@FedericoPoloni还是不是所有都是文本文件,例如DNS查询无缘无故地转换为XML。
克莱里斯

DNS-> xml。抱歉,请您举一个例子。IMO XML是BTW撒旦(Satan)的发明。
格雷厄姆·尼科尔斯

Answers:


22

背景

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-hostname.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/hostnameetc 的引用。

参考文献


有关直接读取文件的示例,请参见unix.stackexchange.com/a/454785/5132
JdeBP '18年

是否有理由grep输出而不是使用-e open,openat
ydaetskcoR

@ydaetskcoR-没有技术原因,很懒,没有查找到strace8-)的开关。虽然老实说,我仍然仍然需要grep以我想要显示的方式获得输出,b / c strace仍然会显示hostnamectlcmd 的输出,所以我的方法更短了。
slm

“ ...提供了适当的API,用于处理以标准化方式设置服务器的主机名。” 换句话说,他们又增加了一个标准。:-)也许还会有人注意到,自项目开始以来,至少有六个分支来自该项目,这可能意味着还有六个附加的“标准”。
UncaAlby

我为您提供一个+1,仅是为了方便rpm -qf $(type -P hostnamectl)您记住那个习惯用法!
马克博格丁

1

它仍然是一个文本文件,您仍然可以对其进行编辑,并且不会出现问题。

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


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

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


该systemd-hostnamed服务打算分布之间的抽象了分歧。在单个配置文件上标准化的上游系统,/etc/hostname,以前在基于Debian和Redhat的发行版上存在不同的配置文件。

假设hostnamectl正在与systemd-hostnamed的标准实现进行对话。但是AFAIK没有当前发行版来修补所使用的文件名。

我想指出的是/etc/hostname,引导时的加载是由systemd PID 1提前执行的。它不依赖于运行systemd-hostnamed。


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

(传统上,在运行时更改主机名是一个坏主意。 这可能会导致诸如X的软件出现问题。我相信systemd不会解决此问题。也许使用systemd的发行版已解决了该问题。) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.