ตั้งค่าชื่อโฮสต์อย่างถูกต้อง - Fedora 20 บน Amazon EC2


11

บริบท

ฉันมีภาพเมฆของ 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แล้วรีบูต

ใช้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ซึ่งประสบความสำเร็จอย่างเห็นได้ชัดเมื่อการเปลี่ยนแปลงคอลัมน์โฮสต์ของบันทึก ข้อผิดพลาดบางอย่างเกิดขึ้นอาจเป็นเพราะ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

ทำอะไร?

คำตอบ:


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ฉันเพิ่ม " erve_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

ดูเหมือนว่าคำตอบอยู่ในหน้า man hostnamectl ที่มีชื่อโฮสต์ 3 ชื่อคือชื่อโฮสต์แบบคงที่แบบชั่วคราวและแบบสวย

ในการตั้งค่าชื่อโฮสต์แบบคงที่ซึ่งฉันคิดว่าเป็นชื่อที่คุณต้องการ

hostnamectl --static set-hostname somehost.tld

คุณสามารถตั้งค่าทั้งหมดให้เหมือนกันได้

hostnamectl set-hostname somehost.tld

ถูกต้อง แต่ ... ฉันรู้ว่าฉันควรทำให้ชัดเจนว่าไฟล์หน่วยของฉันทำอะไร มันตั้งค่าในหมู่อื่น ๆ ชื่อโฮสต์คงที่และชั่วคราวโดยใช้ "hostnamectl"; ใช้งานได้ แต่ดูเหมือนว่า "การกำหนดค่าขนาดใหญ่" สำหรับสิ่งที่ฉันต้องการบรรลุ แก้ไขข้อความ ...
David Tonhofer

@DavidTonhofer: ฉันสับสน คำถามของคุณหายไป แต่ดูเหมือนว่าฉันจะตั้งชื่อโฮสต์ในระบบ F20 ของฉันได้อย่างไร บางทีถ้าคุณลบ verbiage ทั้งหมดและถามคำถามที่ตรงไปตรงมา ...
user9517

อืม ... คุณอาจมีประเด็น ฉันรู้วิธีตั้งค่าชื่อโฮสต์ แต่ฉันจะตั้งอย่างถูกต้องในอิมเมจ 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.