正确设置主机名-Amazon EC2上的Fedora 20


11

语境

我在Amazon EC2上运行了Fedora 20云映像(此后称为“实例”)。我不确定是否要永久设置其主机名。

目标

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

当然,可以在启动完成后手动设置主机名(hostnamectl除其他外使用)。但是,我们希望在首次登录之前设置正确的主机名。

传统上,要永久配置主机名,可以修改的内容/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我们发现(请注意,日志行并非完全由时间orderd):

引导过程以主机名localhost开始,然后切换到root,此时主机名变为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,显然随着日志的host列更改而成功。发出了一些错误,可能是因为此时hostnamectl无法联系DBus。

我不确定是谁在这里进行命名;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!)。但是,可以找到源代码

关键是我们回到了ip-10-164-65-105.ec2.internal

做什么?

Answers:


11

您需要做两件事(但只做其中一件):

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

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


好吧。我将立即尝试。
David Tonhofer 2013年

1
等等,这是什么?好的,YAML(en.wikipedia.org/wiki/YAML)。因此,根据scalehorizo​​ntally.com/2013/02/24/introduction-to-cloud-init,我在顶层添加了“ preserve_hostname:true”。...是的。
David Tonhofer 2013年

是的,这只是普通的YAML。
迈克尔·汉普顿

所有的反复试验。哦,我学到了很多东西。谢谢。
David Tonhofer 2013年

谢谢,这在CentOS 7.3上有效-无需第二步,主机名在重启时会被cloud-init覆盖。第一步,我使用sudo hostnamectl set-hostname --static myhost.example.com,它也写了/etc/hostname
RichVel

2

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

例如

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

这将在启动时设置主机名,但是我不确定这是否总是在首次登录之前发生。


1

答案似乎在hostnamectl手册页中,现在有3个主机名,即静态,临时和漂亮的主机名。

要设置我想要的静态主机名,

hostnamectl --static set-hostname somehost.tld

您可以将它们设置为与

hostnamectl set-hostname somehost.tld

正确,但是...我意识到我应该更清楚我的单位文件的功能;它使用“ hostnamectl”设置静态和临时主机名;这可行,但是对于我想要实现的目标来说似乎是“大规模配置”。修正文字...
David Tonhofer 2013年

@DavidTonhofer:我很困惑。您的问题中有些措辞不清,但可能归结为我如何在F20系统上设置主机名。也许,如果您删除了所有
文字

嗯...你可能有一点。好吧,我知道如何设置主机名。但是如何在启动时在Amazon EC2映像上正确设置它?
David Tonhofer,2013年

1

解决使用其他单位文件

以下内容实际上无效:

创建一个/usr/lib/systemd/system/penpen-naming.service要在之后systemd-hostnamed.service(并且可能仅在之后dbus.service)启动的系统单元文件。

(我必须进行一些安静的尝试才能找到“正确的位置”,这样systemd就不会因为“检测到一个循环”而简单地停用新单元。请注意,您可以使用来绘制单元文件依赖关系图systemd-analyze dot,从而创建一个“点”。 “文件传递给” 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

即使这样,该单元也必须运行得这么晚(After=default.target),以使登录外壳仍显示EC2内部主机名。连接到DBus仍然存在问题。

因此,这不是一个好的解决方案,或者至少它需要修复“单元文件相关性树中的位置”和“ 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'                 : 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.