Правильно встановити ім'я хоста - Fedora 20 на Amazon EC2


11

Контекст

У мене зображення хмари 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 перемикає корінь, після чого ім'я хоста стає 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-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.internal

ЩО РОБИТИ?

Відповіді:


11

Вам потрібно зробити дві речі (але виконати лише одну):

  1. Встановіть ім'я хоста в /etc/hostname.
  2. Відредагуйте /etc/cloud/cloud.cfgта встановіть preserve_hostnameна True. (Ви також можете передати цю опцію разом зі своїми даними користувача.)

Другий крок необхідний, оскільки Fedora використовує cloud-initдля введення даних користувача із середовища EC2 для надання екземпляра, і cloud-initпотрібно сказати, що ім'я хоста має зберігатися.


ВСЕ ПРАВО. Я спробую це негайно.
Девід Тонхофер

1
Тримайся, що це? Гаразд, YAML ( en.wikipedia.org/wiki/YAML ). Отже, відповідно до scalehorizontally.com/2013/02/24/introduction-to-cloud-init, я додаю " save_hostname : true" на верхньому рівні. ... Так, це працює.
Девід Тонхофер

Так, це просто звичайний YAML.
Майкл Хемптон

Все, що проба і помилки. Ну добре, я багато чого навчився. Спасибі.
Девід Тонхофер

Дякую, це працює на CentOS 7.3 - без другого кроку ім'я хоста перезаписується хмарою-init при перезавантаженні. Для першого кроку я використав sudo hostnamectl set-hostname --static myhost.example.com, що також пише /etc/hostname.
RichVel

2

Інший варіант - встановити ім'я хоста за допомогою даних користувача

напр

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

Це встановить ім'я хоста під час завантаження, проте я не впевнений, чи завжди це відбуватиметься до першого входу.


1

Схоже, відповідь є на сторінці mannamename homel. Тепер є 3 імена хоста, статичні, перехідні та гарні імена хостів.

Щоб встановити статичне ім’я хоста, яке, на мою думку, саме те, що вам потрібно,

hostnamectl --static set-hostname somehost.tld

Ви можете встановити їх таким самим

hostnamectl set-hostname somehost.tld

Правильно, але ... я розумію, що я мав би зрозуміти, що робить мій файл файлу; він встановлює серед інших статичні та перехідні імена хостів, використовуючи "hostnamectl"; це працює, але здається "масовою конфігурацією" для того, що я хочу досягти. Закріплення тексту ...
Девід Тонхофер

@DavidTonhofer: Я розгублений. У вашому запитанні втрачено слів, але, схоже, це зводиться до того, як мені встановити ім'я хоста в моїй системі F20. Можливо, якщо ви видалили всю словесність і просто задали прямо запитання ...
user9517

Гммм ... у вас може бути точка. добре, я знаю, як встановити ім'я хоста. Але як я правильно встановити його на зображенні Amazon EC2 під час завантаження?
Девід Тонхофер

1

Вирішіть за допомогою додаткового файлу одиниці

Наступне насправді не працює:

Створіть файл системного блоку, який /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'                 : 

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