Контекст
у меня естьОбраз облака 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
, затем перезагрузите.
С использованиемжурналdмы находим (обратите внимание, что строки журнала не полностью упорядочены по времени):
Процесс загрузки начинается с имени хосталокальный хостзатем переключает root, в этот момент имя хоста становитсяrororoor.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
имя хоста задается какrororoor.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-hostnamed". "Файл модуля" для "systemd-hostnamed" содержит /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
. - Отредактируйте
/etc/cloud/cloud.cfg
и установитеpreserve_hostname
значениеTrue
. (Вы также можете передать эту опцию вместе с вашими пользовательскими данными.)
Второй шаг необходим, поскольку Fedora использует cloud-init
пользовательские данные из среды EC2 для подготовки экземпляра и cloud-init
должна сообщить, что имя хоста должно сохраняться.
решение2
Другой вариант — задать имя хоста черезданные пользователя
например
#cloud-config
hostname: foo
fqdn: foo.bar.net
Это установит имя хоста при загрузке, однако я не уверен, будет ли это всегда происходить перед первым входом в систему.
решение3
Похоже, ответ можно найти на странице руководства hostnamectl, где теперь есть 3 имени хоста: статическое, временное и красивое.
Чтобы задать статическое имя хоста, которое, как я думаю, вам нужно,
hostnamectl --static set-hostname somehost.tld
Вы можете сделать их все одинаковыми с помощью
hostnamectl set-hostname somehost.tld
решение4
На самом деле это ошибка в cloud-init на RHEL-подобных дистрибутивах, использующих SystemD. Патч доступен по адресуhttps://bugs.launchpad.net/cloud-init/+bug/1424710