`hostname` 在哪里存储我设置的主机名?

Pet*_*ins 15 linux 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
Run Code Online (Sandbox Code Playgroud)

然后我注意到它确实返回了此信息的 uname 系统调用:

uname({sys="Linux", node="server-name", ...}) = 0
Run Code Online (Sandbox Code Playgroud)

/etc/ 中的递归 grep 不返回任何内容:

grep "server-name" -r /etc 
Run Code Online (Sandbox Code Playgroud)

uname 在哪里存储这些信息?只是在记忆中?

slm*_*slm 9

看看这个相关的 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
           };
Run Code Online (Sandbox Code Playgroud)

该结构的第二个元素nodename[]是在 Linux 内核中存储主机名的地方。

/进程

如果您查看/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
Run Code Online (Sandbox Code Playgroud)

操纵主机名

在带有 Systemd 的系统上,您可以使用 cli 工具hostnamectl来获取/设置主机名。这将在重新启动之间永久更改它。

$ sudo hostnamectl set-hostname --static somehostname
Run Code Online (Sandbox Code Playgroud)

您还可以通过sysctl以下方式了解它的价值:

$ sudo sysctl -a | grep kernel.hostname
kernel.hostname = myhostname
Run Code Online (Sandbox Code Playgroud)

对于 Fedora 版本,此 ask.fedoraproject.org 问答非常彻底地涵盖了该主题,标题为:正确设置主机名 - Amazon EC2 上的 Fedora 20

  • 嗯。hostnamectl 只是调用系统调用。系统调用如何存储信息以使其在重新启动后保持不变?这就是我的问题,如果不是OP的话。 (2认同)

Kyl*_*nes 6

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

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

  • 从不使用 `/etc/hosts`(用于 DNS 查找 - 从那里读取其主机名的系统是错误的)......但可能使用 `/etc/hostname`(包含完全限定名称)或很少使用 `/etc /sysconfig/network`(可能包含一个 `HOSTNAME=...` shell 命令)。在亚马逊 EC2 实例上,您可能还需要修改 `/etc/cloud/cloud.cfg` ... (2认同)