`hostname`은 내가 설정 한 호스트 이름을 어디에 저장합니까?


15

이것은 매우 수수께끼입니다. 누구든지 hostname명령이 호스트 이름을 저장하고 읽는 위치를 알고 있습니까?

나는 그것이 / etc / hostname이라고 생각했지만 내가 사용하고있는이 Linux 시스템에는 그러한 파일이 없습니다. strace를 사용하여 위치를 찾으려고했지만이 정보를 반환하는 읽기 호출이 없습니다.

$ strace hostname 2>&1 | grep read
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340^\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\30\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248
read(3, "", 1024)                       = 0

그런 다음이 정보를 반환하는 uname syscall을 발견했습니다.

uname({sys="Linux", node="server-name", ...}) = 0

/ etc /의 재귀 grep은 아무것도 반환하지 않습니다.

grep "server-name" -r /etc 

uname은이 정보를 어디에 저장합니까? 그냥 기억에?


1
어떤 리눅스 배포판을 사용하고 있습니까?
amir jj

답변:


9

관련 U & L Q & A 제목을보십시오 : uname은 어디에서 정보를 얻습니까? . 호스트 이름과 같은 정보는 시스템이 실행되는 동안 Linux 커널 내의 데이터 구조 내에 유지됩니다. 시스템을 부팅하는 동안이 정보는 일반적으로 배포에 특정한 다양한 메커니즘을 통해 얻을 수 있습니다.

man 2 uname매뉴얼 페이지 를 보면 데이터 구조가 언급되어 있습니다.

           struct utsname {
               char sysname[];    /* Operating system name (e.g., "Linux") */
               char nodename[];   /* Name within "some implementation-defined
                                     network" */
               char release[];    /* Operating system release (e.g., "2.6.28") */
               char version[];    /* Operating system version */
               char machine[];    /* Hardware identifier */
           #ifdef _GNU_SOURCE
               char domainname[]; /* NIS or YP domain name */
           #endif
           };

해당 구조의 두 번째 요소 nodename[]는 호스트 이름이 Linux 커널 내에 저장되는 곳입니다.

/ proc

를 살펴보면 /proc/sys/kernel/hostname호스트 이름도 여기에 노출됩니다. 이것은 가상 위치 /proc이지만 호스트 이름에 액세스하기위한 대체 방법을 제공합니다. 시스템의 도메인 이름도 여기에 있습니다 /proc/sys/kernel/domainname.

참고 : 관심있는 값은 UTS 네임 스페이스에 따라 다릅니다 .

$ sudo hostname
oldhost
$ sudo unshare --uts /bin/bash
$ sudo echo newhost > /proc/sys/kernel/hostname 
$ hostname
newhost
$ exit
$ hostname
oldhost

호스트 이름 조작

Systemd가있는 시스템에서는 cli 도구 hostnamectl를 사용 하여 호스트 이름을 가져 오거나 설정할 수 있습니다 . 재부팅 할 때마다 영구적으로 변경됩니다.

$ sudo hostnamectl set-hostname --static somehostname

또한 sysctl다음을 통해 가치가 있음을 알 수 있습니다 .

$ sudo sysctl -a | grep kernel.hostname
kernel.hostname = myhostname

Fedora 릴리스의 경우 ask.fedoraproject.org Q & A는 Amazon EC2에서 호스트 이름 -Fedora 20을 올바르게 설정 이라는 주제를 철저히 다룹니다 .


1
Meh. hostnamectl은 단순히 시스템 호출을 호출합니다. syscall은 재부팅시 지속적으로 정보를 어떻게 저장합니까? 그것은 OP가 아니라면 내 질문입니다.
Otheus

6

hostname명령은 이름을 커널 메모리 이외의 곳에 저장하지 않습니다.

시스템이 부팅시 이름을 결정하는 방법은 시스템 구성 방법에 따라 다릅니다. 옵션은 파일에서 이름을 읽는 것에서부터 DNS 또는 / etc / hosts를 사용하여 적절한 네트워크 인터페이스가 나타난 후 이름을 설정하는 것까지 다양합니다.


2
절대 /etc/hosts(DNS 조회 용-호스트 이름을 읽는 시스템이 너무 잘못되었습니다) ...하지만 /etc/hostname(정식 이름이 포함되어 있음 ) 또는 거의 /etc/sysconfig/network( HOSTNAME=...쉘 명령 이 포함될 수 있음 ). 아마존의 EC2 인스턴스에 당신은 또한 modifiy 할 수도 /etc/cloud/cloud.cfg...
데이비드 Tonhofer

4

hostname(1)sethostname(3)시스템 호출 의 프론트 엔드 이며 기본적으로 커널이 저장 될 것으로 예상되는 곳에 호스트 이름을 씁니다.

일반적인 유닉스 철학에 따라 변경 사항을 영구적으로 유지하려면 직접 저장해야합니다. 그러나 정확한 위치는 init 시스템에 따라 크게 다릅니다. 예를 들어, OpenBSD의 init는 /etc/myname(동안 netstart) 에서 호스트 이름을 읽습니다 .

이 모든 내용은 시스템 맨 페이지 또는 지원 문서에 설명되어 있어야합니다.


2

오랜 시간 동안 * nix sysadmin으로서 직접적인 RTFM 참조없이 명백한 내용을 설명하겠습니다. :)

   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 fallback value 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).

이것은 대부분의 "linux"배포판에 적용됩니다.

--mem


1

런타임에 이미 다른 사람들의 대답에 따라 메모리에 저장됩니다.

재부팅 후에도 살아남 으려면 리눅스 배포판에 따라 파일에 저장해야합니다. Fedora 20에서는 / etc / hostname입니다.

/ etc에 저장되어있을 가능성이 높습니다. 등에서 실제 호스트 이름을 검색하십시오

grep -r `hostname` /etc

이 ask.fedoraproject.org Q에는 다음을 사용하여 F20에서 호스트 이름을 설정 / 취득 할 수있는 모든 방법이 있습니다 hostnamectl. ask.fedoraproject.org/en/question/37413/…
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.