호스트 이름을 올바르게 설정 - Amazon EC2의 Fedora 20

호스트 이름을 올바르게 설정 - Amazon EC2의 Fedora 20

문맥

나는Fedora 20 클라우드 이미지Amazon EC2(이후 "인스턴스"라고 함)에서 실행됩니다. 그리고 호스트 이름을 지속적으로 설정하는 것에 대해 약간의 불확실성이 있습니다.

목표

이 경우 인스턴스의 호스트 이름을 다음으로 설정한다고 가정해 보겠습니다.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다음 재부팅하십시오.

사용저널링우리는 다음을 발견했습니다(로그 줄은 완전히 시간순으로 정렬되지 않았습니다).

부팅 프로세스는 다음과 같은 호스트 이름으로 시작됩니다.로컬호스트그런 다음 루트를 전환하면 호스트 이름이 다음과 같이 됩니다.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.내부

무엇을 합니까?

답변1

두 가지 작업을 수행해야 하지만 그중 하나만 수행했습니다.

  1. 에서 호스트 이름을 설정합니다 /etc/hostname.
  2. 편집 /etc/cloud/cloud.cfg하고 preserve_hostname로 설정합니다 True. (이 옵션을 사용자 데이터와 함께 전달할 수도 있습니다.)

두 번째 단계는 Fedora가 cloud-init인스턴스를 프로비저닝하기 위해 EC2 환경에서 사용자 데이터를 가져오고 cloud-init호스트 이름이 지속되어야 한다는 점을 알려야 하기 때문에 필요합니다.

답변2

또 다른 옵션은 다음을 통해 호스트 이름을 설정하는 것입니다.사용자 데이터

예를 들어

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

이렇게 하면 부팅 시 호스트 이름이 설정되지만 처음 로그인하기 전에 항상 그런 일이 발생하는지 확실하지 않습니다.

답변3

대답은 Hostnamectl 매뉴얼 페이지에 있는 것 같습니다. 이제 3개의 호스트 이름(정적, 임시 및 예쁜 호스트 이름)이 있습니다.

내가 원하는 정적 호스트 이름을 설정하려면,

hostnamectl --static set-hostname somehost.tld

모두 동일하게 설정할 수 있습니다.

hostnamectl set-hostname somehost.tld

답변4

이것은 실제로 SystemD를 사용하는 RHEL 유사 배포판의 cloud-init 버그입니다. 다음 위치에 패치가 있습니다.https://bugs.launchpad.net/cloud-init/+bug/1424710

관련 정보