Qual è il punto del comando hostnamectl?


17

A differenza della modifica di / etc / hostname, o ovunque sia rilevante?

Ci deve essere una buona ragione (spero) - in generale preferisco di gran lunga il modo "vecchio", in cui tutto era un file di testo. Non sto cercando di essere controverso - mi piacerebbe davvero sapere e decidere da solo se è una buona ragione. Grazie.


2
Sicuramente non sei il solo --- Systemd ha introdotto molte nuove interfacce e per questo ha ricevuto molte critiche da persone che preferiscono "il vecchio modo in cui tutto era un file di testo".
Federico Poloni,

1
@FedericoPoloni O dove non tutto era un file di testo, come le query DNS che venivano convertite in XML senza motivo.
Chrylis

DNS-> xml. Scusa, dovrai inventarti un esempio, per favore. IMO XML è l'invenzione di Satana, BTW.
Graham Nicholls,

Risposte:


22

sfondo

hostnamectl fa parte di systemd e fornisce un'API appropriata per gestire l'impostazione dei nomi host di un server in modo standardizzato.

$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64

In precedenza ogni distro che non utilizzava systemd, aveva i propri metodi per farlo, il che rendeva molto inutile la complessità.

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 raccoglie anche molti dati disparati in un'unica posizione per l'avvio:

$ 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

L'informazioni qui proviene da /etc/*release, uname -a, ecc compreso il nome host del server.

E i file?

Per inciso, tutto è ancora nei file, hostnamectlsta semplicemente semplificando il modo in cui dobbiamo interagire con questi file o conoscere ogni loro posizione.

A riprova di ciò puoi usare strace -s 2000 hostnamectle vedere da quali file sta estraendo:

$ 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?

All'osservatore astuto, dovresti notare in precedenza straceche non tutti i file sono presenti. hostnamectlsta effettivamente interagendo con un servizio, systemd-hostnamectl.serviceche in effetti fa "interagire" con la maggior parte dei file con cui la maggior parte degli amministratori avrebbe familiarità, come /etc/hostname.

Pertanto, quando corri hostnamectl, ricevi i dettagli dal servizio. Questo è un servizio ondemand, quindi non vedrai se in esecuzione tutto il tempo. Solo quando hostnamectlcorre. È possibile visualizzarlo se si esegue un watchcomando e quindi si avvia hostnamectlpiù volte:

$ watch "ps -eaf|grep [h]ostname"
root      3162     1  0 10:35 ?        00:00:00 /usr/lib/systemd/systemd-hostnamed

La fonte è qui: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c e se lo guardi, vedrai i riferimenti a /etc/hostnameecc.

Riferimenti


Vedere unix.stackexchange.com/a/454785/5132 per un esempio di lettura diretta dei file.
JdeBP

C'è un motivo per grep l'output anziché l'uso -e open,openat?
ydaetskcoR

@ydaetskcoR - nessun motivo tecnico, era pigro e non cercava gli interruttori su straceCool. Tutto sommato, ad essere sincero, avrei comunque avuto bisogno del grepper ottenere l'output nel modo in cui volevo mostrarlo, b / c il straceavrebbe comunque mostrato l'output del hostnamectlcmd, quindi il mio modo era più breve.
slm

"... fornisce un'API adeguata per gestire l'impostazione dei nomi host di un server in modo standardizzato." In altre parole, hanno aggiunto un altro standard. :-) Si potrebbe anche notare che sin dal suo inizio, ci sono almeno una mezza dozzina di forchette dal progetto, il che probabilmente significa una mezza dozzina di "standard" aggiuntivi.
UncaAlby,

Ti sto dando un +1 solo per quel linguaggio pratico che rpm -qf $(type -P hostnamectl)devo ricordare quello!
Mark Borgerding,

1

È ancora un file di testo, puoi ancora modificarlo e non ci saranno problemi.

Il file di testo è stato standardizzato /etc/hostname.


Secondo il manutentore, i servizi systemd-hostname, systemd-timedated etc erano progettati per GUI esistenti come GNOME. systemd-hostname consente a una GUI di richiedere la modifica del nome host senza essere eseguita come root (a seconda della politica polkit). Dbus fornisce anche un metodo per sottoscrivere le modifiche, adatto alle esigenze della GUI. Forse utilizzato da un totale di un'app in questi casi :). Non so, forse gli orologi usano systemd-timedated per ascoltare la riconfigurazione del fuso orario?

Pensa a hostnamectl come uno stub per esercitare il backend della GUI, che potrebbe anche essere un'utilità CLI utile o meno. systemd-hostname non è specificamente inteso per aggiungere intere funzionalità che non sono esercitate dal codice GUI.


Il servizio systemd-hostname non ha lo scopo di astrarre sulle differenze tra le distribuzioni. Sistema a monte standardizzato su un singolo file di configurazione /etc/hostname, dove in precedenza erano presenti file di configurazione diversi, ad esempio su distribuzioni basate su Debian vs Redhat.

Ciò presuppone che hostnamectl stia parlando dell'implementazione standard di systemd-hostname. Ma AFAIK non esiste alcuna distribuzione corrente che corregge il nome file usato.

Voglio sottolineare che il caricamento /etc/hostnameall'avvio viene eseguito in anticipo dal systemd PID 1. Non dipende dal funzionamento di systemd-hostname.


Immagino che potresti notare una differenza innocua, se hai una GUI delle impostazioni di sistema aperta e mostra il nome host allo stesso tempo. Se si modifica /etc/hostnamee quindi si utilizza hostname --file /etc/hostnameper applicare la modifica al sistema in esecuzione, la visualizzazione della GUI potrebbe non aggiornarsi istantaneamente. systemd-hostname fornisce notifiche dbus sulle modifiche a tutte le versioni del nome host che mantiene, quindi la GUI potrebbe non preoccuparsi di ascoltare le notifiche del nome host di sistema fornite sui moderni kernel Linux.

(Tradizionalmente, è una cattiva idea fare il cambio del nome host in fase di runtime. Potrebbe causare problemi con software come X. Sono sicuro che questo problema non sia risolto da systemd . Forse è stato risolto da distribuzioni che usano systemd) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.