我有一个在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
,则在下次引导时,此更改将再次丢失。 我们来看看由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
做什么?
你需要做两件事(但只做了其中的一件):
/etc/hostname
设置主机/etc/hostname
。 /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有一个补丁