У чому сенс команди hostnamectl?


17

На відміну від редагування / etc / name host, або де це доречно?

Має бути вагома причина (сподіваюся) - загалом я більше віддаю перевагу «старому» способу, де все було текстовим файлом. Я не намагаюся бути суперечливим - мені б дуже хотілося знати і вирішити для себе, якщо це буде вагома причина. Спасибі.


2
Ви, безумовно, не самотні - Systemd представив багато нових інтерфейсів, і через це він отримав багато похвал від людей, які віддають перевагу "старому способу, де все було текстовим файлом".
Федеріко Полоні

1
@FedericoPoloni Або там, де не все було текстовим файлом, як DNS-запити без будь-якої причини перетворювались у XML.
chrylis -на страйк-

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 також збирає багато різних даних разом в одне місце для завантаження:

$ 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/*release, uname -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тощо.

Список літератури


Дивіться unix.stackexchange.com/a/454785/5132 для одного прикладу читання файлів безпосередньо.
JdeBP

Чи є причина переглядати вихід замість використання -e open,openat?
ydaetskcoR

@ydaetskcoR - немає технічних причин, лінувався і не шукав перемикачів на strace8-). Хоча, чесно кажучи, мені все одно знадобився би, grepщоб отримати вихід так, як я хотів його показати, б / с straceвсе-таки показав би результат hostnamectlcmd, тому мій шлях був коротшим.
slm

"... надає належний API для роботи зі встановленням імен хостів сервера стандартизованим способом." Іншими словами, вони додали ще один стандарт. :-) Можна також відзначити, що з моменту його створення від проекту є щонайменше півдесятка виделок, що, мабуть, означає ще півдесятка додаткових "стандартів".
UncaAlby

Я даю вам +1 саме за ту зручну ідіому, яку rpm -qf $(type -P hostnamectl)я маю запам'ятати!
Марк Боргердінг

1

Це все ще текстовий файл, ви все ще можете його редагувати, і проблем не виникне.

Текстовий файл був стандартизований /etc/hostname.


За словами керівника сервісу, служби systemd-hostname, систематизовані і т.д. тощо були дуже розроблені для існуючих графічних інтерфейсів, таких як GNOME. systemd-hostnamed дозволяє змінювати запит імені хоста GUI без запуску як root (залежно від політики polkit). Dbus також пропонує метод передплати змін, який підходить для потреб GUI. Можливо, використовується в цілому одним додатком у цих випадках :). Я не знаю, можливо, годинники використовують системні терміни, щоб слухати конфігурацію часових поясів?

Подумайте про hostnamectl як заглушку для здійснення графічного інтерфейсу GUI, який може бути, а може і не бути корисною утилітою CLI. systemd-hostnamed спеціально не призначений для додавання цілих функцій, які не використовуються кодом GUI.


Послуга, іменована системним хостом, не призначена для абстрагування відмінностей між дистрибутивами. Система висхідної течії стандартизована в одному файлі конфігурації /etc/hostname, де раніше були різні конфігураційні файли, наприклад, дистрибуції на основі Debian vs Redhat.

Це передбачає, що hostnamectl розмовляє зі стандартною реалізацією systemd-імені-хоста. Але AFAIK немає поточного розповсюдження, яке б виправляло використане ім'я файлу.

Хочу зазначити, що завантаження /etc/hostnameпід час завантаження виконується на початку systemd PID 1. Це не залежить від запуску systemd-імені.


Я вважаю , ви могли б помітити одну безневинну різницю, якщо у вас є графічний інтерфейс користувача системи настройки відкритою і показувати ім'я хоста одночасно. Якщо ви відредагуєте, /etc/hostnameа потім hostname --file /etc/hostnameзастосуєте зміни для запущеної системи, відображення графічного інтерфейсу може не оновлюватися миттєво. systemd-hostnamed надає dbus-сповіщення про зміни всіх версій імені хоста, яке воно підтримує, тому графічний інтерфейс може не заважати слухати сповіщення про ім’я хоста, що надаються на сучасних ядрах Linux.

(Традиційно це погана ідея змінювати ім'я хоста під час виконання роботи. Це може спричинити проблеми з таким програмним забезпеченням, як X. Я впевнений, що цю проблему не вирішує systemd . Можливо, її вирішили дистрибутиви, які використовують systemd) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.