이것은 매우 수수께끼입니다. 누구든지 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은이 정보를 어디에 저장합니까? 그냥 기억에?
답변
관련 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을 올바르게 설정 이라는 주제를 철저히 다룹니다 .
답변
이 hostname
명령은 이름을 커널 메모리 이외의 곳에 저장하지 않습니다.
시스템이 부팅시 이름을 결정하는 방법은 시스템 구성 방법에 따라 다릅니다. 옵션은 파일에서 이름을 읽는 것에서부터 DNS 또는 / etc / hosts를 사용하여 적절한 네트워크 인터페이스가 나타난 후 이름을 설정하는 것까지 다양합니다.
답변
hostname(1)
sethostname(3)
시스템 호출 의 프론트 엔드 이며 기본적으로 커널이 저장 될 것으로 예상되는 곳에 호스트 이름을 씁니다.
일반적인 유닉스 철학에 따라 변경 사항을 영구적으로 유지하려면 직접 저장해야합니다. 그러나 정확한 위치는 init 시스템에 따라 크게 다릅니다. 예를 들어, OpenBSD의 init는 /etc/myname
(동안 netstart
) 에서 호스트 이름을 읽습니다 .
이 모든 내용은 시스템 맨 페이지 또는 지원 문서에 설명되어 있어야합니다.
답변
오랜 시간 동안 * 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
답변
런타임에 이미 다른 사람들의 대답에 따라 메모리에 저장됩니다.
재부팅 후에도 살아남 으려면 리눅스 배포판에 따라 파일에 저장해야합니다. Fedora 20에서는 / etc / hostname입니다.
/ etc에 저장되어있을 가능성이 높습니다. 등에서 실제 호스트 이름을 검색하십시오
grep -r `hostname` /etc