正确设置主机名 – 亚马逊EC2上的Fedora 20

上下文

我有一个在Amazon EC2上运行的Fedora 20云映像 (以下称为“实例”)。 而且对于持续设置主机名我还有一些不确定性。

目标

在这种情况下,假设我想将实例的主机名设置为penpen.homelinux.org 。 (这个名字也将使用ddclient在DynDNS注册,但这是我们不感兴趣的另一个方面。)

主机名当然可以在引导完成后手动设置(使用hostnamectl等)。 但是我们希望在第一次login之前设置正确的主机名。

传统上,要持久地configuration主机名,可以修改/etc/hostname的内容。 不幸的是, 这不起作用。

系统默认行为

默认情况下,实例将其主机名设置为内部EC2名称。 启动后,我们可以查看产生主机名的所有不同的地方,我们发现:

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

所以我们试着写入/ etc / hostname …

如果将所需的主机名写入/etc/hostname ,则在下次引导时,此更改将再次丢失。 我们来看看由systemd执行的启动过程。

示例运行

rorororoor.homelinux.org写入/etc/hostname ,然后重启。

使用journald我们发现(请注意,日志行不完全按时间sorting):

启动过程以localhost作为localhost开始,然后切换根目录,此时主机名变为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. 

我们看到systemd将主机名设置为rorororoor.homelinux.org ,很明显,在日志的主机列更改时成功。 发出一些错误,可能是因为hostnamectl不能联系DBus。

我不确定这里的名字是谁devise的, systemd的一些内部部分? 无论如何,继续通过期刊,我们发现主机名很快就被设置回EC2的内部名称:

 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) 

这里的主机名设置是通过单元“systemd-hostnamed”完成的。 “systemd-hostnamed”的“单元文件”是/usr/lib/systemd/system/systemd-hostnamed.service ,包含:

 [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 

上面的/usr/lib/systemd/systemd-hostnamed调用的程序实际上是一个二进制文件(WHY!)。 但是可以find源代码 。

重点是我们回到ip-10-164-65-105.ec2.internal

做什么?

你需要做两件事(但只做了其中的一件):

  1. /etc/hostname设置主机/etc/hostname
  2. 编辑/etc/cloud/cloud.cfg并将preserve_hostname设置为True 。 (您也可以将此选项与您的用户数据一起传递。)

第二步是必需的,因为Fedora使用cloud-init从EC2环境中引入用户数据来调配实例,并且需要告诉cloud-init主机名应该保留。

另一种select是通过用户数据设置主机名

例如

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

这将设置主机名启动,但我不确定这是否会始终发生在第一次login之前。

它看起来像是在hostnamectl手册页中的答案,现在有3个主机名,静态,瞬态和漂亮的主机名。

要设置我认为是你想要的静态主机名,

 hostnamectl --static set-hostname somehost.tld 

你可以将它们全部设置为相同

 hostnamectl set-hostname somehost.tld 

解决使用一个额外的单元文件

以下不真的工作:

systemd-hostnamed.service之后创build一个系统单元文件/usr/lib/systemd/system/penpen-naming.service (可能仅在dbus.service之后)。

(我不得不安静地进行一些试验来find“正确的地方”,这样systemd就不会简单地closures新的单元,因为“一个循环被检测到”。注意,你可以用systemd-analyze dot来绘制单元文件依赖图,它创build一个“点”文件传递给“graphviz” dot程序,但结果只是一个很大的混淆图,除非你预先筛选它)

单元文件的内容/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 

使用systemctl enable penpen-naming激活它

/usr/local/toolbox/setting_hostnames/penpen做什么的? 如果将penpen.homelinux.org写入/etc/hostname 。 但是这实际上还不够,还必须使用hostnamectl来设置主机hostnamectl

即使如此,单位必须运行得如此之晚(After=default.target) ,loginshell仍然显示EC2内部主机名。 连接到DBus还有问题。

所以这不是一个好的解决scheme,或者至less需要修复“在单元文件依赖树中的位置”和“dbus到底是什么”

之后的主机名是:

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

这实际上是一个在使用SystemD的类似RHEL的发行版中的cloud-init中的错误。 在https://bugs.launchpad.net/cloud-init/+bug/1424710有一个补&#x4E01;