Prawidłowe ustawienie nazwy hosta - Fedora 20 na Amazon EC2

11

Kontekst

Mam obraz chmury Fedory 20 działający na Amazon EC2 (odtąd zwany „instancją”). I mam wątpliwości co do ciągłego ustawiania nazwy hosta.

Cel

W takim przypadku powiedzmy, że chcę ustawić nazwę hosta instancji na penpen.homelinux.org . (Ta nazwa zostanie również zarejestrowana w DynDNS przy użyciu ddclient, ale jest to kolejny aspekt, który nas tutaj nie interesuje).

Nazwę hosta można oczywiście ustawić ręcznie po zakończeniu rozruchu (używając hostnamectlmiędzy innymi). Ale chcemy mieć prawidłową nazwę hosta przed pierwszym logowaniem.

Tradycyjnie, aby trwale skonfigurować nazwę hosta, należy zmodyfikować zawartość /etc/hostname. Niestety to tutaj nie działa.

Domyślne zachowanie systemu

Domyślnie instancja ustawia nazwę hosta na wewnętrzną nazwę EC2. Po uruchomieniu możemy spojrzeć na wszystkie małe miejsca, które dają nazwę hosta, i znajdujemy:

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'                 : 

Spróbujmy więc napisać do / etc / hostname ...

Jeśli ktoś zapisze żądaną nazwę hosta /etc/hostname, ta zmiana zostanie utracona przy następnym uruchomieniu. Przyjrzyjmy się procesowi uruchamiania, który wykonuje systemd.

Przykładowy przebieg

Napisz rorororoor.homelinux.orgdo /etc/hostname, a następnie uruchom ponownie.

Korzystając z dziennika , znajdujemy (zauważ, że linie dzienników nie są w pełni uporządkowane według czasu):

Proces rozruchu rozpoczyna się od nazwy hosta jako localhost, a następnie przełącza root, w którym momencie nazwa hosta zmienia się na 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.

Widzimy, że systemdustawia nazwę hosta na rorororoor.homelinux.org , najwyraźniej z powodzeniem, gdy zmienia się kolumna hosta dziennika. Występują niektóre błędy, być może dlatego, że hostnamectlnie można w tej chwili skontaktować się z DBus.

Nie jestem pewien, kto tu nadaje nazwę; jakaś wewnętrzna część systemd? W każdym razie, kontynuując przeglądanie dziennika, wkrótce stwierdzimy, że nazwa hosta powróciła do wewnętrznej nazwy 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)

Ustawienie nazwy hosta w tym miejscu odbywa się za pomocą jednostki „systemd-hostnamed”. „Plik jednostkowy” dla „systemd-hostnamed” jest /usr/lib/systemd/system/systemd-hostnamed.servicei zawiera:

[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

Program wywoływany przez powyższe /usr/lib/systemd/systemd-hostnamedjest w rzeczywistości plikiem binarnym (DLACZEGO!). Jednak kod źródłowy można znaleźć.

Chodzi o to, że wróciliśmy do ip-10-164-65-105.ec2.internal

CO ZROBIĆ

David Tonhofer
źródło

Odpowiedzi:

11

Musisz zrobić dwie rzeczy (ale zrobiłeś tylko jedną z nich):

  1. Ustaw nazwę hosta w /etc/hostname.
  2. Edytuj /etc/cloud/cloud.cfgi ustaw preserve_hostnamena True. (Możesz również przekazać tę opcję wraz z danymi użytkownika).

Drugi krok jest wymagany, ponieważ Fedora używa cloud-initdanych użytkowników ze środowiska EC2 w celu udostępnienia instancji i cloud-initnależy powiedzieć, że nazwa hosta powinna pozostać.

Michael Hampton
źródło
W PORZĄDKU. Spróbuję tego natychmiast.
David Tonhofer,
1
Poczekaj, co to jest? Ok, YAML ( en.wikipedia.org/wiki/YAML ). Tak więc według scalehorizontally.com/2013/02/24/introduction-to-cloud-init dodaję „preserve_hostname: true” na najwyższym poziomie. ... Tak, to działa.
David Tonhofer,
Tak, to po prostu stary YAML.
Michael Hampton,
Cała próba i błąd. No cóż, sporo się nauczyłem. Dzięki.
David Tonhofer,
Dzięki, działa to na CentOS 7.3 - bez drugiego kroku nazwa hosta jest zastępowana przez chmurę-init podczas restartu. Jako pierwszy krok użyłem sudo hostnamectl set-hostname --static myhost.example.com, który również pisze /etc/hostname.
RichVel
2

Inną opcją jest ustawienie nazwy hosta za pomocą danych użytkownika

na przykład

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

Spowoduje to ustawienie nazwy hosta podczas rozruchu, jednak nie jestem pewien, czy tak się zawsze stanie przed pierwszym logowaniem.

IanB
źródło
1

Wygląda na to, że odpowiedź znajduje się na stronie podręcznika hostnamectl. Są teraz 3 nazwy hostów, statyczna, przejściowa i ładna.

Aby ustawić statyczną nazwę hosta, która moim zdaniem jest tą, którą chcesz,

hostnamectl --static set-hostname somehost.tld

Możesz ustawić je wszystkie tak samo

hostnamectl set-hostname somehost.tld
użytkownik9517
źródło
Zgadza się, ale ... Zdaję sobie sprawę, że powinienem był wyjaśnić, co robi mój plik jednostki; ustawia między innymi statyczne i przejściowe nazwy hostów za pomocą „hostnamectl”; to działa, ale wydaje się „ogromną konfiguracją” dla tego, co chcę osiągnąć. Naprawianie tekstu ...
David Tonhofer,
@DavidTonhofer: Jestem zdezorientowany. W twoim pytaniu brakuje słów, ale wydaje się, że sprowadzają się one do tego, jak ustawić nazwę hosta w moim systemie F20. Być może, jeśli usunąłeś cały czasownik i po prostu zadałeś proste pytanie ...
user9517,
Hmmm ... możesz mieć rację. wiem, jak ustawić nazwę hosta. Ale jak poprawnie ustawić go na obrazie Amazon EC2 podczas uruchamiania?
David Tonhofer,
1

Rozwiąż za pomocą dodatkowego pliku jednostkowego

Następujące działania naprawdę nie działają:

Utwórz plik jednostki systemowej, /usr/lib/systemd/system/penpen-naming.serviceaby rozpocząć po systemd-hostnamed.service(i być może dopiero po dbus.service).

(Musiałem wykonać kilka cichych prób, aby znaleźć „właściwe miejsce”, aby systemdnie było łatwo dezaktywować nową jednostkę, ponieważ „wykryto cykl”. Zauważ, że możesz wykreślić wykres zależności pliku jednostki systemd-analyze dot, który tworzy „kropkę” „plik, który ma zostać przekazany do programu„ graphviz ” dot, ale wynik jest tylko dużym, mylącym wykresem, chyba że go wstępnie przefiltrujesz)

Zawartość pliku jednostkowego /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

Aktywuj za pomocą systemctl enable penpen-naming

Co ma /usr/local/toolbox/setting_hostnames/penpenzrobić? Jeśli pisze penpen.homelinux.org na /etc/hostname. Ale tak naprawdę to nie wystarczy, należy również ustawić nazwę hosta hostnamectl.

Nawet wtedy urządzenie musi zostać uruchomione tak późno, (After=default.target)aby powłoka logowania nadal wyświetlała wewnętrzną nazwę hosta EC2. Nadal występują problemy z połączeniem z DBus.

To nie jest dobre rozwiązanie, a przynajmniej wymaga poprawki „pozycji w drzewie zależności plików jednostkowych” i „co do diabła z dbus”

Nazwy hostów po tym są:

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'                 : 
David Tonhofer
źródło