`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 问答,标题为: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 问答非常全面地涵盖了该主题,标题为:正确设置主机名 - Amazon EC2 上的 Fedora 20

答案2

hostname命令不会将名称存储在内核内存之外的任何地方。

系统在引导时如何决定其名称取决于系统的配置方式。选项范围包括从文件中读取名称,到在启动合适的网络接口后使用 DNS 或 /etc/hosts 设置名称。

答案3

hostname(1)只是系统调用的前端sethostname(3),它基本上将主机名写入内核期望存储的位置。

如果您希望更改是永久性的,根据一般的 Unix 哲学,您必须自己存储它。然而,精确的位置在很大程度上取决于您的初始化系统。例如,OpenBSD 的 init 从/etc/myname(during netstart) 读取主机名。

所有这些都应该在系统的联机帮助页或支持文档中进行描述。

答案4

在运行时,它存储在内存中,正如其他人已经回答的那样。

为了在重新启动后继续存在,它必须存储在某个地方的文件中,这是 Linux 发行版特有的。在我的 Fedora 20 上,它是 /etc/hostname

它很可能存储在 /etc 中。尝试在etc中搜索实际的主机名

grep -r `hostname` /etc

相关内容