Antecedentes
hostnamectl
es parte de systemd y proporciona una API adecuada para manejar la configuración de los nombres de host de un servidor de una manera estandarizada.
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
Anteriormente, cada distribución que no usaba systemd tenía sus propios métodos para hacerlo, lo que generaba mucha complejidad innecesaria.
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
también reúne una gran cantidad de datos dispares en una sola ubicación para arrancar:
$ 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
La información aquí proviene de /etc/*release
, uname -a
, etc. incluyendo el nombre de host del servidor.
¿Qué pasa con los archivos?
Por cierto, todo sigue en archivos, hostnamectl
es simplemente simplificar cómo tenemos que interactuar con estos archivos o conocer cada una de sus ubicaciones.
Como prueba de esto puedes usar strace -s 2000 hostnamectl
y ver de qué archivos está extrayendo:
$ 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-nombre de host.servicio?
Para el observador astuto, debe notar en el strace
anterior que no todos los archivos están presentes. hostnamectl
en realidad está interactuando con un servicio, systemd-hostnamectl.service
que de hecho "interactúa" con la mayoría de los archivos con los que la mayoría de los administradores estarían familiarizados, como /etc/hostname
.
Por lo tanto, cuando ejecuta hostnamectl
está recibiendo detalles del servicio. Este es un servicio bajo demanda, por lo que no verá si se ejecuta todo el tiempo. Solo cuando hostnamectl
carreras. Puedes verlo si ejecutas un watch
y luego comience a ejecutar hostnamectl
varias veces:
$ watch "ps -eaf|grep [h]ostname"
root 3162 1 0 10:35 ? 00:00:00 /usr/lib/systemd/systemd-hostnamed
La fuente está aquí:https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c y si lo revisa, verá las referencias a /etc/hostname
etc.
Referencias
- systemd/src/nombre de host/hostnamectl.c
- systemd/src/nombre de host/hostnamed.c
- nombre de host
- systemd-hostnamed.servicio