Impostazione corretta del nome host - Fedora 20 su Amazon EC2


11

Contesto

Ho un'immagine cloud Fedora 20 in esecuzione su Amazon EC2 (d'ora in poi chiamata "istanza"). E ho qualche incertezza sull'impostazione persistente del suo nome host.

Obbiettivo

In questo caso, supponiamo di voler impostare il nome host dell'istanza su penpen.homelinux.org . (Questo nome verrà registrato anche su DynDNS utilizzando ddclient, ma questo è un altro aspetto che non ci interessa qui.)

Il nome host può ovviamente essere impostato manualmente dopo il completamento dell'avvio (usando hostnamectltra gli altri). Ma vogliamo avere il nome host corretto impostato prima del primo accesso.

Tradizionalmente, per configurare in modo persistente il nome host, si modifica il contenuto di /etc/hostname. Purtroppo questo non funziona qui.

Comportamento di sistema predefinito

Per impostazione predefinita, l'istanza imposta il nome host su un nome EC2 interno. Dopo l'avvio, possiamo guardare tutti i piccoli posti diversi che danno il nome host e troviamo:

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

Quindi proviamo a scrivere a / etc / hostname ...

Se si scrive il nome host desiderato /etc/hostname, questa modifica viene persa nuovamente all'avvio successivo. Esaminiamo il processo di avvio, che viene eseguito da systemd.

Esempio di esecuzione

Scrivi rorororoor.homelinux.orga /etc/hostname, quindi riavvia.

Usando journald troviamo (si noti che le righe del registro non sono interamente ordinate in base al tempo):

Il processo di avvio inizia con hostname come localhost quindi passa a root, a quel punto il nome host diventa 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.

Vediamo che systemdimposta il nome host su rorororoor.homelinux.org , evidentemente con successo quando la colonna host del registro cambia. Vengono emessi alcuni errori, probabilmente perché hostnamectlnon è possibile contattare DBus in questo momento.

Non sono sicuro di chi faccia la nomenclatura qui; qualche parte interna di systemd? Comunque, continuando attraverso il diario, scopriamo che il nome host viene riportato al nome interno EC2 molto presto:

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)

L'impostazione del nome host qui viene effettuata tramite l'unità "systemd-hostname". Il "file unitario" per "systemd-hostname" è /usr/lib/systemd/system/systemd-hostnamed.servicee contiene:

[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

Il programma invocato da quanto sopra /usr/lib/systemd/systemd-hostnamedè in realtà un binario (PERCHÉ!). Tuttavia è possibile trovare il codice sorgente .

Il punto è che siamo tornati su ip-10-164-65-105.ec2.internal

COSA FARE?

Risposte:


11

Devi fare due cose (ma ne hai fatto solo uno):

  1. Imposta il nome host in /etc/hostname.
  2. Modifica /etc/cloud/cloud.cfge imposta preserve_hostnamesu True. (Puoi anche passare questa opzione con i tuoi dati utente.)

Il secondo passo è necessario perché Fedora utilizza per inserire cloud-initi dati utente dall'ambiente EC2 per eseguire il provisioning dell'istanza e cloud-initdeve essere informato che il nome host dovrebbe persistere.


TUTTO OK. Ci proverò immediatamente.
David Tonhofer,

1
Aspetta, cos'è questo? Ok, YAML ( en.wikipedia.org/wiki/YAML ). Quindi, secondo scalehorizontally.com/2013/02/24/introduction-to-cloud-init, aggiungo " preserv_hostname : true" al livello superiore. ... Sì, funziona.
David Tonhofer,

Sì, è semplicemente il vecchio YAML.
Michael Hampton

Tutta quella prova ed errore. Oh bene, ho imparato parecchio. Grazie.
David Tonhofer,

Grazie, funziona su CentOS 7.3: senza il secondo passaggio, il nome host viene sovrascritto da cloud-init al riavvio. Per il primo passo, ho usato sudo hostnamectl set-hostname --static myhost.example.com, che scrive /etc/hostnameanche.
RichVel

2

Un'altra opzione è quella di impostare il nome host tramite i dati dell'utente

per esempio

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

Questo imposterà il nome host all'avvio, tuttavia non sono sicuro che ciò accada sempre prima del primo accesso.


1

Sembra che la risposta sia nella pagina man di hostnamectl ora ci sono 3 nomi host, i nomi host statici, temporanei e belli.

Per impostare il nome host statico che penso sia quello desiderato,

hostnamectl --static set-hostname somehost.tld

Puoi impostarli tutti allo stesso modo

hostnamectl set-hostname somehost.tld

Corretto, ma ... mi rendo conto che avrei dovuto chiarire cosa fa il mio file di unità; imposta tra l'altro nomi host statici e transitori usando "hostnamectl"; funziona ma sembra "configurazione enorme" per quello che voglio ottenere. Correzione del testo ...
David Tonhofer,

@DavidTonhofer: sono confuso. Ci sono parole perse nella tua domanda, ma sembra ridursi a come posso impostare il nome host sul mio sistema F20. Forse se hai rimosso tutta la verbosità e hai appena fatto una domanda semplice ...
user9517

Hmmm ... potresti avere un punto. bene, so come impostare il nome host. Ma come posso impostarlo correttamente su un'immagine Amazon EC2 al momento dell'avvio?
David Tonhofer,

1

Risolvi usando un file di unità aggiuntivo

Quanto segue non funziona davvero:

Creare un file di unità di sistema /usr/lib/systemd/system/penpen-naming.serviceda avviare dopo systemd-hostnamed.service(e possibilmente solo dopo dbus.service).

(Ho dovuto eseguire alcune prove per trovare il "posto giusto" in modo da systemdnon disattivare la nuova unità semplicemente perché "è stato rilevato un ciclo". Si noti che è possibile rappresentare graficamente il grafico di dipendenza del file di unità systemd-analyze dot, che crea un "punto "file da passare al programma" graphviz " dot, ma il risultato è solo un grande grafico confuso, a meno che non lo si prefiltri)

Contenuto del file unitario /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

Attivalo usando systemctl enable penpen-naming

Cosa fa /usr/local/toolbox/setting_hostnames/penpen? Se scrive penpen.homelinux.org in /etc/hostname. Ma in realtà non è abbastanza, bisogna anche impostare il nome host usando hostnamectl.

Anche in questo caso, l'unità deve essere eseguita così tardi (After=default.target)che la shell di accesso visualizza ancora il nome host interno EC2. E ci sono ancora problemi di connessione a DBus.

Quindi questa non è una buona soluzione, o almeno ha bisogno di una correzione per "posizione nell'albero delle dipendenze dei file di unità" e "che diavolo succede con dbus"

I nomi host dopo questo sono:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.