在/etc/hostname中,是否应该使用FQDN而不是主机名?

根据man页面的说明,建议将主机名(不包含域名)放在/etc/hostname文件中。 例如,使用"host"而不是"host.domainsub.domaintld."。 但是,我知道有些软件依赖于在/etc/hostname中具有FQDN。
在Debian/Ubuntu机器上,应该在/etc/hostname中指定什么?
如果不是FQDN,在哪里应该指定FQDN?
我知道这个问题有点老了,但是没有找到明确的答案。有些人说主机名,有些人说FQDN。谢谢。

1你在哪里找到人们说你把FQDN放在/etc/hostname文件中?那个文件只用于系统的主机名。 - Terrance
在互联网上阅读有关此事的材料时,遇到了某个地方。 那么,在哪里应该指定自己的FQDN? - anon
@Terrance,其实我想从这个领域的经验丰富的人那里得到答案,这样他们就能从一开始就展示如何“正确”地做。请写成回答形式。那么在没有/etc/hostname的发行版中该怎么办呢? - anon
3个回答

修订后的答案:

主机本身不处理实际的完全限定域名(FQDN)。这是由DNS处理的。FQDN(完全限定域名)由DNS将名称转换为IP地址来处理。使用/etc/hosts文件,您实际上是覆盖了DNS服务器。计算机首先查看/etc/hosts文件,以查看是否为主机名定义了条目与IP地址的对应关系。在/etc/hosts中的条目如下所示:

127.0.0.1 localhost
127.0.1.1 terrance-ubuntu.lan terrance-ubuntu

这些条目与发行版无关。所有操作系统都使用相同的格式来处理这些行。只是hosts文件的位置不同。在Linux中,它通常位于/etc/文件夹中,在Windows中它通常位于C:\Windows\System32\drivers\etc\文件夹中。

将这行代码分解开来,你可以看到我同时将terrance-ubuntu.lanterrance-ubuntu赋值给了自己的FQDN(完全限定域名),以覆盖DNS设置,这样应用程序就知道不要离开我的计算机。同时,terrance-ubuntu是主机名,同样也是为了让应用程序知道不要离开我的计算机或者127.0.0.1(localhost)。将我的系统主机名设为127.0.1.1对其他计算机在网络上找到我的主机没有影响。如果DNS正常工作,它们将会将我的主机名视为10.0.0.100。使用127.0.1.1的原因是为了让我的应用程序更快地找到我的系统,因为它会知道我的系统并不在网络的其他地方。我的实际主机名带有.lan,这个.lan实际上是我通过路由器设置的域名,路由器也是我网络中的另一个DNS服务器。

现在,假设本地网络上的DNS服务没有为IP地址分配主机名或完全限定域名(FQDN),但是您知道本地网络上主机的IP地址。那么,您可以将该主机分配到您的/etc/hosts文件中,这样每次访问它时就不需要输入IP地址了。该主机可能是一个工具服务器、打印机或其他网络连接的系统。像往常一样将条目添加到/etc/hosts文件中。
我将以我的网络连接打印机为例。它的静态IP地址是10.0.0.253。但是我不知道它的名称。因此,我想将其命名为hp_printer。我将对该IP地址和主机名进行ping测试,然后将其添加到/etc/hosts文件中。
terrance@terrance-ubuntu:~$ ping -c 2 10.0.0.253
PING 10.0.0.253 (10.0.0.253) 56(84) bytes of data.
64 bytes from 10.0.0.253: icmp_seq=1 ttl=255 time=0.326 ms
64 bytes from 10.0.0.253: icmp_seq=2 ttl=255 time=0.334 ms

terrance@terrance-ubuntu:~$ ping -c 2 hp_printer
ping: unknown host hp_printer

terrance@terrance-ubuntu:~$ sudo vi /etc/hosts
10.0.0.253 hp_printer.lan hp_printer

terrance@terrance-ubuntu:~$ ping -c 2 hp_printer
PING hp_printer.lan (10.0.0.253) 56(84) bytes of data.
64 bytes from hp_printer.lan (10.0.0.253): icmp_seq=1 ttl=255 time=0.334 ms
64 bytes from hp_printer.lan (10.0.0.253): icmp_seq=2 ttl=255 time=0.303 ms

现在,我也可以通过我给它命名的名称访问打印机设置的网页,而不是 IP 地址,这可能更容易记住:

enter image description here

你的/etc/resolv.conf文件也被DNS用来帮助查找主机名。它是解析器的配置文件。它提供了搜索域,这样当你寻找主机时就不必一直指定完全限定域名(FQDN)。它还提供了本地网络的DNS或名称服务器的IP地址。下面的search行显示了我的域名lan
terrance@terrance-ubuntu:~$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.0.1
search lan

希望这能更好地解释DNS和FQDN的工作原理。

为什么你将FQDN映射到/etc/hosts文件中的127.0.1.1? - anon
1@BulatM,请查看我的修订答案。 - Terrance
请问您能解释一下/etc/resolv.conf中搜索关键字和域关键字的区别吗?我正在阅读resolv.conf的手册页,但还不太清楚。 - anon
可以同时包含它们吗?你能提供一个有用且有效的案例作为答案吗?谢谢。 - anon
1@BulatM。点击我的回答中的链接,它们会带您了解更多有关事物的信息。例如https://en.wikipedia.org/wiki/Resolv.conf提供了更多信息。我在这里是为了帮助您,而不是教您。由于这是全部志愿工作,所以我没有得到报酬,请自己进行一些学习。 - Terrance
1@Terrance 如果你觉得我对你有点儿看不起的话,我向你道歉,那并不是我的本意。我在计算机领域也有很长时间了。我遇到过足够多的人在这个特定问题上感到困惑,其中包括有着30年经验的系统管理员。 - Philip Couling
为什么需要多个IP地址来“循环访问”同一台计算机?(即需要同时使用127.0.0.1和127.0.1.1。) - aderchox
1@aderchox 没有必要,但这可能会有所帮助。https://serverfault.com/questions/363095/why-does-my-hostname-appear-with-the-address-127-0-1-1-rather-than-127-0-0-1-in - Terrance

在/etc/hostname文件中,你只需要使用主机名。 完整的域名可以设置在/etc/hosts文件中,它可能看起来像这样:
127.0.1.1        thishost.mydomain.org    thishost

根据hosts文件的手册。

http://man7.org/linux/man-pages/man5/hosts.5.html


1修复:谢谢,不过了解在/etc/hostname中指定/不指定FQDN的利弊是很重要的。我知道你的解决方案:它是一个为希望将FQDN解析为某个地址(不管是什么地址)的程序提供支持的存根。 - anon

这里讨论了 hostname(1)的manpage(粗体段落是我强调的):

完全限定域名(FQDN) 系统的FQDN(Fully Qualified Domain Name)是解析器(resolver(3))返回的主机名,例如ursula.example.com。通常它是主机名后跟DNS域名(第一个点之后的部分)。您可以使用hostname --fqdn命令检查FQDN,或者使用dnsdomainname命令检查域名。
您无法使用hostname或dnsdomainname更改FQDN。
设置FQDN的推荐方法是将主机名作为/etc/hosts、DNS或NIS中的完全限定名称的别名。例如,如果主机名是"ursula",则可以在/etc/hosts文件中添加以下行:
127.0.1.1 ursula.example.com ursula
从技术上讲:FQDN是gethostname(2)返回的主机名由getaddrinfo(3)返回的名称。DNS域名是第一个点之后的部分。
因此,它取决于解析器的配置(通常在/etc/host.conf中)如何更改它。通常,在解析DNS或NIS之前会解析hosts文件,所以在/etc/hosts中更改FQDN是最常见的做法。
如果在安装过程中提供了一个完全限定域名(FQDN)作为主机名,它只会将第一个组件写入到/etc/hostname文件中,并将FQDN保留在/etc/hosts文件中。
所以,在这种情况下,就让安装程序自己完成它的工作吧。

这个(在/etc/hosts中包含127.0.1.1 ursula.example.com ursula)是Debian\Ubuntu特定的,还是同样适用于其他发行版? - anon
1不清楚其他发行版。不过在Arch和CentOS上你可以做同样的事情。关于其他发行版的问题应该在[unix.se]上提问。 - muru
net-snmpd软件包默认从/etc/hostname中获取sysName oid的值。因此,你最终会发现一个snmpd将"ursula"作为sysName传播出去,这会给依赖sysName设置的系统(如LibreNMS)带来麻烦,尤其是当你有一堆共享主机名部分的服务器时(比如srv1.customer.com、srv1.othercustomer.com、srv1.thirdcustomer.com等),因为LibreNMS只会添加其中一个,并拒绝其他服务器,原因是"重复的sysName"。 - frank42
如果在安装过程中提供了一个完全限定域名(FQDN)作为主机名顺便说一下,Ubuntu Server 22.04 安装程序不允许我在其基本用户界面中指定 FQDN("Your server's name"字段不接受点号),所以我不得不手动修改:sudo sed -i 's@myhost@myhost.example.com myhost@' /etc/hosts - Nickolay