Qual é o objetivo do comando hostnamectl?

13

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

Deve haver uma boa razão (espero) - em geral prefiro muito mais a "velha" maneira, onde tudo era um arquivo de texto. Eu não estou tentando ser contencioso - eu realmente gostaria de saber e decidir por mim mesmo se é um bom motivo. Obrigado.

    
por Graham Nicholls 31.07.2018 / 16:07

2 respostas

19

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.

Referências

por 31.07.2018 / 16:13
0

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 GUIs existentes como o GNOME. systemd-hostnamed permite que um nome de host da solicitação da GUI seja alterado sem ser executado como root (dependendo da política do polkit). O Dbus também fornece um método para assinar mudanças, que é adequado às necessidades da GUI. Talvez usado por um total de um aplicativo nesses casos :). Eu não sei, talvez os relógios usem o systemd-timedated para escutar a reconfiguração do fuso horário?

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

O serviço systemd-hostnamed não é destinado a abstrair as diferenças entre distribuições. O sistema upstream foi padronizado em um único arquivo de configuração, /etc/hostname , onde anteriormente havia arquivos de configuração diferentes em, por exemplo. Debian v.s. Distribuições baseadas em Redhat.

Isso pressupõe que hostnamectl esteja falando com a implementação padrão de systemd-hostnamed. Mas AFAIK não há distribuição atual que corrija o nome do arquivo usado.

Eu quero ressaltar que o carregamento de /etc/hostname no momento da inicialização é realizado no início pelo systemd PID 1. Ele não depende da execução do systemd-hostnamed.

Eu imagino que você possa 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/hostname e, em seguida, usar hostname --file /etc/hostname para aplicar a alteração ao sistema em execução, a exibição da GUI poderá não ser atualizada instantaneamente. systemd-hostnamed fornece notificações dbus sobre alterações em todas as versões do nome do host que ele mantém, portanto, a GUI pode não se incomodar em ouvir as notificações de nome de host do sistema fornecidas nos kernels modernos do Linux.

(Tradicionalmente, é uma má idéia fazer a mudança do nome do host em tempo de execução. Isso pode causar problemas com o software, como o X . Estou confiante de que este problema não é abordado pelo systemd . foi endereçado por distribuições que usam systemd).

    
por 03.08.2018 / 13:37