Hintergrund
hostnamectl
ist Teil von systemd und bietet eine geeignete API, um die Hostnamen eines Servers auf standardisierte Weise festzulegen.
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
Zuvor hatte jede Distribution, die systemd nicht verwendete, ihre eigenen Methoden, was zu einer Menge unnötiger Komplexität führte.
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
Außerdem werden viele unterschiedliche Daten an einem einzigen Speicherort zusammengeführt, um zu booten:
$ 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
Die Informationen hier herkommt /etc/*release
, uname -a
usw. , einschließlich dem Hostnamen des Servers.
Was ist mit den Dateien?
Übrigens ist alles noch in Dateien, hostnamectl
es vereinfacht nur, wie wir mit diesen Dateien interagieren müssen oder wo sie sich befinden.
Als Beweis dafür können Sie strace -s 2000 hostnamectl
sehen, aus welchen Dateien sie stammen:
$ 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?
Für den scharfsinnigen Beobachter sollten Sie oben feststellen, strace
dass nicht alle Dateien vorhanden sind. hostnamectl
interagiert tatsächlich mit einem Dienst, systemd-hostnamectl.service
der in der Tat die "Interaktion" mit den meisten Dateien ausführt, mit denen die meisten Administratoren vertraut wären, wie z /etc/hostname
.
Wenn Sie ausgeführt werden, erhalten hostnamectl
Sie daher Details vom Dienst. Dies ist ein On-Demand-Dienst, sodass Sie nicht sehen können, ob er ständig ausgeführt wird. Nur wenn hostnamectl
läuft. Sie können es sehen, wenn Sie einen watch
Befehl ausführen und dann hostnamectl
mehrmals starten :
$ watch "ps -eaf|grep [h]ostname"
root 3162 1 0 10:35 ? 00:00:00 /usr/lib/systemd/systemd-hostnamed
Die Quelle dafür ist hier: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c und wenn Sie es durchsehen, sehen Sie die Verweise auf /etc/hostname
usw.
Verweise