'hostname'은 내가 설정한 호스트 이름을 어디에 저장하나요?

'hostname'은 내가 설정한 호스트 이름을 어디에 저장하나요?

이것은 매우 수수께끼입니다. 이 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 시스템 호출을 실행하고 다음 정보를 반환한 것을 확인했습니다.

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

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

grep "server-name" -r /etc 

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

答え1

다음과 같은 관련 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/sys/kernel/hostname여기에도 호스트 이름이 노출되어 있습니다. 이는 가상 위치이지만 /proc호스트 이름에 액세스하는 대체 방법을 제공합니다. 시스템의 도메인 이름도 여기에 있지만 /proc/sys/kernel/domainname실제로는 NIS/YP 인증 시스템에만 사용됩니다.

노트:흥미롭게도 이 값은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.

答え2

hostname명령은 커널 메모리 외부 어디에도 이름을 저장하지 않습니다.

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

答え3

hostname(1)sethostname(3)기본적으로 커널이 저장될 것으로 예상하는 호스트 이름을 작성하는 시스템 호출에 대한 프런트 엔드입니다 .

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

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

答え4

다른 사람들이 이미 답변했듯이 런타임에는 메모리에 저장됩니다.

재부팅 후에도 유지하려면 Linux 배포판과 관련된 파일에 저장해야 합니다. 내 Fedora 20에서는 /etc/hostname입니다.

/etc에 저장되어 있을 가능성이 높습니다. 등에서 실제 호스트 이름을 검색해 보세요.

grep -r `hostname` /etc

関連情報