Назад | Перейти на главную страницу

Правильная установка имени хоста - Fedora 20 на Amazon EC2

Контекст

у меня есть Образ облака Fedora 20 работает на Amazon EC2 (далее именуемый «инстанс»). И у меня есть некоторая неуверенность по поводу постоянной установки имени хоста.

Цель

В этом случае, скажем, я хочу установить имя хоста экземпляра на penpen.homelinux.org. (Это имя также будет зарегистрировано в DynDNS с использованием ddclient, но это еще один аспект, который нас здесь не интересует.)

Имя хоста, конечно, можно установить вручную после завершения загрузки (используя hostnamectl среди прочих). Но мы хотим, чтобы перед первым входом в систему было установлено правильное имя хоста.

Традиционно для постоянной настройки имени хоста нужно изменить содержимое /etc/hostname. К сожалению здесь это не работает.

Системное поведение по умолчанию

По умолчанию экземпляр устанавливает свое имя хоста на внутреннее имя EC2. После загрузки мы можем посмотреть на несколько разных мест, которые дают имя хоста, и находим:

Kernel hostname via 'sysctl'                      : ip-10-164-65-105.ec2.internal
Kernel domainname via 'sysctl'                    : (none)
File '/etc/hostname'                              : contains 'ip-10-164-65-105.ec2.internal'
File '/etc/sysconfig/network'                     : exists but has no 'HOSTNAME' line
According to the shell                            : HOSTNAME = ip-10-164-65-105.ec2.internal
Nodename given by 'uname --nodename'              : ip-10-164-65-105.ec2.internal
Hostname ('hostname')                             : ip-10-164-65-105.ec2.internal
Short hostname ('hostname --short')               : ip-10-164-65-105
NIS domain name ('domainname')                    : (none)
YP default domain ('hostname --yp')               : [hostname --yp failed]
DNS domain name ('hostname --domain')             : ec2.internal
Fully qualified hostname ('hostname --fqdn')      : ip-10-164-65-105.ec2.internal
Hostname alias ('hostname --alias')               : 
By IP address ('hostname --ip-address')           : 10.164.65.105
All IPs ('hostname --all-ip-addresses')           : 10.164.65.105 
All FQHNs via IPs ('hostname --all-ip-addresses') : ip-10-164-65-105.ec2.internal 
Static hostname via 'hostnamectl'                 : ip-10-164-65-105.ec2.internal
Transient hostname via 'hostnamectl'              : ip-10-164-65-105.ec2.internal
Pretty hostname via 'hostnamectl'                 : 

Итак, попробуем записать в / etc / hostname ...

Если записать желаемое имя хоста в /etc/hostname, это изменение снова теряется при следующей загрузке. Давайте рассмотрим процесс загрузки, который выполняет systemd.

Пример запуска

Напишите rorororoor.homelinux.org к /etc/hostname, затем перезагрузитесь.

С помощью журнал мы находим (обратите внимание, что строки журнала не полностью упорядочены по времени):

Процесс загрузки начинается с имени хоста как localhost затем переключает root, после чего имя хоста становится rorororoor.homelinux.org.

Dec 26 15:12:08 localhost systemd[1]: Starting Cleanup udevd DB...
Dec 26 15:12:08 localhost systemd[1]: Started Cleanup udevd DB.
Dec 26 15:12:08 localhost systemd[1]: Starting Switch Root.
Dec 26 15:12:08 localhost systemd[1]: Reached target Switch Root.
Dec 26 15:12:08 localhost systemd[1]: Starting Switch Root...
Dec 26 15:12:08 localhost systemd[1]: Switching root.
Dec 26 15:12:08 localhost systemd-journal[67]: Journal stopped
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Runtime journal is using 8.0M
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Runtime journal is using 8.0M
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journald[67]: Received SIGTERM
...........
Dec 26 15:12:12 rorororoor.homelinux.org kernel: SELinux: initialized
Dec 26 15:12:12 rorororoor.homelinux.org systemd-journal[155]: Journal started
Dec 26 15:12:08 rorororoor.homelinux.org systemd-cgroups-agent[128]: Failed to get D-Bus connection: Failed to connect to socket /run/systemd/private: No such file or directory
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: systemd 208 running in system mode.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Detected virtualization 'xen'.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Set hostname to <rorororoor.homelinux.org>.
Dec 26 15:12:10 rorororoor.homelinux.org systemd[1]: Failed to open private bus connection: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
Dec 26 15:12:11 rorororoor.homelinux.org systemd[1]: Mounted Debug File System.

Мы видим, что systemd устанавливает имя хоста на rorororoor.homelinux.org, очевидно, успешно, поскольку столбец хоста журнала изменяется. Выдаются некоторые ошибки, возможно, потому что hostnamectl не может связаться с DBus в данный момент.

Я не уверен, кто здесь устанавливает имена; какая-то внутренняя часть systemd? В любом случае, продолжая просмотр журнала, мы обнаруживаем, что довольно скоро имя хоста возвращается к внутреннему имени EC2:

Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ('resize2fs', '/dev/xvda1') with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_resizefs.py[DEBUG]: Resizing took 0.067 seconds
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_resizefs.py[DEBUG]: Resized root filesystem (type=ext4, val=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] helpers.py[DEBUG]: config-set_hostname already ran (freq=once-per-instance)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] helpers.py[DEBUG]: Running config-update_hostname using lock (<cloudinit.helpers.DummyLock object at 0x2559210>)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] cc_update_hostname.py[DEBUG]: Updating hostname to ip-10-164-65-105.ec2.internal (ip-10-164-65-105)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ['hostname'] with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] __init__.py[DEBUG]: Attempting to update hostname to ip-10-164-65-105.ec2.internal in 1 files
Dec 26 15:12:33 rorororoor.homelinux.org cloud-init[485]: [CLOUDINIT] util.py[DEBUG]: Running command ['hostnamectl', 'set-hostname', 'ip-10-164-65-105.ec2.internal'] with allowed return codes [0] (shell=False, capture=True)
Dec 26 15:12:33 rorororoor.homelinux.org dbus-daemon[226]: dbus[226]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service'
Dec 26 15:12:33 rorororoor.homelinux.org dbus[226]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service'
Dec 26 15:12:34 rorororoor.homelinux.org systemd[1]: Starting Hostname Service...
Dec 26 15:12:34 rorororoor.homelinux.org dbus-daemon[226]: dbus[226]: [system] Successfully activated service 'org.freedesktop.hostname1'
Dec 26 15:12:34 rorororoor.homelinux.org dbus[226]: [system] Successfully activated service 'org.freedesktop.hostname1'
Dec 26 15:12:34 rorororoor.homelinux.org systemd[1]: Started Hostname Service.
Dec 26 15:12:34 rorororoor.homelinux.org systemd-hostnamed[598]: Changed static host name to 'ip-10-164-65-105.ec2.internal'
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd-hostnamed[598]: Changed host name to 'ip-10-164-65-105.ec2.internal'
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Started Initial cloud-init job (metadata service crawler).
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Starting Cloud-config availability.
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Reached target Cloud-config availability.
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal systemd[1]: Starting Apply the settings specified in cloud-config...
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: Running config-update_etc_hosts using lock (<cloudinit.helpers.DummyLock object at 0x2559350>)
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] cc_update_etc_hosts.py[DEBUG]: Configuration option 'manage_etc_hosts' is not set, not managing /etc/hosts in module update_etc_hosts
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: config-rsyslog already ran (freq=once-per-instance)
Dec 26 15:12:34 ip-10-164-65-105.ec2.internal [485]: [CLOUDINIT] helpers.py[DEBUG]: config-users-groups already ran (freq=once-per-instance)

Настройка имени хоста здесь выполняется через модуль «systemd-host named». "Модульный файл" для "systemd-host named" - /usr/lib/systemd/system/systemd-hostnamed.service и содержит:

[Unit]
Description=Hostname Service
Documentation=man:systemd-hostnamed.service(8) man:hostname(5) man:machine-info(5)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/hostnamed

[Service]
ExecStart=/usr/lib/systemd/systemd-hostnamed
BusName=org.freedesktop.hostname1
CapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_SYS_PTRACE

Программа, вызванная указанным выше /usr/lib/systemd/systemd-hostnamed на самом деле двоичный файл (ПОЧЕМУ!). тем не мение исходный код может быть найден.

Дело в том, что мы вернулись в ip-10-164-65-105.ec2.внутренний

ЧТО?

Вам нужно сделать две вещи (но вы сделали только одну из них):

  1. Установите имя хоста в /etc/hostname.
  2. редактировать /etc/cloud/cloud.cfg и установить preserve_hostname к True. (Вы также можете передать эту опцию вместе со своими пользовательскими данными.)

Второй шаг необходим, потому что Fedora использует cloud-init для ввода пользовательских данных из среды EC2 для предоставления экземпляра и cloud-init необходимо указать, что имя хоста должно сохраняться.

Другой вариант - установить имя хоста через данные пользователя

например

#cloud-config
hostname: foo
fqdn: foo.bar.net

Это установит имя хоста при загрузке, однако я не уверен, будет ли это всегда происходить до первого входа в систему.

Решить, используя дополнительный файл модуля

Следующее на самом деле не работает:

Создайте файл системного блока /usr/lib/systemd/system/penpen-naming.service быть начато после systemd-hostnamed.service (и, возможно, только после dbus.service).

(Мне пришлось провести несколько попыток, чтобы найти «правильное место», чтобы systemd не просто деактивирует новый блок, потому что «цикл был обнаружен». Обратите внимание, что вы можете построить график зависимости файла модуля с помощью systemd-analyze dot, который создает "точечный" файл для передачи в "graphviz" dot программа, но в результате получается просто большой запутанный график, если вы его предварительно не отфильтруете)

Содержимое файла модуля /usr/lib/systemd/system/penpen-naming.service:

[Unit]
Description= *** Hostname becomes 'penpen.homelinux.org' ***
After=default.target 
# After=systemd-hostnamed.service -- NOPE 
# After=dbus.service  -- NOPE

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/toolbox/setting_hostnames/penpen

[Install]
WantedBy=multi-user.target

Активируйте его с помощью systemctl enable penpen-naming

Что значит /usr/local/toolbox/setting_hostnames/penpen делать? Если пишет penpen.homelinux.org к /etc/hostname. Но на самом деле этого недостаточно, нужно также установить имя хоста, используя hostnamectl.

Даже в этом случае агрегат приходится запускать так поздно (After=default.target) что оболочка входа по-прежнему отображает внутреннее имя хоста EC2. И все еще есть проблемы с подключением к DBus.

Так что это не очень хорошее решение, или, по крайней мере, требуется исправление для «позиции в дереве зависимостей файловых модулей» и «что, черт возьми, с dbus»

Имена хостов после этого:

Kernel hostname via 'sysctl'                      : penpen.homelinux.org
Kernel domainname via 'sysctl'                    : (none)
File '/etc/hostname'                              : contains 'penpen.homelinux.org'
File '/etc/sysconfig/network'                     : exists but has no 'HOSTNAME' line
According to the shell                            : HOSTNAME = ip-10-164-65-105.ec2.internal
Nodename given by 'uname --nodename'              : penpen.homelinux.org
Hostname ('hostname')                             : penpen.homelinux.org
Short hostname ('hostname --short')               : penpen
NIS domain name ('domainname')                    : (none)
YP default domain ('hostname --yp')               : [hostname --yp failed]
DNS domain name ('hostname --domain')             : homelinux.org
Fully qualified hostname ('hostname --fqdn')      : penpen.homelinux.org
Hostname alias ('hostname --alias')               : 
By IP address ('hostname --ip-address')           : 54.221.0.63
All IPs ('hostname --all-ip-addresses')           : 10.164.65.105 
All FQHNs via IPs ('hostname --all-ip-addresses') : ip-10-164-65-105.ec2.internal 
Static hostname via 'hostnamectl'                 : penpen.homelinux.org
Transient hostname via 'hostnamectl'              : penpen.homelinux.org
Pretty hostname via 'hostnamectl'                 : 

Похоже, что ответ находится на странице руководства hostnamectl, теперь есть 3 имени хоста: статическое, временное и красивое.

Чтобы установить статическое имя хоста, которое, как мне кажется, вам нужно,

hostnamectl --static set-hostname somehost.tld

Вы можете сделать их одинаковыми с помощью

hostnamectl set-hostname somehost.tld

На самом деле это ошибка cloud-init в RHEL-подобных дистрибутивах, использующих SystemD. Патч доступен по адресу https://bugs.launchpad.net/cloud-init/+bug/1424710