Contexto
tengo unImagen de nube de Fedora 20ejecutándose en Amazon EC2 (en adelante denominada "instancia"). Y tengo cierta incertidumbre acerca de establecer persistentemente su nombre de host.
Meta
En este caso, digamos que quiero configurar el nombre de host de la instancia enpenpen.homelinux.org. (Este nombre también quedará registrado en DynDNS mediante ddclient
, pero ese es otro aspecto que no nos interesa aquí.)
Por supuesto, el nombre de host se puede configurar manualmente una vez que se completa el arranque (usando, hostnamectl
entre otros). Pero queremos tener configurado el nombre de host correcto antes del primer inicio de sesión.
Tradicionalmente, para configurar persistentemente el nombre de host, se modificaba el contenido de /etc/hostname
. Desafortunadamenteesto no funciona aquí.
Comportamiento predeterminado del sistema
De forma predeterminada, la instancia establece su nombre de host en un nombre EC2 interno. Después del arranque, podemos mirar todos los pequeños lugares diferentes que producen el nombre de host y encontramos:
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' :
Así que intentemos escribir en /etc/hostname...
Si uno escribe el nombre de host deseado en /etc/hostname
, este cambio se perderá nuevamente en el siguiente inicio. Examinemos el proceso de arranque, que lo realiza systemd
.
Ejecución de ejemplo
Escriba rorororoor.homelinux.org
a /etc/hostname
y luego reinicie.
Usandodiarioencontramos (tenga en cuenta que las líneas del registro no están completamente ordenadas por tiempo):
El proceso de arranque comienza con el nombre de host comoservidor localluego cambia de raíz, momento en el cual el nombre de host se convierte enrorororoor.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.
Vemos que systemd
establece el nombre de host enrorororoor.homelinux.org, evidentemente con éxito a medida que cambia la columna de host del registro. Se emiten algunos errores, posiblemente porque hostnamectl
no se puede contactar con DBus en este momento.
No estoy seguro de quién establece los nombres aquí; alguna parte interna de systemd? De todos modos, continuando con el diario, encontramos que el nombre de host vuelve al nombre interno de EC2 muy pronto:
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)
La configuración del nombre de host aquí se realiza a través de la unidad "systemd-hostnamed". El "archivo de unidad" para "systemd-hostnamed" es /usr/lib/systemd/system/systemd-hostnamed.service
y 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
El programa invocado por lo anterior /usr/lib/systemd/systemd-hostnamed
es en realidad un binario (¡POR QUÉ!). Sin embargocódigo fuentepuede ser encontrado.
El caso es que estamos de vuelta enip-10-164-65-105.ec2.interno
¿QUÉ HACER?
Respuesta1
Necesitas hacer dos cosas (pero solo has hecho una de ellas):
- Establezca el nombre de host en
/etc/hostname
. - Edite
/etc/cloud/cloud.cfg
y configúrelopreserve_hostname
enTrue
. (También puedes pasar esta opción con tus datos de usuario).
El segundo paso es necesario porque Fedora suele cloud-init
traer datos de usuario desde el entorno EC2 para aprovisionar la instancia, y cloud-init
es necesario que se le indique que el nombre de host debe persistir.
Respuesta2
Otra opción es configurar el nombre de host a través dedatos del usuario
p.ej
#cloud-config
hostname: foo
fqdn: foo.bar.net
Esto establecerá el nombre de host al arrancar, sin embargo, no estoy seguro de si eso sucederá siempre antes del primer inicio de sesión.
Respuesta3
Parece que la respuesta está en la página de manual de hostnamectl. Ahora hay 3 nombres de host: estático, transitorio y bonito.
Para configurar el nombre de host estático que creo que es el que desea,
hostnamectl --static set-hostname somehost.tld
Puedes configurarlos todos para que sean iguales con
hostnamectl set-hostname somehost.tld
Respuesta4
En realidad, esto es un error en cloud-init en distribuciones similares a RHEL que usan SystemD. Hay un parche disponible enhttps://bugs.launchpad.net/cloud-init/+bug/1424710