¿Cuál es el punto del comando hostnamectl?

17

¿A diferencia de editar / etc / hostname, o donde sea relevante?

Debe haber una buena razón (espero): en general, prefiero la forma "antigua", donde todo era un archivo de texto. No estoy tratando de ser polémico; realmente me gustaría saberlo y decidir por mí mismo si es una buena razón. Gracias.

Graham Nicholls
fuente
2
Definitivamente no estás solo --- Systemd introdujo muchas interfaces nuevas y debido a eso recibió muchas críticas por parte de las personas que prefieren "la vieja forma en que todo era un archivo de texto".
Federico Poloni
1
@FedericoPoloni O donde no todo era un archivo de texto, como que las consultas DNS se convirtieran a XML sin ningún motivo.
chrylis -on strike-
DNS-> xml. Lo sentimos, tendrás que dar un ejemplo, por favor. IMO XML es la invención de satanás, por cierto.
Graham Nicholls el

Respuestas:

22

Antecedentes

hostnamectl es parte de systemd y proporciona una API adecuada para tratar de configurar los nombres de host de un servidor de forma 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 una gran 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 muchos 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 que aquí está viniendo /etc/*release, uname -a, etc., incluyendo el nombre de host del servidor.

¿Qué hay de los archivos?

Por cierto, todo sigue en los archivos, hostnamectlsimplemente está simplificando cómo tenemos que interactuar con estos archivos o conocer cada una de sus ubicaciones.

Como prueba de esto, puede usar strace -s 2000 hostnamectly 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-hostname.service?

Para el observador astuto, debe notar en lo anterior straceque no todos los archivos están presentes. hostnamectlen realidad está interactuando con un servicio, systemd-hostnamectl.serviceque 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 hostnamectlobtiene detalles del servicio. Este es un servicio a pedido, por lo que no verá si se ejecuta todo el tiempo. Solo cuando hostnamectlcorre. Puede verlo si ejecuta un watchcomando y luego comienza a ejecutarse hostnamectlvarias 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/hostnameetc.

Referencias

slm
fuente
Consulte unix.stackexchange.com/a/454785/5132 para ver un ejemplo de lectura directa de los archivos.
JdeBP
¿Hay alguna razón para grep la salida en lugar de usar -e open,openat?
ydaetskcoR
@ydaetskcoR: sin razón técnica, era flojo y no buscó los interruptores en strace8-). Aunque, para ser honesto, todavía habría necesitado el greppara obtener la salida de la forma en que quería mostrarlo, b / c stracetodavía habría mostrado la salida del hostnamectlcmd, por lo que mi camino fue más corto.
slm
"... proporciona una API adecuada para tratar de configurar los nombres de host de un servidor de forma estandarizada". En otras palabras, agregaron un estándar más. :-) También se podría notar que desde su inicio, hay al menos media docena de tenedores del proyecto, lo que probablemente significa media docena más de "estándares" adicionales.
UncaAlby
¡Te doy un +1 solo por esa práctica frase rpm -qf $(type -P hostnamectl)que tengo que recordar!
Mark Borgerding
1

Todavía es un archivo de texto, aún puede editarlo y no habrá ningún problema.

El archivo de texto ha sido estandarizado para /etc/hostname.


Según el mantenedor, los servicios systemd-hostname, systemd-timedated, etc. fueron diseñados para GUI (s) existentes como GNOME. systemd-hostnamed permite que una GUI solicite cambios en el nombre de host sin ejecutarse como root (según la política de Polkit). Dbus también proporciona un método para suscribir cambios, que se adapta a las necesidades de la GUI. Tal vez utilizado por un total de una aplicación en estos casos :). No sé, ¿tal vez los relojes usan systemd-timedated para escuchar la reconfiguración de la zona horaria?

Piense en hostnamectl como un código auxiliar para ejercitar el backend de la GUI, que podría o no ser una utilidad CLI útil. systemd-hostnamed específicamente no está destinado a agregar funciones completas que no son ejercidas por el código GUI.


El servicio systemd-hostnamed no pretende abstraer las diferencias entre distribuciones. Upstream systemd estandarizado en un solo archivo de configuración /etc/hostname, donde anteriormente había diferentes archivos de configuración en, por ejemplo, distribuciones basadas en Debian vs Redhat.

Esto supone que hostnamectl está hablando con la implementación estándar de systemd-hostnamed. Pero AFAIK no hay distribución actual que parchee el nombre de archivo utilizado.

Quiero señalar que la carga /etc/hostnameen el momento del arranque se realiza desde el principio por systemd PID 1. No depende de ejecutar systemd-hostnamed.


Me imagino que puede notar una diferencia inofensiva, si tiene una GUI de configuración del sistema abierta y muestra el nombre de host al mismo tiempo. Si edita /etc/hostnamey luego usahostname --file /etc/hostname para aplicar el cambio al sistema en ejecución, la pantalla de la GUI podría no actualizarse instantáneamente. systemd-hostnamed proporciona notificaciones dbus sobre los cambios en todas las versiones del nombre de host que mantiene, por lo que la GUI podría no molestarse en escuchar las notificaciones de nombre de host del sistema proporcionadas en los núcleos modernos de Linux.

(Tradicionalmente, es una mala idea cambiar el nombre de host en tiempo de ejecución. Puede causar problemas con software como X. Estoy seguro de que este problema no se soluciona con systemd . Quizás se haya solucionado mediante distribuciones que usan systemd) .

sourcejedi
fuente