web-dev-qa-db-ja.com

hostnamectlコマンドの意味は何ですか?

/ etc/hostnameを編集するのとは対照的ですか?

正当な理由があるはずです(私は願っています)-一般に、すべてがテキストファイルであった「古い」方法をずっと好みます。私は異議を唱えようとしているわけではありません。本当に知りたいのですが、それが正当な理由かどうか自分で決めたいのです。ありがとう。

17
Graham Nicholls

バックグラウンド

hostnamectlはsystemdの一部であり、サーバーのホスト名の設定を標準化された方法で処理するための適切なAPIを提供します。

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

以前は、systemdを使用しないディストリビューションごとに独自の方法でこれを実行していたため、多くの不必要な複雑さが生じていました。

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はまた、ブートするために、多くの異なるデータを1つの場所にまとめます。

$ 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

ここの情報は、サーバーのホスト名を含む/etc/*releaseuname -aなどからのものです。

ファイルはどうですか?

ちなみに、すべてがまだファイル内にあります。hostnamectlは、これらのファイルを操作したり、すべての場所を把握したりする方法を単純化しているだけです。

これの証拠として、strace -s 2000 hostnamectlを使用して、どのファイルから取得しているかを確認できます。

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

賢明な観察者には、上記のstraceにすべてのファイルが存在するわけではないことに気付くはずです。 hostnamectlは実際にはsystemd-hostnamectl.serviceのようなサービスと対話しています。これは実際に、ほとんどの管理者が使い慣れているほとんどのファイル(/etc/hostnameなど)と「対話」しています。

したがって、hostnamectlを実行すると、サービスから詳細が取得されます。これはオンデマンドサービスであるため、常に実行されているかどうかはわかりません。 hostnamectlが実行されている場合のみ。 watchコマンドを実行し、次にhostnamectlを複数回実行すると表示されます。

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

そのソースはここにあります: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c そしてif全体を見ると、/etc/hostnameなどへの参照が表示されます。

参考文献

22
slm

これはまだテキストファイルであり、編集することができ、問題は発生しません。

テキストファイルは/etc/hostnameに標準化されました。


メンテナによると、systemd-hostname、systemd-timedatedなどのサービスは、GNOMEのような既存のGUI向けに設計されています。 systemd-hostnamedを使用すると、GUIはrootとして実行しなくてもホスト名の変更を要求できます(polkitポリシーによって異なります)。 Dbusは、GUIのニーズに適した変更をサブスクライブする方法も提供します。これらのケースでは、1つのアプリで使用される可能性があります。私は知りません、おそらく時計はsystemd-timedatedを使用してタイムゾーンの再構成をリッスンしますか?

Hostnamectlは、GUIバックエンドを実行するためのスタブと考えてください。これは、有用なCLIユーティリティである場合とそうでない場合があります。 systemd-hostnamedは、GUIコードによって実行されない機能全体を追加することは特に意図されていません。


Systemd-hostnamedサービスは、ディストリビューション間の違いを抽象化することを目的としたではありません。単一の構成ファイル/etc/hostnameで標準化された上流のsystemd。 Debian v.s. Redhatベースのディストリビューション。

これは、hostnamectlがsystemd-hostnamedの標準実装と通信していることを前提としています。しかし、私の知る限り、使用されているファイル名にパッチを当てる現在のディストリビューションはありません。

ブート時の/etc/hostnameのロードは、systemd PID 1によって早期に実行されることを指摘しておきます。これは、systemd-hostnamedの実行に依存しません。


システム設定GUIを開いて同時にホスト名を表示している場合、私はあなたを想像します可能性があります1つの無害な違いに気付きます。 /etc/hostnameを編集してからhostname --file /etc/hostnameを使用して変更を実行中のシステムに適用すると、GUI表示がすぐに更新されない場合があります。 systemd-hostnamedは、維持するホスト名のすべてのバージョンの変更に関するdbus通知を提供するため、GUIは、最新のLinuxカーネルで提供されるシステムホスト名通知をリッスンする必要がありません。

(伝統的に、実行時にホスト名を変更することは悪い考えです。 これはXなどのソフトウェアで問題を引き起こす可能性があります 。この問題は対処されていないと確信していますby systemdおそらくsystemdを使用するディストリビューションで対処されています。

1
sourcejedi