Richtiges Einstellen des Hostnamens - Fedora 20 auf Amazon EC2

11

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.organ /etc/hostnameund 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 systemdder Hostname auf rorororoor.homelinux.org gesetzt wird , offensichtlich erfolgreich, wenn sich die Hostspalte des Protokolls ändert. Einige Fehler werden ausgegeben, möglicherweise weil hostnamectlDBus 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.serviceund 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-hostnamedist 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?

David Tonhofer
quelle

Antworten:

11

Sie müssen zwei Dinge tun (haben aber nur eines getan):

  1. Legen Sie den Hostnamen in fest /etc/hostname .
  2. Bearbeiten /etc/cloud/cloud.cfgund einstellen preserve_hostnameauf True. (Sie können diese Option auch mit Ihren Benutzerdaten übergeben.)

Der zweite Schritt ist erforderlich, da Fedora cloud-initBenutzerdaten aus der EC2-Umgebung zur Bereitstellung der Instanz einbringt und cloud-initmitgeteilt werden muss, dass der Hostname beibehalten werden soll.

Michael Hampton
quelle
GUT. Ich werde das sofort versuchen.
David Tonhofer
1
Warte, was ist das? Ok, YAML ( en.wikipedia.org/wiki/YAML ). Also füge ich laut scalehorizontally.com/2013/02/24/introduction-to-cloud-init " erve_hostname : true "auf der obersten Ebene hinzu. ... Ja, es funktioniert.
David Tonhofer
Ja, es ist einfach nur alte YAML.
Michael Hampton
All das Ausprobieren. Na ja, ich habe ziemlich viel gelernt. Vielen Dank.
David Tonhofer
Vielen Dank, dies funktioniert unter CentOS 7.3 - ohne zweiten Schritt wird der Hostname beim Neustart von cloud-init überschrieben. Für den ersten Schritt habe ich verwendet sudo hostnamectl set-hostname --static myhost.example.com, der auch schreibt /etc/hostname.
RichVel
2

Eine andere Möglichkeit besteht darin, den Hostnamen über Benutzerdaten festzulegen

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 geschehen würde.

IanB
quelle
1

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,

hostnamectl --static set-hostname somehost.tld

Sie können festlegen, dass alle gleich sind

hostnamectl set-hostname somehost.tld
user9517
quelle
Richtig, aber ... mir ist klar, dass ich klarer hätte machen sollen, was meine Gerätedatei tut. es setzt unter anderem statische und vorübergehende Hostnamen mit "hostnamectl"; Dies funktioniert, scheint aber eine "massive Konfiguration" für das zu sein, was ich erreichen möchte. Den Text
korrigieren
@ DavidTonhofer: Ich bin verwirrt. Ihre Frage enthält keine Wörter, aber es scheint sich darauf zu beschränken, wie ich den Hostnamen auf meinem F20-System einstelle. Vielleicht, wenn Sie alle Worte entfernt und nur eine einfache Frage gestellt haben ...
user9517
Hmmm ... Sie können einen Punkt haben. Nun, ich weiß, wie man den Hostnamen einstellt. Aber wie stelle ich es beim Booten richtig auf ein Amazon EC2-Image ein?
David Tonhofer
1

Lösen Sie mit einer zusätzlichen Einheitendatei

Folgendes funktioniert nicht wirklich:

Erstellen Sie eine Systemeinheitendatei /usr/lib/systemd/system/penpen-naming.service, die nach systemd-hostnamed.service(und möglicherweise erst nach dbus.service) gestartet werden soll .

(Ich musste einige Versuche ruhig durchführen, um den "richtigen Ort" zu finden, systemddamit 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önnen systemd-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:

[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

Aktivieren Sie es mit systemctl enable penpen-naming

Was macht /usr/local/toolbox/setting_hostnames/penpendas 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:

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
quelle