Kontext
Ich habe ein Fedora 20-Cloud-Image das auf Amazon EC2 ausgeführt wird (im Folgenden als "Instanz" bezeichnet). Und ich bin mir nicht sicher, ob ich den Hostnamen dauerhaft festlegen soll.
Tor
In diesem Fall möchte ich den Hostnamen der Instanz auf penpen.homelinux.org setzen . (Dieser Name wird auch bei DynDNS mit registriertddclient
, aber das ist ein weiterer Aspekt, an dem wir hier nicht interessiert sind.)
Der Hostname kann natürlich nach Abschluss des Startvorgangs manuell festgelegt werden (mit hostnamectl
unter anderem unter ). Wir möchten jedoch, dass der richtige Hostname vor der ersten Anmeldung festgelegt wird.
Um den Hostnamen dauerhaft zu konfigurieren, wird traditionell der Inhalt von geändert /etc/hostname
. Leider funktioniert das hier nicht.
Standardsystemverhalten
Standardmäßig setzt die Instanz ihren Hostnamen auf einen internen EC2-Namen. Nach dem Booten können wir uns all die kleinen verschiedenen Orte 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 ...
Wenn man den gewünschten Hostnamen schreibt /etc/hostname
, geht diese Änderung beim nächsten Start wieder verloren. Lassen Sie uns den Startvorgang untersuchen, der von ausgeführt wird systemd
.
Beispiellauf
Schreiben Sie rorororoor.homelinux.org
an /etc/hostname
und starten Sie den Computer neu.
Mit journald finden wir (Beachten Sie, dass die Protokollzeilen nicht vollständig nach Zeit geordnet sind):
Der Startvorgang beginnt mit dem Hostnamen als localhost und wechselt dann zu root. An diesem Punkt wird der Hostname zu 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.
Wir sehen, dass systemd
der Hostname auf rorororoor.homelinux.org gesetzt wird , offensichtlich erfolgreich, wenn sich die Hostspalte des Protokolls ändert. Einige Fehler werden ausgegeben, möglicherweise weil hostnamectl
DBus zu diesem Zeitpunkt nicht kontaktiert werden kann.
Ich bin mir nicht sicher, wer hier den Namen macht. ein interner Teil von systemd? Wie auch immer, wenn wir das Journal durcharbeiten, stellen wir fest, dass der Hostname ziemlich bald auf den internen Namen von EC2 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 Einheit "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!). Jedoch Quellcode gefunden werden kann.
Der Punkt ist, dass wir wieder bei ip-10-164-65-105.ec2.internal sind
WAS TUN?
sudo hostnamectl set-hostname --static myhost.example.com
, der auch schreibt/etc/hostname
.Eine andere Möglichkeit besteht darin, den Hostnamen über Benutzerdaten festzulegen
z.B
Dadurch wird der Hostname beim Booten festgelegt. Ich bin mir jedoch nicht sicher, ob dies immer vor der ersten Anmeldung geschehen würde.
quelle
Es sieht so aus, als ob die Antwort auf der Hostnamectl-Manpage steht. Es gibt jetzt 3 Hostnamen, die statischen, vorübergehenden und hübschen Hostnamen.
Um den statischen Hostnamen festzulegen, den ich für den gewünschten halte,
Sie können festlegen, dass alle gleich sind
quelle
Lösen Sie mit einer zusätzlichen Einheitendatei
Folgendes funktioniert nicht wirklich:
Erstellen Sie eine Systemeinheitendatei
/usr/lib/systemd/system/penpen-naming.service
, die nachsystemd-hostnamed.service
(und möglicherweise erst nachdbus.service
) gestartet werden soll .(Ich musste einige Versuche ruhig durchführen, um den "richtigen Ort" zu finden,
systemd
damit die neue Einheit nicht einfach deaktiviert wurde, da "ein Zyklus erkannt wurde". Beachten Sie, dass Sie das Diagramm der Abhängigkeitsdatei der Einheitendatei grafisch darstellen könnensystemd-analyze dot
, wodurch ein "Punkt" erstellt wird "Datei, die an" graphviz "übergeben werden solldot
Programm werden soll, aber das Ergebnis ist nur ein großes verwirrendes Diagramm, es sei denn, Sie filtern es vor)Inhalt der Einheitendatei
/usr/lib/systemd/system/penpen-naming.service
:Aktivieren Sie es mit
systemctl enable penpen-naming
Was macht
/usr/local/toolbox/setting_hostnames/penpen
das Wenn schreibt penpen.homelinux.org an/etc/hostname
. Das reicht aber eigentlich nicht aus, man muss auch den Hostnamen mit einstellenhostnamectl
.Selbst dann muss das Gerät so spät ausgeführt werden,
(After=default.target)
dass die Anmeldeshell weiterhin den internen EC2-Hostnamen anzeigt. Und es gibt immer noch Probleme beim Herstellen einer Verbindung zu DBus.Dies ist also keine gute Lösung, oder es muss zumindest ein Fix für "Position im Abhängigkeitsbaum der Einheitendatei" und "Was zum Teufel ist mit dbus los?"
Die Hostnamen danach sind:
quelle
Dies ist tatsächlich ein Fehler in Cloud-Init auf RHEL-ähnlichen Distributionen mit SystemD. Unter https://bugs.launchpad.net/cloud-init/+bug/1424710 ist ein Patch verfügbar
quelle