与编辑/ etc / hostname或与之相关的地方相反?
一定有一个很好的理由(我希望)-总的来说,我更喜欢“旧”方式,因为所有方式都是文本文件。我并不是想引起争议-我真的很想知道,并自己决定这是否是一个很好的理由。谢谢。
与编辑/ etc / hostname或与之相关的地方相反?
一定有一个很好的理由(我希望)-总的来说,我更喜欢“旧”方式,因为所有方式都是文本文件。我并不是想引起争议-我真的很想知道,并自己决定这是否是一个很好的理由。谢谢。
Answers:
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/*release
,uname -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
对于精明的观察者,您应该在上面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
etc 的引用。
-e open,openat
?
strace
8-)的开关。虽然老实说,我仍然仍然需要grep
以我想要显示的方式获得输出,b / c strace
仍然会显示hostnamectl
cmd 的输出,所以我的方法更短了。
rpm -qf $(type -P hostnamectl)
您记住那个习惯用法!
它仍然是一个文本文件,您仍然可以对其进行编辑,并且不会出现问题。
文本文件已标准化为/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的发行版已解决了该问题。) 。