Hintergrund
hostnamectl
ist Teil von systemd und bietet eine geeignete API für die standardisierte Einstellung der Hostnamen eines Servers.
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
Früher hatte jede Distribution, die systemd nicht verwendete, ihre eigenen Methoden, um dies zu tun, 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
zieht auch viele unterschiedliche Daten an einem einzigen Ort zusammen, 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 stammen von /etc/*release
, uname -a
, usw. einschließlich des Hostnamens des Servers.
Was ist mit den Dateien?
Übrigens ist alles noch in Dateien, hostnamectl
vereinfacht lediglich, wie wir mit diesen Dateien interagieren oder ihren jeweiligen Speicherort kennen müssen.
Als Beweis dafür können Sie strace -s 2000 hostnamectl
verwenden und sehen, aus welchen Dateien es zieht:
$ 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 sollte Ihnen obiger strace
auffallen dass nicht alle Dateien vorhanden sind. hostnamectl
tatsächlich mit einem Dienst interagiert, systemd-hostnamectl.service
was tatsächlich die "Interaktion" mit den meisten Dateien übernimmt, mit denen die meisten Administratoren vertraut sind, wie z. B. /etc/hostname
.
Daher, wenn Sie hostnamectl
ausführen Sie erhalten Details vom Dienst. Dies ist ein On-Demand-Dienst, sodass Sie nicht sehen, ob er die ganze Zeit läuft. Nur bei hostnamectl
läuft. Sie können es sehen, wenn Sie watch
ausführen Befehl, und starten Sie dann die Ausführung von hostnamectl
mehrfach:
$ 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 sie durchsehen, sehen Sie die Verweise auf /etc/hostname
usw.
Referenzen
- systemd/src/hostname/hostnamectl.c
- systemd/src/hostname/hostnamed.c
- hostnamectl
- systemd-hostnamed.service