hostnamectl 명령의 요점은 무엇입니까?


17

/ etc / hostname을 편집하는 것과는 반대로 또는 관련성이 높은 곳은 어디입니까?

좋은 이유가있을 것입니다. 저는 일반적으로 모든 것이 텍스트 파일 인 "오래된"방식을 선호합니다. 나는 논쟁 적이 되려고 노력하지 않고있다. 나는 정말로 알고 싶다. 그리고 그것이 정당한 이유인지 스스로 결정하고 싶다. 감사.


2
당신은 가장 확실하게 혼자가 아닙니다 --- Systemd는 많은 새로운 인터페이스를 도입했으며 그 때문에 "모든 것이 텍스트 파일이었던 오래된 방식"을 선호하는 사람들로부터 많은 단점을 얻었습니다.
Federico Poloni

1
@FedericoPoloni 또는 DNS 쿼리와 같은 모든 것이 텍스트 파일이 아닌 곳에서 아무 이유없이 XML로 변환됩니다.
chrylis

DNS-> xml. 죄송합니다. 예를 들어야합니다. IMO XML은 BTW 사탄의 발명입니다.
Graham Nicholls

답변:


22

배경

hostnamectl systemd의 일부이며 표준화 된 방식으로 서버의 호스트 이름 설정을 처리하기위한 적절한 API를 제공합니다.

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

이전에는 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출력을 보여주고 싶었던 방식으로 출력을 얻는 데 여전히 필요 strace했을 것 hostnamectl입니다.
slm

"... 표준화 된 방식으로 서버의 호스트 이름 설정을 처리하기위한 적절한 API를 제공합니다." 다시 말해, 그들은 표준을 하나 더 추가했습니다. :-) 또한 처음부터 프로젝트에는 최소한 6 개의 포크가 있으며 이는 아마도 6 가지 이상의 추가 "표준"을 의미합니다.
UncaAlby

나는 그 편리한 숙어를 위해 +1을주고 있습니다. rpm -qf $(type -P hostnamectl)나는 그 것을 기억해야합니다!
Mark Borgerding 19

1

여전히 텍스트 파일이므로 편집 할 수 있으며 문제가 없습니다.

텍스트 파일이로 표준화되었습니다 /etc/hostname.


관리자에 따르면 systemd-hostname, systemd-timedated 등의 서비스는 그놈과 같은 기존 GUI를 위해 매우 많이 설계되었습니다. systemd-hostnamed는 (polkit 정책에 따라) 루트로 실행하지 않고 GUI가 호스트 이름 변경을 요청할 수있게합니다. Dbus는 GUI 요구에 적합한 변경 사항을 구독하는 방법도 제공합니다. 이 경우 총 하나의 앱에서 사용될 수 있습니다 :). 어쩌면 시계가 systemd-timedated를 사용하여 시간대 재구성을 수신합니까?

hostnamectl을 GUI 백엔드를 실행하는 스텁으로 생각하면 유용한 CLI 유틸리티 일 수도 있고 아닐 수도 있습니다. systemd-hostnamed는 GUI 코드로 실행되지 않는 모든 기능을 추가하도록 특별히 고안되지 않았습니다.


systemd-hostnamed 서비스는 배포판 간의 차이점을 추상화하기위한 것이 아닙니다 . 업스트림 시스템은 단일 구성 파일로 표준화되었으며, /etc/hostname이전에는 데비안과 Redhat 기반 배포판에 서로 다른 구성 파일이있었습니다.

이것은 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.