จุดประสงค์ของคำสั่ง hostnamectl คืออะไร?


17

ตรงข้ามกับการแก้ไข / etc / hostname หรือที่ไหนก็ตามที่เกี่ยวข้อง?

จะต้องมีเหตุผลที่ดี (ฉันหวังว่า) - โดยทั่วไปฉันชอบวิธี "เก่า" มากซึ่งทุกอย่างเป็นไฟล์ข้อความ ฉันไม่ได้พยายามโต้เถียง - ฉันอยากรู้และตัดสินใจด้วยตัวเองถ้ามันเป็นเหตุผลที่ดี ขอบคุณ


2
คุณไม่ได้อยู่คนเดียว --- Systemd เปิดตัวอินเทอร์เฟซใหม่จำนวนมากและเนื่องจากมันได้รับความเสียหายจากคนที่ชอบ "วิธีเก่าที่ทุกอย่างเป็นไฟล์ข้อความ"
Federico Poloni

1
@FedericoPoloni หรือที่ไม่ใช่ทุกอย่างเป็นไฟล์ข้อความเช่นการสืบค้น DNS ที่ถูกแปลงเป็น XML โดยไม่มีเหตุผล
chrylis -on strike-

DNS-> xml ขออภัยคุณจะต้องมากับตัวอย่างกรุณา IMO XML เป็นสิ่งประดิษฐ์ของซาตาน BTW
เกรแฮม Nicholls

คำตอบ:


22

พื้นหลัง

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

systemd-hostname.service?

สำหรับผู้สังเกตการณ์ที่ชาญฉลาดคุณควรสังเกตในข้างต้น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ฯลฯ

อ้างอิง


ดูunix.stackexchange.com/a/454785/5132สำหรับตัวอย่างหนึ่งของการอ่านไฟล์โดยตรง
JdeBP

มีเหตุผลที่จะ grep ผลลัพธ์แทนที่จะใช้-e open,openat?
ydaetskcoR

@ydaetskcoR - ไม่มีเหตุผลทางเทคนิคเป็นคนขี้เกียจและไม่ได้ค้นหาสวิตช์ถึงstrace8-) แม้ว่าจะเป็นความจริงฉันก็ยังต้องการgrepให้ได้ผลลัพธ์ตามที่ฉันต้องการแสดงมัน b / c straceจะยังคงแสดงเอาท์พุทของhostnamectlcmd ดังนั้นทางของฉันจึงสั้นลง
slm

"... แสดง API ที่เหมาะสมสำหรับจัดการกับการตั้งชื่อโฮสต์ของเซิร์ฟเวอร์ในแบบมาตรฐาน" กล่าวอีกนัยหนึ่งพวกเขาเพิ่มมาตรฐานอีกหนึ่งมาตรฐาน :-) หนึ่งอาจทราบว่าตั้งแต่เริ่มก่อตั้งมีอย่างน้อยครึ่งโหลส้อมจากโครงการซึ่งอาจหมายถึง "มาตรฐาน" อีกครึ่งโหลเพิ่มเติม
UncaAlby

ฉันจะให้ +1 กับคุณสำหรับสำนวนที่มีประโยชน์นั้นrpm -qf $(type -P hostnamectl)ฉันต้องจำไว้!
Mark Borgerding

1

มันยังคงเป็นไฟล์ข้อความคุณยังสามารถแก้ไขได้และจะไม่มีปัญหา

ไฟล์ข้อความได้มาตรฐาน/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) .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.