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 hostnamectl
mię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.org
do /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 systemd
ustawia 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 hostnamectl
nie 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.service
i 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-hostnamed
jest 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Ć
sudo hostnamectl set-hostname --static myhost.example.com
, który również pisze/etc/hostname
.Inną opcją jest ustawienie nazwy hosta za pomocą danych użytkownika
na przykład
Spowoduje to ustawienie nazwy hosta podczas rozruchu, jednak nie jestem pewien, czy tak się zawsze stanie przed pierwszym logowaniem.
źródło
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,
Możesz ustawić je wszystkie tak samo
źródło
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.service
aby rozpocząć posystemd-hostnamed.service
(i być może dopiero podbus.service
).(Musiałem wykonać kilka cichych prób, aby znaleźć „właściwe miejsce”, aby
systemd
nie było łatwo dezaktywować nową jednostkę, ponieważ „wykryto cykl”. Zauważ, że możesz wykreślić wykres zależności pliku jednostkisystemd-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
:Aktywuj za pomocą
systemctl enable penpen-naming
Co ma
/usr/local/toolbox/setting_hostnames/penpen
zrobić? Jeśli pisze penpen.homelinux.org na/etc/hostname
. Ale tak naprawdę to nie wystarczy, należy również ustawić nazwę hostahostnamectl
.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ą:
źródło
W rzeczywistości jest to błąd w inicjowaniu chmury w dystrybucjach podobnych do RHEL przy użyciu SystemD. Na stronie https://bugs.launchpad.net/cloud-init/+bug/1424710 dostępna jest łatka
źródło