Điểm của lệnh hostnamectl là gì?


17

Trái ngược với chỉnh sửa / etc / hostname, hoặc bất cứ nơi nào có liên quan?

Phải có một lý do chính đáng (tôi hy vọng) - nói chung tôi rất thích cách "cũ", trong đó mọi thứ đều là một tệp văn bản. Tôi không cố gắng để gây tranh cãi - tôi thực sự muốn biết và tự quyết định xem đó có phải là lý do chính đáng không. Cảm ơn.


2
Bạn chắc chắn không đơn độc --- Systemd đã giới thiệu rất nhiều giao diện mới và do đó, nó nhận được rất nhiều lời khen ngợi từ những người thích "cách cũ, nơi mọi thứ đều là một tệp văn bản".
Federico Poloni

1
@FedericoPoloni Hoặc không phải mọi thứ đều là tệp văn bản, như các truy vấn DNS được chuyển đổi thành XML mà không có lý do.
chrylis -on đình công-

DNS-> xml. Xin lỗi, bạn sẽ phải đưa ra một ví dụ, làm ơn. IMO XML là phát minh của satan, BTW.
Graham Nicholls

Câu trả lời:


22

Lý lịch

hostnamectl là một phần của systemd và cung cấp API thích hợp để xử lý cài đặt tên máy chủ của máy chủ theo cách được tiêu chuẩn hóa.

$ rpm -qf $(type -P hostnamectl)
systemd-219-57.el7.x86_64

Trước đây, mỗi bản phân phối không sử dụng systemd, có các phương thức riêng để thực hiện điều này gây ra nhiều phức tạp không cần thiết.

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 cũng kéo rất nhiều dữ liệu khác nhau vào một vị trí để khởi động:

$ 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

Thông báo thông tin ở đây là đến từ /etc/*release, uname -avv bao gồm tên máy của máy chủ.

Những gì về các tập tin?

Ngẫu nhiên, mọi thứ vẫn nằm trong các tệp, hostnamectlchỉ đơn giản là cách chúng ta phải tương tác với các tệp này hoặc biết mọi vị trí của chúng.

Để chứng minh điều này, bạn có thể sử dụng strace -s 2000 hostnamectlvà xem những tập tin nào được lấy từ:

$ 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?

Đối với người quan sát sắc sảo, bạn nên chú ý ở trên stracerằng không phải tất cả các tệp đều có mặt. hostnamectlthực sự đang tương tác với một dịch vụ, systemd-hostnamectl.servicetrong thực tế, việc "tương tác" với hầu hết các tệp mà hầu hết các quản trị viên đều quen thuộc, chẳng hạn như /etc/hostname.

Do đó, khi bạn chạy, hostnamectlbạn sẽ nhận được thông tin chi tiết từ dịch vụ. Đây là một dịch vụ tốt, vì vậy bạn sẽ không thấy nếu chạy mọi lúc. Chỉ khi hostnamectlchạy. Bạn có thể thấy nó nếu bạn chạy một watchlệnh, và sau đó bắt đầu chạy hostnamectlnhiều lần:

$ watch "ps -eaf|grep [h]ostname"
root      3162     1  0 10:35 ?        00:00:00 /usr/lib/systemd/systemd-hostnamed

Nguồn cho nó ở đây: https://github.com/systemd/systemd/blob/master/src/hostname/hostnamed.c và nếu bạn xem qua nó, bạn sẽ thấy các tài liệu tham khảo về/etc/hostname v.v.

Người giới thiệu


Xem unix.stackexchange.com/a/454785/5132 để biết một ví dụ về việc đọc (các) tệp trực tiếp.
JdeBP

Có một lý do để grep đầu ra thay vì sử dụng -e open,openat?
ydaetskcoR

@ydaetskcoR - không có lý do kỹ thuật, đã lười biếng và không tìm kiếm các công tắc đến strace8-). Mặc dù thành thật mà nói, tôi vẫn cần grepcó đầu ra theo cách tôi muốn hiển thị, nhưng chúng stracevẫn hiển thị đầu ra của hostnamectlcmd, vì vậy cách của tôi ngắn hơn.
slm

"... cung cấp API thích hợp để xử lý cài đặt tên máy chủ của máy chủ theo cách được tiêu chuẩn hóa." Nói cách khác, họ đã thêm một tiêu chuẩn nữa. :-) Người ta cũng có thể lưu ý rằng kể từ khi thành lập, có ít nhất nửa tá dĩa từ dự án, điều này có nghĩa là có thêm nửa tá "tiêu chuẩn" bổ sung.
UncaAlby

Tôi đang cho bạn +1 chỉ vì thành ngữ tiện dụng rpm -qf $(type -P hostnamectl)mà tôi phải nhớ từ đó!
Đánh dấu

1

Nó vẫn là một tệp văn bản, bạn vẫn có thể chỉnh sửa nó và sẽ không có vấn đề gì.

Các tập tin văn bản đã được chuẩn hóa để /etc/hostname.


Theo nhà bảo trì, các dịch vụ tên máy chủ hệ thống, thời gian hệ thống, v.v ... được thiết kế rất nhiều cho (các) GUI hiện có như Gnome. tên máy chủ hệ thống cho phép thay đổi tên máy chủ yêu cầu GUI mà không cần chạy bằng root (tùy thuộc vào chính sách của bộ công cụ). Dbus cũng cung cấp một phương thức để đăng ký thay đổi, phù hợp với nhu cầu GUI. Có thể được sử dụng bởi tổng cộng một ứng dụng trong những trường hợp này :). Tôi không biết, có lẽ đồng hồ sử dụng hệ thống hẹn giờ để lắng nghe cấu hình lại múi giờ?

Hãy nghĩ về hostnamectl như một sơ khai để thực hiện phụ trợ GUI, có thể hoặc không phải là một tiện ích CLI hữu ích. systemd-hostnamed đặc biệt không nhằm mục đích thêm toàn bộ các tính năng không được thực thi bởi mã GUI.


Dịch vụ được đặt tên theo hệ thống không nhằm mục đích trừu tượng hóa sự khác biệt giữa các bản phân phối. Hệ thống ngược dòng được chuẩn hóa trên một tệp cấu hình duy nhất,/etc/hostname , trong đó có các tệp cấu hình khác nhau trước đây trên các bản phân phối dựa trên Debian vs Redhat.

Điều này giả định hostnamectl đang nói đến việc triển khai tiêu chuẩn của systemd-hostnamed. Nhưng AFAIK không có bản phân phối hiện tại nào vá tên tệp được sử dụng.

Tôi muốn chỉ ra rằng việc tải /etc/hostnamevào lúc khởi động được thực hiện sớm bởi systemd PID 1. Nó không phụ thuộc vào việc chạy systemd-hostnamed.


Tôi tưởng tượng bạn có thể nhận thấy một sự khác biệt vô hại, nếu bạn có GUI cài đặt hệ thống mở và hiển thị tên máy chủ cùng một lúc. Nếu bạn chỉnh sửa /etc/hostnamevà sau đó sử dụnghostname --file /etc/hostname để áp dụng thay đổi cho hệ thống đang chạy, màn hình GUI có thể không cập nhật ngay lập tức. systemd-hostnamed cung cấp các thông báo dbus về các thay đổi đối với tất cả các phiên bản của tên máy chủ mà nó duy trì, do đó GUI có thể không bận tâm lắng nghe các thông báo tên máy chủ hệ thống được cung cấp trên các nhân Linux hiện đại.

(Theo truyền thống, việc thay đổi tên máy chủ trong thời gian chạy là một ý tưởng tồi. Nó có thể gây ra sự cố với phần mềm như X. Tôi tin rằng vấn đề này không được xử lý bởi systemd . Có lẽ nó đã được giải quyết bằng các bản phân phối sử dụng systemd) .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.