Kontext
Ich habe einFedora 20 Cloud-Imageläuft auf Amazon EC2 (im Folgenden „Instanz“ genannt). Und ich bin mir nicht sicher, ob ich den Hostnamen dauerhaft festlegen soll.
Ziel
In diesem Fall möchte ich den Hostnamen der Instanz aufpenpen.homelinux.org. (Dieser Name wird auch bei DynDNS mittels registriert ddclient
, aber das ist ein anderer Aspekt, der uns hier nicht interessiert.)
Der Hostname kann natürlich nach dem Booten manuell festgelegt werden ( hostnamectl
unter anderem mit). Wir möchten jedoch, dass der richtige Hostname vor der ersten Anmeldung festgelegt ist.
Um den Hostnamen dauerhaft zu konfigurieren, würde man traditionell den Inhalt von ändern /etc/hostname
. Leiderdas geht hier nicht.
Standardmäßiges Systemverhalten
Standardmäßig setzt die Instanz ihren Hostnamen auf einen internen EC2-Namen. Nach dem Booten können wir uns alle kleinen verschiedenen Stellen ansehen, die den Hostnamen ergeben, und wir finden:
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' :
Versuchen wir also, in /etc/hostname zu schreiben ...
Schreibt man den gewünschten Hostnamen in /etc/hostname
, geht diese Änderung beim nächsten Booten wieder verloren. Betrachten wir dazu den Bootvorgang, der von durchgeführt wird systemd
.
Beispielausführung
Schreiben Sie rorororoor.homelinux.org
in /etc/hostname
und starten Sie dann neu.
Verwenden vonTagebuchwir finden (beachten Sie, dass die Protokollzeilen nicht vollständig nach Zeit geordnet sind):
Der Bootvorgang beginnt mit dem Hostnamen alslokaler Hostwechselt dann zu root, woraufhin der Hostname wirdrorororoor.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.
Wir sehen, dass systemd
der Hostname aufrorororoor.homelinux.org, offensichtlich erfolgreich, da sich die Host-Spalte des Protokolls ändert. Es werden einige Fehler ausgegeben, möglicherweise weil hostnamectl
DBus zu diesem Zeitpunkt nicht kontaktiert werden kann.
Ich bin nicht sicher, wer hier die Namenseinstellung vornimmt; irgendein interner Teil von systemd? Wie dem auch sei, wenn wir das Journal weiter durchgehen, stellen wir fest, dass der Hostname ziemlich bald wieder auf den internen EC2-Namen zurückgesetzt wird:
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)
Die Einstellung des Hostnamens erfolgt hier über die Unit „systemd-hostnamed“. Die „Unit-Datei“ für „systemd-hostnamed“ ist /usr/lib/systemd/system/systemd-hostnamed.service
und enthält:
[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
Das oben aufgerufene Programm /usr/lib/systemd/systemd-hostnamed
ist eigentlich eine Binärdatei (WARUM!).Quellcodekann gefunden werden.
Der Punkt ist, dass wir wieder beiip-10-164-65-105.ec2.internal
WAS TUN?
Antwort1
Sie müssen zwei Dinge tun (haben aber bisher nur eines davon getan):
- Legen Sie den Hostnamen in fest
/etc/hostname
. - Bearbeiten
/etc/cloud/cloud.cfg
undpreserve_hostname
auf setzenTrue
. (Sie können diese Option auch mit Ihren Benutzerdaten übergeben.)
Der zweite Schritt ist erforderlich, da Fedora cloud-init
zum Bereitstellen der Instanz Benutzerdaten aus der EC2-Umgebung importiert und cloud-init
mitgeteilt werden muss, dass der Hostname beibehalten werden soll.
Antwort2
Eine weitere Möglichkeit besteht darin, den Hostnamen überBenutzerdaten
z.B
#cloud-config
hostname: foo
fqdn: foo.bar.net
Dadurch wird der Hostname beim Booten festgelegt. Ich bin mir jedoch nicht sicher, ob dies immer vor der ersten Anmeldung geschieht.
Antwort3
Es sieht so aus, als ob die Antwort auf der Manpage von hostnamectl steht. Dort gibt es jetzt 3 Hostnamen: den statischen, den temporären und den hübschen Hostnamen.
Um den statischen Hostnamen festzulegen, der meiner Meinung nach der gewünschte ist,
hostnamectl --static set-hostname somehost.tld
Sie können sie alle gleich einstellen mit
hostnamectl set-hostname somehost.tld
Antwort4
Dies ist eigentlich ein Fehler in Cloud-Init auf RHEL-ähnlichen Distributionen, die SystemD verwenden. Es gibt einen Patch unterhttps://bugs.launchpad.net/cloud-init/+bug/1424710