Qual é o objetivo do comando hostnamectl?

17

Ao contrário de editar / etc / hostname, ou onde é relevante?

Deve haver uma boa razão (espero) - em geral, eu prefiro o jeito "antigo", onde tudo era um arquivo de texto. Não estou tentando ser contencioso - eu realmente gostaria de saber e decidir por mim mesmo se é uma boa razão. Obrigado.

Graham Nicholls
fonte
2
Definitivamente, você não está sozinho --- O Systemd introduziu muitas novas interfaces e, por isso, recebeu muitas críticas de pessoas que preferem "a maneira antiga em que tudo era um arquivo de texto".
Federico Poloni
1
@FedericoPoloni Ou onde nem tudo era um arquivo de texto, como consultas DNS sendo convertidas em XML sem motivo.
usar o seguinte comando
DNS-> xml. Desculpe, você terá que criar um exemplo, por favor. XML IMO é a invenção de Satanás, BTW.
Graham Nicholls

Respostas:

22

fundo

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 distribuição que não usava 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

A informação aqui é que vem /etc/*release, uname -aetc. incluindo o nome do servidor.

E os arquivos?

Aliás, tudo ainda está nos arquivos, hostnamectlestá apenas simplificando a forma como temos que interagir com esses arquivos ou conhecer todos os seus locais.

Como prova disso, você pode usar strace -s 2000 hostnamectle ver de quais arquivos ele está acessando:

$ 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 observador astuto, você deve observar acima straceque nem todos os arquivos estão presentes. hostnamectlestá realmente interagindo com um serviço, systemd-hostnamectl.serviceque de fato "interage" com a maioria dos arquivos com os quais a maioria dos administradores estaria familiarizada, como /etc/hostname.

Portanto, quando você executa, hostnamectlobtém detalhes do serviço. Este é um serviço ondemand, para que você não veja se está executando o tempo todo. Somente quando hostnamectlé executado. Você pode vê-lo se executar um watchcomando e começar a executar hostnamectlvá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 está aqui: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c e se você olhar através dele, verá as referências a /etc/hostnameetc.

Referências

slm
fonte
Consulte unix.stackexchange.com/a/454785/5132 para obter um exemplo de leitura direta do (s) arquivo (s).
31418 JdeBP
Existe uma razão para saudar a saída em vez de usar -e open,openat?
YdaetskcoR
@ydaetskcoR - sem motivo técnico, estava sendo preguiçoso e não procurou os switches para strace8-). Embora, para ser sincero, eu ainda precisasse grepobter a saída da maneira que queria, porque straceainda mostraria a saída do hostnamectlcmd, então meu caminho foi mais curto.
Slm
"... fornece uma API adequada para lidar com a configuração de nomes de host de um servidor de maneira padronizada." Em outras palavras, eles adicionaram mais um padrão. :-) Pode-se notar também que desde o início, existem pelo menos meia dúzia de garfos no projeto, o que provavelmente significa meia dúzia de outros "padrões" adicionais.
UncaAlby
Estou lhe dando um +1 apenas por esse idioma útil rpm -qf $(type -P hostnamectl)que preciso lembrar desse!
Mark Borgerding
1

Ainda é um arquivo de texto, você ainda pode editá-lo e não haverá problemas.

O arquivo de texto foi padronizado para /etc/hostname.


De acordo com o mantenedor, os serviços systemd-hostname, systemd-timedated etc foram muito projetados para GUI (s) existente (s) como o GNOME. systemd-hostnamed permite que uma GUI solicite alterações no nome do host sem executar como root (dependendo da política do polkit). O Dbus também fornece um método para assinar alterações, adequado às necessidades da GUI. Talvez usado por um total de um aplicativo nesses casos :). Não sei, talvez os relógios usem systemd-timedated para ouvir a reconfiguração do fuso horário?

Pense no hostnamectl como um stub para exercitar o back-end da GUI, que também pode ou não ser um utilitário útil da CLI. O systemd-hostnamed não se destina especificamente a adicionar recursos inteiros que não são exercidos pelo código da GUI.


O serviço systemd-hostnamed não se destina a abstrair as diferenças entre distribuições. O sistema upstream padronizou em um único arquivo de configuração /etc/hostname, onde havia arquivos de configuração anteriormente diferentes em, por exemplo, distribuições baseadas no Debian vs Redhat.

Isso pressupõe que o hostnamectl esteja conversando com a implementação padrão do systemd-hostnamed. Mas o AFAIK não existe uma distribuição atual que atualize o nome do arquivo usado.

Quero ressaltar que o carregamento /etc/hostnameno momento da inicialização é realizado desde o início pelo systemd PID 1. Ele não depende da execução do systemd-hostnamed.


Eu imagino que você pode notar uma diferença inofensiva, se você tiver uma GUI de configurações do sistema aberta e mostrar o nome do host ao mesmo tempo. Se você editar /etc/hostnamee usar hostname --file /etc/hostnamepara aplicar a alteração no sistema em execução, a exibição da GUI poderá não ser atualizada instantaneamente. systemd-hostnamed fornece notificações ao dbus sobre alterações em todas as versões do nome do host que mantém, portanto, a GUI pode não se dar ao trabalho de ouvir as notificações do nome do host do sistema fornecidas nos kernels modernos do Linux.

(Tradicionalmente, é uma má idéia alterar o nome do host no tempo de execução. Isso pode causar problemas com softwares como o X. Estou certo de que esse problema não foi resolvido pelo systemd . Talvez tenha sido solucionado por distribuições que usam o systemd) .

sourcejedi
fonte