ตรงข้ามกับการแก้ไข / etc / hostname หรือที่ไหนก็ตามที่เกี่ยวข้อง?
จะต้องมีเหตุผลที่ดี (ฉันหวังว่า) - โดยทั่วไปฉันชอบวิธี "เก่า" มากซึ่งทุกอย่างเป็นไฟล์ข้อความ ฉันไม่ได้พยายามโต้เถียง - ฉันอยากรู้และตัดสินใจด้วยตัวเองถ้ามันเป็นเหตุผลที่ดี ขอบคุณ
ตรงข้ามกับการแก้ไข / etc / hostname หรือที่ไหนก็ตามที่เกี่ยวข้อง?
จะต้องมีเหตุผลที่ดี (ฉันหวังว่า) - โดยทั่วไปฉันชอบวิธี "เก่า" มากซึ่งทุกอย่างเป็นไฟล์ข้อความ ฉันไม่ได้พยายามโต้เถียง - ฉันอยากรู้และตัดสินใจด้วยตัวเองถ้ามันเป็นเหตุผลที่ดี ขอบคุณ
คำตอบ:
hostnamectl เป็นส่วนหนึ่งของ systemd และจัดเตรียม API ที่เหมาะสมสำหรับจัดการกับการตั้งชื่อโฮสต์ของเซิร์ฟเวอร์ในแบบมาตรฐาน
$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64
ก่อนหน้านี้แต่ละ distro ที่ไม่ได้ใช้ systemd มีวิธีการของตนเองในการทำสิ่งนี้ซึ่งทำให้มีความซับซ้อนที่ไม่จำเป็นจำนวนมาก
DESCRIPTION hostnamectl may be used to query and change the system hostname and related settings. This tool distinguishes three different hostnames: the high-level "pretty" hostname which might include all kinds of special characters (e.g. "Lennart's Laptop"), the static hostname which is used to initialize the kernel hostname at boot (e.g. "lennarts-laptop"), and the transient hostname which is a default received from network configuration. If a static hostname is set, and is valid (something other than localhost), then the transient hostname is not used. Note that the pretty hostname has little restrictions on the characters used, while the static and transient hostnames are limited to the usually accepted characters of Internet domain names. The static hostname is stored in /etc/hostname, see hostname(5) for more information. The pretty hostname, chassis type, and icon name are stored in /etc/machine-info, see machine-info(5). Use systemd-firstboot(1) to initialize the system host name for mounted (but not booted) system images.
hostnamectl ดึงข้อมูลที่แตกต่างกันจำนวนมากเข้าด้วยกันในที่เดียวเพื่อบู๊ต:
$ hostnamectl
Static hostname: centos7
Icon name: computer-vm
Chassis: vm
Machine ID: 1ec1e304541e429e8876ba9b8942a14a
Boot ID: 37c39a452464482da8d261f0ee46dfa5
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-693.21.1.el7.x86_64
Architecture: x86-64
ข้อมูลที่นี่มาจาก/etc/*release, uname -aฯลฯ รวมทั้งชื่อโฮสต์ของเซิร์ฟเวอร์
อนึ่งทุกอย่างยังคงอยู่ในไฟล์hostnamectlเป็นเพียงการลดความซับซ้อนของวิธีการที่เราต้องโต้ตอบกับไฟล์เหล่านี้หรือรู้ทุกตำแหน่ง
เพื่อเป็นการพิสูจน์สิ่งนี้คุณสามารถใช้strace -s 2000 hostnamectlและดูว่าไฟล์ใดที่ดึงมาจาก:
$ strace -s 2000 hostnamectl |& grep ^open | tail -5
open("/lib64/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/proc/self/stat", O_RDONLY|O_CLOEXEC) = 3
open("/etc/machine-id", O_RDONLY|O_NOCTTY|O_CLOEXEC) = 4
open("/proc/sys/kernel/random/boot_id", O_RDONLY|O_NOCTTY|O_CLOEXEC) = 4
สำหรับผู้สังเกตการณ์ที่ชาญฉลาดคุณควรสังเกตในข้างต้นstraceว่ามีไฟล์ทั้งหมดที่ไม่ปรากฎ hostnamectlเป็นจริงปฏิสัมพันธ์กับบริการsystemd-hostnamectl.serviceซึ่งในความเป็นจริงไม่ "ปฏิสัมพันธ์" /etc/hostnameกับที่สุดของไฟล์ที่ผู้ดูแลระบบส่วนใหญ่จะคุ้นเคยกับเช่น
ดังนั้นเมื่อคุณเรียกใช้hostnamectlคุณจะได้รับรายละเอียดจากบริการ นี่คือบริการตามคำสั่งดังนั้นคุณจะไม่เห็นว่าทำงานอยู่ตลอดเวลาหรือไม่ เมื่อhostnamectlทำงานเท่านั้น คุณสามารถดูได้หากคุณเรียกใช้watchคำสั่งแล้วเริ่มทำงานhostnamectlหลายครั้ง:
$ watch "ps -eaf|grep [h]ostname"
root 3162 1 0 10:35 ? 00:00:00 /usr/lib/systemd/systemd-hostnamed
แหล่งที่มาของมันอยู่ที่นี่: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.cและหากคุณมองผ่านคุณจะเห็นการอ้างอิงถึง/etc/hostnameฯลฯ
-e open,openat?
strace8-) แม้ว่าจะเป็นความจริงฉันก็ยังต้องการgrepให้ได้ผลลัพธ์ตามที่ฉันต้องการแสดงมัน b / c straceจะยังคงแสดงเอาท์พุทของhostnamectlcmd ดังนั้นทางของฉันจึงสั้นลง
rpm -qf $(type -P hostnamectl)ฉันต้องจำไว้!
มันยังคงเป็นไฟล์ข้อความคุณยังสามารถแก้ไขได้และจะไม่มีปัญหา
ไฟล์ข้อความได้มาตรฐาน/etc/hostnameแล้ว
ตามผู้ดูแลระบบบริการ systemd-hostname, systemd-timedated และอื่น ๆ ได้รับการออกแบบอย่างมากสำหรับ GUI ที่มีอยู่เช่น GNOME systemd-hostnamed อนุญาตให้ GUI ร้องขอการเปลี่ยนแปลงชื่อโฮสต์โดยไม่ต้องทำงานเป็นรูท (ขึ้นอยู่กับนโยบาย polkit) Dbus ยังมีวิธีในการสมัครรับการเปลี่ยนแปลงซึ่งเหมาะกับความต้องการของ GUI อาจถูกใช้งานโดยหนึ่งแอพในกรณีเหล่านี้ :) ฉันไม่รู้, นาฬิกาอาจใช้ systemd-timedated เพื่อฟังการตั้งค่าเขตเวลาใหม่?
คิดว่า hostnamectl เป็น stub เพื่อฝึกซ้อม backend GUI ซึ่งอาจจะใช่หรือไม่ใช่อรรถประโยชน์ CLI ที่มีประโยชน์ systemd-hostnamed ไม่ได้มีวัตถุประสงค์เพื่อเพิ่มฟีเจอร์ทั้งหมดที่ไม่ได้ใช้งานโดยรหัส GUI
บริการ systemd-hostnamed ไม่ได้มีจุดประสงค์เพื่อให้นามธรรมเหนือความแตกต่างระหว่างการแจกแจง Upstream systemd สร้างมาตรฐานบนไฟล์กำหนดค่าเดียว/etc/hostnameซึ่งก่อนหน้านี้มีไฟล์กำหนดค่าที่แตกต่างกันเช่น Debian vs Redhat based distributions
สิ่งนี้ถือว่า hostnamectl กำลังพูดถึงการนำมาตรฐานไปปฏิบัติของ systemd-hostnamed แต่ AFAIK ไม่มีการกระจายในปัจจุบันที่ปะแก้ชื่อไฟล์ที่ใช้
ฉันต้องการชี้ให้เห็นว่าการโหลด/etc/hostnameณ เวลาบูตจะดำเนินการก่อนโดย systemd PID 1 มันไม่ได้ขึ้นอยู่กับการเรียกใช้ systemd-hostnamed
ฉันคิดว่าคุณอาจสังเกตเห็นความแตกต่างที่ไม่เป็นอันตรายหากคุณเปิด GUI การตั้งค่าระบบและแสดงชื่อโฮสต์พร้อมกัน หากคุณแก้ไข/etc/hostnameแล้วใช้hostname --file /etc/hostnameเพื่อนำการเปลี่ยนแปลงไปใช้กับระบบที่ใช้งานอยู่หน้าจอ GUI อาจไม่อัปเดตทันที systemd-hostnamed จัดเตรียมการแจ้งเตือน dbus เกี่ยวกับการเปลี่ยนแปลงชื่อโฮสต์ทั้งหมดที่ดูแลดังนั้น GUI อาจไม่สนใจฟังการแจ้งเตือนชื่อโฮสต์ของระบบที่มีให้ในเคอร์เนล Linux ที่ทันสมัย
(ตามเนื้อผ้ามันเป็นความคิดที่ดีที่จะทำการเปลี่ยนชื่อโฮสต์ที่รันไทม์สิ่ง อาจทำให้เกิดปัญหากับซอฟต์แวร์เช่น Xฉันมั่นใจว่าปัญหานี้ไม่ได้รับการแก้ไขโดย systemdบางทีมันอาจได้รับการแก้ไขโดยการกระจายที่ใช้ systemd) .