hostnamectlコマンドのポイントは何ですか?


17

/ etc / hostnameを編集するのとは対照的に、または関連する場所はどこですか?

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


2
あなたは間違いなく一人ではありません--- Systemdは多くの新しいインターフェースを導入しました。
フェデリコポロニ

1
@FedericoPoloniまたは、DNSクエリが理由もなくXMLに変換されるなど、すべてがテキストファイルではない場合。
クリリス

DNS-> xml 申し訳ありませんが、例を考えてください。IMO XMLは、サタン、BTWの発明です。
グラハムニコルズ

回答:


22

バックグラウンド

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、あなたがそれを見れば、あなたはへの参照表示されます/etc/hostnameなど

参照資料


ファイルを直接読み取る1つの例については、unix.stackexchange.com / a / 454785/5132を参照してください。
JdeBP

使用する代わりに出力をgrepする理由はあります-e open,openatか?
ydaetskcoR

@ydaetskcoR-技術的な理由はなく、怠け者で、スイッチをstrace8に検索しませんでした。正直なところ、私はgrep出力を表示したい方法で取得する必要がありましたが、b / c stracehostnamectlcmd の出力を表示したままだったので、私の方法は短かったです。
slm

「...は、標準化された方法でサーバーのホスト名を設定するための適切なAPIを提供します。」つまり、彼らはもう1つの標準を追加しました。:-)また、最初からプロジェクトから少なくとも半ダースのフォークがあることに気付くかもしれません。これはおそらく半ダースの追加の「標準」を意味します。
UncaAlby

その便利なイディオムのためだけに+1を提供しますrpm -qf $(type -P hostnamectl)
マークボーガーディング

1

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

テキストファイルはに標準化されています/etc/hostname


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

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


systemd-hostnamedサービスは、ディストリビューション間の違いを抽象化することを意図していません。上流には、単一の構成ファイルを標準にsystemd /etc/hostname以前に別の設定ファイルは、RedHatのベースのディストリビューション対例えばDebianの上であったところを、。

これは、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などのソフトウェアで問題が発生する可能性があります。この問題はsystemdで解決されないと確信しています。おそらくsystemdを使用するディストリビューションで解決されています) 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.