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


15

这很令人困惑。有人知道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在哪里存储此信息?只是在记忆中?


1
您正在使用什么Linux发行版?
2014年

Answers:


9

看一下标题为:Uname从何处获取其信息的相关U&L问答。当系统运行时,诸如主机名之类的信息将保留在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问题与解答非常全面地涵盖了以下主题:标题:在Amazon EC2上正确设置主机名 -Fedora 20


1
嗯 hostnamectl只是调用系统调用。syscall如何存储信息,以便在重新启动后保持不变?这就是我的问题,如果不是OP也是如此。
奥修斯

6

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

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


2
从不/etc/hosts(用于DNS查找-从那里读取其主机名的系统错了),但是可能/etc/hostname(包含标准名称)或很少/etc/sysconfig/network(可能包含HOSTNAME=...shell命令)。在亚马逊EC2实例上,您可能还需要修改/etc/cloud/cloud.cfg...
David Tonhofer 2014年

4

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

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

所有这些都应在系统的手册页或支持文档中进行描述。


2

作为很长时间的* 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


1

在运行时,它已经存储在内存中,其他人已经在这里回答了。

为了避免重启,它必须存储在特定于Linux发行版的文件中。在我的Fedora 20上是/ etc / hostname

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

grep -r `hostname` /etc

这ask.fedoraproject.org Q具有可设置/使用获得F20的主机名的所有方法hostnamectl等:ask.fedoraproject.org/en/question/37413/...
SLM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.