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


11

문맥

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, 다음 재부팅합니다.

저널링 을 사용하면 다음 을 발견 할 수 있습니다 (로그 라인은 시간순으로 정렬 되지 않습니다)

부팅 프로세스는 호스트 이름을 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"의 "unit file"은 다음 /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에 돌아온다는 것입니다

무엇을합니까?

답변:


11

두 가지 작업을 수행해야합니다 (하지만 그 중 하나만 수행).

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

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


괜찮아. 나는 그것을 즉시 시도 할 것이다.
David Tonhofer

1
잠깐만,이게 뭐야? 좋아, YAML ( en.wikipedia.org/wiki/YAML ). scalehorizontally.com/2013/02/24/introduction-to-cloud-init 에 따르면 최상위에 "preserve_hostname : true"를 추가합니다. ... 그렇습니다.
David Tonhofer

그렇습니다, 그것은 단지 평범한 YAML입니다.
Michael Hampton

그 모든 시행 착오. 잘, 나는 많은 것을 배웠다. 감사.
David Tonhofer

고마워, 이것은 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

@DavidTonhofer : 혼란 스러워요. 귀하의 질문에 단어가 빠져 있지만 F20 시스템에서 호스트 이름을 어떻게 설정합니까? 아마도 당신이 모든 언어를 제거하고 그냥 간단한 질문을
했다면

흠 ... 당신은 포인트가있을 수 있습니다. 글쎄, 나는 호스트 이름을 설정하는 방법을 알고있다. 하지만 부팅시 Amazon EC2 이미지에서 어떻게 올바르게 설정합니까?
David Tonhofer

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'                 : 

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.