Mengatur hostname dengan benar - Fedora 20 di Amazon EC2


11

Konteks

Saya memiliki gambar cloud Fedora 20 yang berjalan di Amazon EC2 (selanjutnya disebut "instance"). Dan saya memiliki beberapa ketidakpastian tentang pengaturan nama hostnya.

Tujuan

Dalam hal ini, katakanlah saya ingin mengatur nama host instance ke penpen.homelinux.org . (Nama ini juga akan terdaftar di DynDNS menggunakan ddclient, tetapi itu adalah aspek lain yang kami tidak tertarik di sini.)

Hostname tentu saja dapat diatur secara manual setelah boot selesai (menggunakan hostnamectlantara lain). Tetapi kami ingin memiliki set nama host yang benar sebelum login pertama.

Secara tradisional, untuk secara konsisten mengkonfigurasi nama host, orang akan mengubah konten /etc/hostname. Sayangnya ini tidak berfungsi di sini.

Perilaku sistem default

Secara default, instance menetapkan nama hostnya ke nama EC2 internal. Setelah boot, kita dapat melihat semua tempat kecil yang menghasilkan nama host, dan kami menemukan:

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

Jadi mari kita coba menulis ke / etc / hostname ...

Jika seseorang menulis nama host yang diinginkan /etc/hostname, perubahan ini hilang lagi pada boot berikutnya. Mari kita periksa proses boot, yang dilakukan oleh systemd.

Contoh dijalankan

Menulis rorororoor.homelinux.orguntuk /etc/hostname, lalu reboot.

Menggunakan journald kami temukan (Perhatikan bahwa baris log tidak sepenuhnya dipesan berdasarkan waktu):

Proses boot dimulai dengan nama host sebagai localhost kemudian beralih root, pada titik mana nama host menjadi 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.

Kita melihat bahwa systemdset nama host ke rorororoor.homelinux.org , terbukti berhasil saat kolom host log berubah. Beberapa kesalahan dikeluarkan, mungkin karena hostnamectltidak dapat menghubungi DBus pada saat ini.

Saya tidak yakin siapa yang melakukan namesetting di sini; beberapa bagian internal systemd? Bagaimanapun, melanjutkan melalui jurnal, kami menemukan bahwa nama host diatur kembali ke nama internal EC2 segera:

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)

Pengaturan hostname di sini dilakukan melalui unit "systemd-hostnamed". "File unit" untuk "systemd-hostnamed" adalah /usr/lib/systemd/system/systemd-hostnamed.servicedan berisi:

[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

Program yang dipanggil oleh di atas /usr/lib/systemd/systemd-hostnamedsebenarnya adalah biner (MENGAPA!). Namun kode sumber dapat ditemukan.

Intinya adalah kita kembali ke ip-10-164-65-105.ec2.internal

APA YANG DILAKUKAN?

Jawaban:


11

Anda perlu melakukan dua hal (tetapi hanya melakukan salah satunya):

  1. Tetapkan nama host di /etc/hostname.
  2. Edit /etc/cloud/cloud.cfgdan set preserve_hostnameke True. (Anda juga dapat meneruskan opsi ini dengan data pengguna Anda.)

Langkah kedua diperlukan karena Fedora menggunakan cloud-inituntuk membawa data pengguna dari lingkungan EC2 untuk menyediakan instance, dan cloud-initperlu diberi tahu bahwa nama host harus tetap ada.


BAIKLAH. Saya akan segera mencobanya.
David Tonhofer

1
Tunggu sebentar, apa ini? Oke, YAML ( en.wikipedia.org/wiki/YAML ). Jadi menurut scalehorizontally.com/2013/02/24/introduction-to-cloud-init saya menambahkan "preserve_hostname: true" di tingkat atas. ... Ya berhasil.
David Tonhofer

Ya, itu hanya YAML tua biasa.
Michael Hampton

Semua itu coba-coba. Oh well, saya belajar cukup banyak. Terima kasih.
David Tonhofer

Terima kasih, ini berfungsi pada CentOS 7.3 - tanpa langkah kedua, nama host ditimpa oleh cloud-init saat reboot. Untuk langkah pertama, saya menggunakan sudo hostnamectl set-hostname --static myhost.example.com, yang menulis /etc/hostnamejuga.
RichVel

2

Pilihan lain adalah mengatur nama host melalui data pengguna

misalnya

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

Ini akan mengatur nama host saat boot, namun saya tidak yakin apakah itu akan selalu terjadi sebelum login pertama.


1

Sepertinya jawabannya ada di halaman hostnamectl sekarang ada 3 nama host, nama host statis, sementara dan cantik.

Untuk mengatur nama host statis yang menurut saya adalah yang Anda inginkan,

hostnamectl --static set-hostname somehost.tld

Anda dapat mengatur semuanya agar sama dengan

hostnamectl set-hostname somehost.tld

Benar, tapi ... Saya sadar saya seharusnya menjelaskan apa yang dilakukan file unit saya; itu menetapkan antara lain, nama host statis dan sementara menggunakan "hostnamectl"; ini berfungsi tetapi tampaknya "konfigurasi besar-besaran" untuk apa yang ingin saya capai. Memperbaiki teks ...
David Tonhofer

@ DavidTonhofer: Saya bingung. Ada kata-kata yang hilang dalam pertanyaan Anda, tetapi tampaknya memengaruhi bagaimana cara menetapkan nama host pada sistem F20 saya. Mungkin jika Anda menghapus semua kata-kata dan hanya mengajukan pertanyaan langsung ...
user9517

Hmmm ... Anda mungkin ada benarnya. baik, saya tahu cara mengatur nama host. Tapi bagaimana cara mengaturnya dengan benar pada gambar Amazon EC2 saat boot?
David Tonhofer

1

Memecahkan menggunakan file unit tambahan

Berikut ini tidak benar-benar berfungsi:

Buat file unit sistem /usr/lib/systemd/system/penpen-naming.serviceuntuk memulai setelah systemd-hostnamed.service(dan mungkin hanya setelah dbus.service).

(Saya harus melakukan beberapa percobaan diam-diam untuk menemukan "tempat yang tepat" sehingga systemdtidak mudah menonaktifkan unit baru karena "sebuah siklus terdeteksi". Perhatikan bahwa Anda dapat membuat grafik ketergantungan file unit dengan systemd-analyze dot, yang menciptakan "titik" "File untuk diteruskan ke program" graphviz " dot, tetapi hasilnya hanya grafik yang membingungkan, kecuali Anda memfilternya)

Isi file unit /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

Aktifkan itu menggunakan systemctl enable penpen-naming

Apa yang /usr/local/toolbox/setting_hostnames/penpenharus dilakukan Jika menulis ke penpen.homelinux.org/etc/hostname . Tapi itu sebenarnya tidak cukup, kita juga harus mengatur nama host menggunakan hostnamectl.

Bahkan kemudian, unit harus dijalankan sangat terlambat (After=default.target)sehingga shell login masih menampilkan nama host internal EC2. Dan masih ada masalah menghubungkan ke DBus.

Jadi ini bukan solusi yang baik, atau setidaknya perlu perbaikan untuk "posisi di pohon dependensi file unit" dan "apa-apaan dengan dbus"

Nama host setelah ini adalah:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.