Фон
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
тощо.
Список літератури