sfondo
hostnamectl
fa parte di systemd e fornisce un'API appropriata per gestire l'impostazione dei nomi host di un server in modo standardizzato.
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
In precedenza ogni distro che non utilizzava systemd, aveva i propri metodi per farlo, il che rendeva molto inutile la complessità.
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
raccoglie anche molti dati disparati in un'unica posizione per l'avvio:
$ 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
L'informazioni qui proviene da /etc/*release
, uname -a
, ecc compreso il nome host del server.
E i file?
Per inciso, tutto è ancora nei file, hostnamectl
sta semplicemente semplificando il modo in cui dobbiamo interagire con questi file o conoscere ogni loro posizione.
A riprova di ciò puoi usare strace -s 2000 hostnamectl
e vedere da quali file sta estraendo:
$ 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?
All'osservatore astuto, dovresti notare in precedenza strace
che non tutti i file sono presenti. hostnamectl
sta effettivamente interagendo con un servizio, systemd-hostnamectl.service
che in effetti fa "interagire" con la maggior parte dei file con cui la maggior parte degli amministratori avrebbe familiarità, come /etc/hostname
.
Pertanto, quando corri hostnamectl
, ricevi i dettagli dal servizio. Questo è un servizio ondemand, quindi non vedrai se in esecuzione tutto il tempo. Solo quando hostnamectl
corre. È possibile visualizzarlo se si esegue un watch
comando e quindi si avvia hostnamectl
più volte:
$ watch "ps -eaf|grep [h]ostname"
root 3162 1 0 10:35 ? 00:00:00 /usr/lib/systemd/systemd-hostnamed
La fonte è qui: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c e se lo guardi, vedrai i riferimenti a /etc/hostname
ecc.
Riferimenti