Antecedentes
hostnamectl
faz parte do systemd e fornece uma API adequada para lidar com a configuração de nomes de host de um servidor de maneira padronizada.
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
Anteriormente, cada distro que não usava o systemd tinha seus próprios métodos para fazer isso, o que gerava muita complexidade desnecessária.
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
também reúne muitos dados diferentes em um único local para inicializar:
$ 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
As informações aqui são provenientes de /etc/*release
, uname -a
, etc., incluindo o nome do host do servidor.
E os arquivos?
Por acaso, tudo ainda está em arquivos, hostnamectl
é meramente simplificar a forma como temos que interagir com esses arquivos ou conhecer todas as suas localizações.
Como prova disso, você pode usar strace -s 2000 hostnamectl
e ver de que arquivos está sendo extraído:
$ 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?
Para o astuto observador, você deve notar nostrace
acima que nem todos os arquivos estão presentes. hostnamectl
está realmente interagindo com um serviço, systemd-hostnamectl.service
, que na verdade faz a "interação" com a maioria dos arquivos com os quais a maioria dos administradores estaria familiarizada, como /etc/hostname
.
Portanto, quando você executar hostnamectl
, receberá detalhes do serviço. Este é um serviço ondemand, para que você não veja se está correndo o tempo todo. Apenas quando hostnamectl
é executado. Você pode vê-lo se executar um comando watch
e, em seguida, começar a executar hostnamectl
várias vezes:
$ watch "ps -eaf|grep [h]ostname"
root 3162 1 0 10:35 ? 00:00:00 /usr/lib/systemd/systemd-hostnamed
A fonte para isso é aqui: link e se você examinar você verá as referências a /etc/hostname
etc.