这很令人费解。有谁知道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 在哪里存储这些信息?只是在记忆中?
看看这个相关的 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。
该hostname命令不会将名称存储在内核内存之外的任何地方。
系统在引导时如何决定其名称取决于系统的配置方式。选项范围从从文件中读取名称,到在启动合适的网络接口后使用 DNS 或 /etc/hosts 设置名称。
| 归档时间: |
|
| 查看次数: |
25337 次 |
| 最近记录: |