Wozu dient der Befehl hostnamectl?

17

Im Gegensatz zur Bearbeitung von / etc / hostname oder wo immer dies relevant ist?

Es muss einen guten Grund geben (hoffe ich) - im Allgemeinen bevorzuge ich den "alten" Weg, bei dem alles eine Textdatei war. Ich versuche nicht, umstritten zu sein - ich möchte es wirklich gerne wissen und selbst entscheiden, ob es ein guter Grund ist. Vielen Dank.

Graham Nicholls
quelle
2
Sie sind definitiv nicht alleine --- Systemd hat viele neue Benutzeroberflächen eingeführt und dadurch viel Flak von Leuten bekommen, die "den alten Weg bevorzugen, bei dem alles eine Textdatei war".
Federico Poloni
1
@FedericoPoloni Oder wo nicht alles eine Textdatei war, wie z. B. DNS-Abfragen, die ohne Grund in XML konvertiert wurden.
chrylis -on strike-
DNS-> XML. Entschuldigung, Sie müssen sich bitte ein Beispiel einfallen lassen. IMO XML ist die Erfindung von Satan, BTW.
Graham Nicholls

Antworten:

22

Hintergrund

hostnamectl ist Teil von systemd und bietet eine geeignete API, um die Hostnamen eines Servers auf standardisierte Weise festzulegen.

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

Zuvor hatte jede Distribution, die systemd nicht verwendete, ihre eigenen Methoden, was zu einer Menge unnötiger Komplexität führte.

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 Außerdem werden viele unterschiedliche Daten an einem einzigen Speicherort zusammengeführt, um zu booten:

$ 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

Die Informationen hier herkommt /etc/*release, uname -ausw. , einschließlich dem Hostnamen des Servers.

Was ist mit den Dateien?

Übrigens ist alles noch in Dateien, hostnamectles vereinfacht nur, wie wir mit diesen Dateien interagieren müssen oder wo sie sich befinden.

Als Beweis dafür können Sie strace -s 2000 hostnamectlsehen, aus welchen Dateien sie stammen:

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

Für den scharfsinnigen Beobachter sollten Sie oben feststellen, stracedass nicht alle Dateien vorhanden sind. hostnamectlinteragiert tatsächlich mit einem Dienst, systemd-hostnamectl.serviceder in der Tat die "Interaktion" mit den meisten Dateien ausführt, mit denen die meisten Administratoren vertraut wären, wie z /etc/hostname.

Wenn Sie ausgeführt werden, erhalten hostnamectlSie daher Details vom Dienst. Dies ist ein On-Demand-Dienst, sodass Sie nicht sehen können, ob er ständig ausgeführt wird. Nur wenn hostnamectlläuft. Sie können es sehen, wenn Sie einen watchBefehl ausführen und dann hostnamectlmehrmals starten :

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

Die Quelle dafür ist hier: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c und wenn Sie es durchsehen, sehen Sie die Verweise auf /etc/hostnameusw.

Verweise

slm
quelle
Ein Beispiel zum direkten Lesen der Datei (en) finden Sie unter unix.stackexchange.com/a/454785/5132 .
JdeBP
Gibt es einen Grund, die Ausgabe zu prüfen, anstatt sie zu verwenden -e open,openat?
ydaetskcoR
@ydaetskcoR - kein technischer Grund, war faul und schaute die Schalter nicht auf strace8-). grepUm ehrlich zu sein, hätte ich das trotzdem gebraucht , um die Ausgabe so zu bekommen, wie ich es zeigen wollte. Übrigens stracehätte ich die Ausgabe des hostnamectlcmd immer noch gezeigt , also war mein Weg kürzer.
slm
"... bietet eine geeignete API, um die Hostnamen eines Servers auf standardisierte Weise festzulegen." Mit anderen Worten, sie fügten einen weiteren Standard hinzu. :-) Man könnte auch bemerken, dass es seit seiner Gründung mindestens ein halbes Dutzend Gabeln aus dem Projekt gibt, was wahrscheinlich ein halbes Dutzend zusätzlicher "Standards" bedeutet.
UncaAlby
Ich gebe dir +1 nur für diese handliche Redewendung, an die rpm -qf $(type -P hostnamectl)ich mich erinnern muss!
Mark Borgerding
1

Es ist immer noch eine Textdatei, Sie können sie immer noch bearbeiten, und es wird kein Problem geben.

Die Textdatei wurde auf standardisiert /etc/hostname.


Nach Angaben des Betreuers wurden die Dienste systemd-hostname, systemd-timed etc in hohem Maße für vorhandene GUI (s) wie GNOME entwickelt. Mit systemd-hostnamed kann eine GUI-Anforderung Hostnamen ändern, ohne als Root ausgeführt zu werden (abhängig von der Polkit-Richtlinie). Dbus bietet auch eine Methode zum Abonnieren von Änderungen, die für die Anforderungen der Benutzeroberfläche geeignet ist. Vielleicht von insgesamt einer App in diesen Fällen genutzt :). Ich weiß nicht, vielleicht verwenden Uhren systemd-timedated, um auf die Neukonfiguration der Zeitzone zu warten?

Stellen Sie sich hostnamectl als einen Stub vor, um das GUI-Backend auszuführen, das möglicherweise auch ein nützliches CLI-Dienstprogramm ist oder nicht. systemd-hostnamed ist speziell nicht dazu gedacht, ganze Funktionen hinzuzufügen, die nicht vom GUI-Code ausgeführt werden.


Der von systemd gehostete Dienst soll nicht über Unterschiede zwischen Distributionen abstrahieren. Upstream-System standardisiert auf einer einzigen Konfigurationsdatei /etc/hostname, wo es zuvor verschiedene Konfigurationsdateien auf zB Debian vs Redhat-basierten Distributionen gab.

Dies setzt voraus, dass hostnamectl mit der Standardimplementierung von systemd-hostnamed spricht. Aber AFAIK gibt es keine aktuelle Distribution, die den verwendeten Dateinamen korrigiert.

Ich möchte darauf hinweisen, dass das Laden /etc/hostnamebeim Booten frühzeitig von systemd PID 1 durchgeführt wird. Es kommt nicht darauf an, systemd-hostnamed auszuführen.


Ich stelle mir vor, Sie könnten einen harmlosen Unterschied bemerken, wenn Sie eine GUI für Systemeinstellungen geöffnet haben und gleichzeitig den Hostnamen anzeigen. Wenn Sie die Änderung bearbeiten /etc/hostnameund dann verwenden hostname --file /etc/hostname, um sie auf das laufende System anzuwenden, wird die GUI-Anzeige möglicherweise nicht sofort aktualisiert. systemd-hostnamed bietet dbus-Benachrichtigungen bei Änderungen an allen Versionen des von ihm verwalteten Hostnamens, sodass die Benutzeroberfläche möglicherweise nicht auf die System-Hostnamen-Benachrichtigungen warten muss, die in modernen Linux-Kerneln bereitgestellt werden.

(Normalerweise ist es eine schlechte Idee, den Hostnamen zur Laufzeit zu ändern . Dies kann zu Problemen mit Software wie X führen . Ich bin sicher, dass dieses Problem von systemd nicht behoben wird . Vielleicht wurde es von Distributionen behoben, die systemd verwenden.) .

sourcejedi
quelle