正確設置主機名 - Amazon EC2 上的 Fedora 20
語境
我有一個在 Amazon EC2 上執行的Fedora 20 雲映像(以下稱為“實例”)。而且我對持續設置其主機名有些不確定。
目標
在這種情況下,假設我想將實例的主機名設置為penpen.homelinux.org。(這個名稱也將使用 註冊在 DynDNS
ddclient
,但這是我們在這裡不感興趣的另一個方面。)主機名當然可以在引導完成後手動設置(使用
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我們發現(請注意,日誌行並非完全按時間排序):
引導過程以主機名作為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,顯然隨著日誌的主機列更改成功。發出一些錯誤,可能是因為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
實際上是一個二進製文件(為什麼!)。但是可以找到原始碼。關鍵是我們回到了ip-10-164-65-105.ec2.internal
做什麼?
你需要做兩件事(但只做了其中一件):
- 將主機名設置在
/etc/hostname
.- 編輯
/etc/cloud/cloud.cfg
並設置preserve_hostname
為True
. (您也可以將此選項與您的使用者數據一起傳遞。)第二步是必需的,因為 Fedora 使用
cloud-init
從 EC2 環境中引入使用者數據來配置實例,並且cloud-init
需要告知主機名應該保持不變。
另一種選擇是通過使用者數據設置主機名
例如
#cloud-config hostname: foo fqdn: foo.bar.net
這將在啟動時設置主機名,但是我不確定這是否總是在第一次登錄之前發生。