Какой смысл в команде hostnamectl?

17

В отличие от редактирования / etc / hostname или где это уместно?

Должна быть веская причина (я надеюсь) - в общем, я очень предпочитаю «старый» способ, где все было текстовым файлом. Я не пытаюсь быть спорным - я действительно хотел бы знать, и решить для себя, если это хорошая причина. Благодарю.

Грэм Николлс
источник
2
Вы совершенно определенно не одиноки - Systemd представил много новых интерфейсов, и из-за этого он получил много шума от людей, которые предпочитают «старый способ, где все было текстовым файлом».
Федерико Полони
1
@FedericoPoloni Или там, где не все было текстовым файлом, например DNS-запросы, преобразованные в XML без причины.
Хрилис - на забастовку -
DNS-> xml. Извините, вам нужно будет привести пример, пожалуйста. ИМО XML - это изобретение сатаны, кстати.
Грэм Николлс

Ответы:

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/hostname.c, и если вы посмотрите его, вы увидите ссылки на /etc/hostnameи т. Д.

Ссылки

ОДС
источник
См. Unix.stackexchange.com/a/454785/5132 для одного примера чтения файла (ов) напрямую.
JdeBP
Есть ли причина, чтобы grep вывод вместо использования -e open,openat?
ydaetskcoR
@ydaetskcoR - без технических причин, был ленив и не смотрел переключатели на strace8-). Несмотря на то, что, честно говоря, мне все равно нужно было grepбы получить вывод так, как я хотел бы показать, потому что straceон все равно показал бы вывод hostnamectlcmd, так что мой путь был короче.
Slm
«... предоставляет надлежащий API для работы со стандартными настройками имен серверов». Другими словами, они добавили еще один стандарт. :-) Можно также заметить, что с момента его создания в проекте есть как минимум полдюжины вилок, что, вероятно, означает еще полдюжины дополнительных «стандартов».
UncaAlby
Я даю тебе +1 только за эту полезную идиому, которую rpm -qf $(type -P hostnamectl)я должен запомнить!
Марк
1

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

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


По словам сопровождающего, сервисы systemd-hostname, systemd-timedated и т. Д. Были в значительной степени разработаны для существующих графических интерфейсов, таких как GNOME. systemd-hostname позволяет GUI запрашивать изменение имени хоста без запуска от имени пользователя root (в зависимости от политики polkit). Dbus также предоставляет метод подписки изменений, который подходит для нужд графического интерфейса. Возможно, в этих случаях используется всего одно приложение :). Я не знаю, может быть, часы используют systemd-timedated для прослушивания реконфигурации часового пояса?

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


Сервис с именем systemd-host не предназначен для абстрагирования от различий между дистрибутивами. Upstream systemd стандартизирован в одном файле конфигурации,/etc/hostname , где ранее были разные файлы конфигурации, например, в дистрибутивах Debian и Redhat.

Это предполагает, что hostnamectl говорит со стандартной реализацией systemd-hostname. Но AFAIK нет текущего дистрибутива, который исправляет используемое имя файла.

Я хочу отметить, что загрузка /etc/hostnameво время загрузки выполняется с помощью systemd PID 1. Это не зависит от запуска systemd-hostname.


Я полагаю, вы можете заметить одно безвредное отличие, если у вас открыт графический интерфейс системных настроек и одновременно отображается имя хоста. Если вы измените /etc/hostnameи затем hostname --file /etc/hostnameпримените изменения к работающей системе, отображение графического интерфейса может не обновиться сразу. systemd-hostname предоставляет уведомления dbus об изменениях всех версий имени хоста, которое он поддерживает, поэтому графический интерфейс может не беспокоиться о прослушивании уведомлений об имени хоста системы, предоставляемых в современных ядрах Linux.

(Традиционно, это плохая идея - менять имя хоста во время выполнения. Это может вызвать проблемы с программным обеспечением, таким как X. Я уверен, что эта проблема не решается с помощью systemd . Возможно, она решалась в дистрибутивах, использующих systemd) ,

sourcejedi
источник