这是相当令人费解的。有谁知道该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