Apa gunanya perintah hostnamectl?


17

Berbeda dengan mengedit / etc / hostname, atau di mana pun relevan?

Pasti ada alasan yang bagus (saya harap) - secara umum saya lebih suka cara "lama", di mana semuanya adalah file teks. Saya tidak berusaha untuk bertengkar - saya benar-benar ingin tahu, dan memutuskan sendiri apakah itu alasan yang bagus. Terima kasih.


2
Anda pasti tidak sendirian --- Systemd memperkenalkan banyak antarmuka baru dan karena itu mendapat banyak kritik dari orang-orang yang lebih suka "cara lama di mana semuanya adalah file teks".
Federico Poloni

1
@FedericoPoloni Atau di mana tidak semuanya adalah file teks, seperti permintaan DNS yang dikonversi ke XML tanpa alasan.
chrylis -on strike-

DNS-> xml. Maaf, Anda harus memberi contoh, tolong. IMO XML adalah penemuan setan, BTW.
Graham Nicholls

Jawaban:


22

Latar Belakang

hostnamectl adalah bagian dari systemd, dan menyediakan API yang tepat untuk berurusan dengan pengaturan nama host server dengan cara standar.

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

Sebelumnya setiap distro yang tidak menggunakan systemd, memiliki metode sendiri untuk melakukan ini yang dibuat untuk banyak kompleksitas yang tidak perlu.

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 juga menarik banyak data yang berbeda menjadi satu lokasi untuk di-boot:

$ 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

Info di sini berasal /etc/*release ,uname -a , dll termasuk nama host dari server.

Bagaimana dengan file?

Kebetulan, semuanya masih dalam file, hostnamectl hanya menyederhanakan bagaimana kita harus berinteraksi dengan file-file ini atau mengetahui setiap lokasi mereka.

Sebagai buktinya, Anda dapat menggunakan strace -s 2000 hostnamectldan melihat dari mana file itu diambil:

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

Untuk pengamat yang lihai, Anda harus memperhatikan di atas stracebahwa tidak semua file ada. hostnamectlsebenarnya berinteraksi dengan layanan, systemd-hostnamectl.serviceyang sebenarnya melakukan "berinteraksi" dengan sebagian besar file yang paling akrab dengan admin, seperti /etc/hostname.

Karena itu ketika Anda menjalankan hostnamectlAnda mendapatkan detail dari layanan. Ini adalah layanan ondemand, jadi Anda tidak akan melihat apakah berjalan sepanjang waktu. Hanya saat hostnamectldijalankan. Anda dapat melihatnya jika Anda menjalankan watchperintah, dan kemudian mulai menjalankan hostnamectlbeberapa kali:

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

Sumbernya ada di sini: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c dan jika Anda melihatnya, Anda akan melihat referensi ke/etc/hostname dll.

Referensi


Lihat unix.stackexchange.com/a/454785/5132 untuk satu contoh membaca file secara langsung.
JdeBP

Apakah ada alasan untuk memahami keluaran alih-alih digunakan -e open,openat?
ydaetskcoR

@ydaetskcoR - tanpa alasan teknis, malas dan tidak mencari sakelar ke strace8-). Semua jujur ​​saja saya masih akan membutuhkan grepuntuk mendapatkan output dengan cara saya ingin menunjukkannya, b / c stracemasih akan menunjukkan output dari hostnamectlcmd, jadi cara saya lebih pendek.
slm

"... menyediakan API yang tepat untuk menangani pengaturan nama host server dengan cara standar." Dengan kata lain, mereka menambahkan satu standar lagi. :-) Orang mungkin juga mencatat bahwa sejak awal, ada setidaknya setengah lusin garpu dari proyek, yang mungkin berarti setengah lusin tambahan "standar".
UncaAlby

Saya memberi Anda +1 hanya untuk idiom berguna yang harus rpm -qf $(type -P hostnamectl)saya ingat satu itu!
Mark Borgerding

1

Ini masih berupa file teks, Anda masih bisa mengeditnya, dan tidak akan ada masalah.

File teks telah distandarisasi ke /etc/hostname.


Menurut pengelola, layanan systemd-hostname, systemd-timedated dll sangat dirancang untuk GUI yang ada seperti GNOME. systemd-hostnamed memungkinkan GUI meminta perubahan nama host tanpa menjalankan sebagai root (tergantung pada kebijakan polkit). Dbus juga menyediakan metode untuk berlangganan perubahan, yang disesuaikan dengan kebutuhan GUI. Mungkin digunakan oleh total satu aplikasi dalam kasus ini :). Saya tidak tahu, mungkin jam menggunakan systemd-timedated untuk mendengarkan konfigurasi ulang zona waktu?

Anggap hostnamectl sebagai sebuah rintisan untuk menjalankan backend GUI, yang mungkin atau mungkin juga bukan utilitas CLI yang berguna. systemd-hostnamed secara khusus tidak dimaksudkan untuk menambahkan seluruh fitur yang tidak dijalankan oleh kode GUI.


Layanan systemd-hostnamed tidak dimaksudkan untuk abstrak atas perbedaan antara distribusi. Sistem hulud distandarisasi pada file konfigurasi tunggal,/etc/hostname ,, di mana sebelumnya ada file konfigurasi yang berbeda pada misalnya distribusi berbasis Debian vs Redhat.

Ini mengasumsikan hostnamectl sedang berbicara dengan implementasi standar dari systemd-hostnamed. Tapi AFAIK tidak ada distribusi saat ini yang menambal nama file yang digunakan.

Saya ingin menunjukkan bahwa memuat /etc/hostnamepada saat boot dilakukan sejak dini oleh systemd PID 1. Tidak tergantung pada menjalankan systemd-hostnamed.


Saya membayangkan Anda mungkin melihat satu perbedaan yang tidak berbahaya, jika Anda memiliki pengaturan sistem GUI terbuka dan menunjukkan nama host pada saat yang sama. Jika Anda mengedit /etc/hostnamedan kemudian gunakanhostname --file /etc/hostname untuk menerapkan perubahan pada sistem yang sedang berjalan, tampilan GUI mungkin tidak secara instan diperbarui. systemd-hostnamed menyediakan notifikasi dbus tentang perubahan semua versi hostname yang dipertahankannya, sehingga GUI mungkin tidak mau repot-repot mendengarkan notifikasi hostname sistem yang disediakan pada kernel Linux modern.

(Secara tradisional, itu adalah ide yang buruk untuk melakukan perubahan nama host pada saat runtime. Hal itu dapat menyebabkan masalah dengan perangkat lunak seperti X. Saya yakin masalah ini tidak ditangani oleh systemd . Mungkin itu telah diatasi oleh distribusi yang menggunakan systemd) .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.