Fedora 20クラウドイメージ をAmazon EC2で実行しています(以降、「インスタンス」と呼びます)。そして、私は永続的にそのホスト名を設定することについていくつかの不確実性を持っています。
この場合、インスタンスのホスト名を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
に書き込むと、この変更は次回の起動時に失われます。 systemd
によって実行されるブートプロセスを調べてみましょう。
実行例
rorororoor.homelinux.org
を/etc/hostname
に書き込んでから、再起動します。
journald を使用すると、次のことがわかります(ログの行は完全に時間順に並べられていないことに注意してください)。
ブートプロセスは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に設定していることがわかります。ログの[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に戻ったことです。
どうする?
あなたは2つのことをする必要があります(しかし、それらのうちの1つだけを行いました):
/etc/hostname
にホスト名を設定します。/etc/cloud/cloud.cfg
を編集し、preserve_hostname
をTrue
に設定します。 (このオプションをユーザーデータとともに渡すこともできます。)Fedoraはcloud-init
を使用してEC2環境からユーザーデータを取り込み、インスタンスをプロビジョニングし、cloud-init
はホスト名を保持する必要があることを通知する必要があるため、2番目のステップが必要です。
別のオプションは ser data でホスト名を設定することです
例えば.
#cloud-config
hostname: foo
fqdn: foo.bar.net
これにより、起動時にホスト名が設定されますが、最初のログインの前にそれが常に発生するかどうかはわかりません。
答えはhostnamectlのmanページにあるようです。3つのホスト名、静的、一時的、そしてきれいなホスト名があります。
私が望むものであると思う静的ホスト名を設定するには、
hostnamectl --static set-hostname somehost.tld
あなたはそれらをすべて同じになるように設定することができます
hostnamectl set-hostname somehost.tld
以下は実際には機能しません。
_/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' :
_