Quel est l'intérêt de la commande hostnamectl?

17

Par opposition à l'édition de / etc / hostname, ou partout où cela est pertinent?

Il doit y avoir une bonne raison (j'espère) - en général, je préfère de beaucoup la "vieille" façon, où tout était un fichier texte. Je n'essaie pas d'être controversé - j'aimerais vraiment savoir et décider par moi-même si c'est une bonne raison. Merci.

Graham Nicholls
la source
2
Vous n'êtes certainement pas seul --- Systemd a introduit beaucoup de nouvelles interfaces et à cause de cela, il y a eu beaucoup de critiques de personnes qui préfèrent "l'ancienne façon où tout était un fichier texte".
Federico Poloni
1
@FedericoPoloni Ou où tout n'était pas un fichier texte, comme les requêtes DNS converties en XML sans raison.
chrylis -on strike-
DNS-> xml. Désolé, vous allez devoir trouver un exemple, s'il vous plaît. IMO XML est l'invention de satan, BTW.
Graham Nicholls

Réponses:

22

Contexte

hostnamectl fait partie de systemd et fournit une API appropriée pour gérer la définition des noms d'hôte d'un serveur de manière standardisée.

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

Auparavant, chaque distribution qui n'utilisait pas systemd avait ses propres méthodes pour le faire, ce qui rendait beaucoup de complexité inutile.

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 rassemble également un grand nombre de données disparates en un seul emplacement pour démarrer:

$ 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

Les informations ici proviennent de /etc/*release, uname -aetc., y compris le nom d'hôte du serveur.

Et les fichiers?

Soit dit en passant, tout est toujours dans des fichiers, hostnamectlsimplifie simplement la façon dont nous devons interagir avec ces fichiers ou connaître chaque emplacement.

Pour preuve, vous pouvez utiliser strace -s 2000 hostnamectlet voir de quels fichiers il provient:

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

Pour l'observateur avisé, vous devez remarquer dans ce stracequi précède que tous les fichiers ne sont pas présents. hostnamectlest en fait en interaction avec un service, systemd-hostnamectl.servicece qui en fait "l'interaction" avec la plupart des fichiers que la plupart des administrateurs connaissent, comme /etc/hostname.

Par conséquent, lorsque vous exécutez, hostnamectlvous obtenez des détails du service. Il s'agit d'un service à la demande, vous ne verrez donc pas s'il fonctionne tout le temps. Uniquement lors des hostnamectlcourses. Vous pouvez le voir si vous exécutez une watchcommande, puis commencez à exécuter hostnamectlplusieurs fois:

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

La source pour cela est ici: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c et si vous regardez à travers, vous verrez les références à /etc/hostnameetc.

Les références

slm
la source
Voir unix.stackexchange.com/a/454785/5132 pour un exemple de lecture directe du ou des fichiers.
JdeBP
Y a-t-il une raison de grep la sortie au lieu de l'utiliser -e open,openat?
ydaetskcoR
@ydaetskcoR - aucune raison technique, était paresseux et n'a pas recherché les commutateurs en strace8-). Bien que pour être honnête, j'aurais toujours eu besoin de la greppour obtenir la sortie comme je le voulais, b / c la straceaurait toujours montré la sortie du hostnamectlcmd, donc mon chemin était plus court.
slm
"... fournit une API appropriée pour gérer la définition des noms d'hôte d'un serveur de manière standardisée." En d'autres termes, ils ont ajouté une autre norme. :-) On peut également noter que depuis sa création, il y a au moins une demi-douzaine de fourches du projet, ce qui signifie probablement une demi-douzaine de "standards" supplémentaires.
UncaAlby
Je vous donne un +1 juste pour cet idiome pratique dont rpm -qf $(type -P hostnamectl)je dois me souvenir!
Mark Borgerding
1

Il s'agit toujours d'un fichier texte, vous pouvez toujours le modifier et il n'y aura pas de problème.

Le fichier texte a été normalisé en /etc/hostname.


Selon le mainteneur, les services systemd-hostname, systemd-timedated etc. ont été très bien conçus pour les interfaces graphiques existantes comme GNOME. systemd-hostnamed permet à une interface graphique de demander des changements de nom d'hôte sans s'exécuter en tant que root (selon la politique de polkit). Dbus fournit également une méthode d'inscription des modifications, adaptée aux besoins de l'interface graphique. Peut-être utilisé par un total d'une application dans ces cas :). Je sais pas, peut-être que les horloges utilisent une synchronisation système pour écouter la reconfiguration du fuseau horaire?

Considérez hostnamectl comme un stub pour exercer le backend GUI, qui pourrait ou non être également un utilitaire CLI utile. systemd-hostnamed n'est spécifiquement pas destiné à ajouter des fonctionnalités entières qui ne sont pas exercées par le code GUI.


Le service nommé par l'hôte systemd n'est pas destiné à faire abstraction des différences entre les distributions. Systemd en amont standardisé sur un seul fichier de configuration /etc/hostname, où il y avait auparavant des fichiers de configuration différents, par exemple sur des distributions basées sur Debian vs Redhat.

Cela suppose que hostnamectl parle de l'implémentation standard de systemd-hostnamed. Mais AFAIK, il n'y a pas de distribution actuelle qui corrige le nom de fichier utilisé.

Je tiens à souligner que le chargement /etc/hostnameau démarrage est effectué très tôt par systemd PID 1. Cela ne dépend pas de l'exécution de systemd-hostnamed.


J'imagine que vous remarquerez peut- être une différence inoffensive, si vous avez une interface graphique de paramètres système ouverte et montrant le nom d'hôte en même temps. Si vous modifiez /etc/hostnamepuis utilisez hostname --file /etc/hostnamepour appliquer la modification au système en cours d'exécution, l'affichage de l'interface graphique peut ne pas se mettre à jour instantanément. systemd-hostnamed fournit des notifications dbus sur les modifications apportées à toutes les versions du nom d'hôte qu'il gère, de sorte que l'interface graphique pourrait ne pas prendre la peine d'écouter les notifications de nom d'hôte système fournies sur les noyaux Linux modernes.

(Traditionnellement, c'est une mauvaise idée de changer le nom d'hôte lors de l'exécution. Cela peut causer des problèmes avec des logiciels tels que X. Je suis convaincu que ce problème n'est pas résolu par systemd . Peut-être qu'il a été résolu par les distributions qui utilisent systemd) .

sourcejedi
la source