![尽管所有内容都在 /etc/hosts 中,但本地 DNS 查找不起作用](https://linux22.com/image/868118/%E5%B0%BD%E7%AE%A1%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%E9%83%BD%E5%9C%A8%20%2Fetc%2Fhosts%20%E4%B8%AD%EF%BC%8C%E4%BD%86%E6%9C%AC%E5%9C%B0%20DNS%20%E6%9F%A5%E6%89%BE%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我在 Virtual Box 上运行 Ubuntu (12.04),希望我的机器能够查找自己的主机名,就像此网络中其他虚拟机所做的一样(我正在尝试构建虚拟集群)。没有 DNS 服务器,IP 由 VirtualBox 分配,我只是将它们映射到 /etc/hosts 中。
机器名称是节点1我有这样的 /etc/hosts:
user@node1-VirtualBox:~$ cat /etc/hosts
127.0.0.1 localhost
192.168.56.103 node1-VirtualBox.cs.ucl.ac.uk node1-VirtualBox
#10.0.2.15 node1-VirtualBox
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
所以我认为
- 完全限定主机名将是 node1-VirtualBox.cs.ucl.ac.uk
- node1 和 node1-VirtualBox.cs.ucl.ac.uk 将解析为 192.168.56.103(反之亦然)
我从主机名获得以下信息:
$hostname -> node1-VirtualBox (OK)
$hostname --fqdn -> node1-VirtualBox.cs.ucl.ac.uk (OK)
$hostname --A -> node1.local node1.cs.ucl.ac.uk (OK i guess)
主机名看起来很有希望,但是当我尝试使用主机获取 IP 地址时,它不起作用......
user@node1-VirtualBox:~$ host -v -t A node1-VirtualBox
Trying "node1-VirtualBox.cs.ucl.ac.uk"
Trying "node1-VirtualBox"
Host node1-VirtualBox not found: 3(NXDOMAIN)
Received 110 bytes from 127.0.0.1#53 in 1 ms
user@node1-VirtualBox:~$ host -v -t A 192.168.56.103
Trying "103.56.168.192.in-addr.arpa"
Host 103.56.168.192.in-addr.arpa. not found: 3(NXDOMAIN)
Received 108 bytes from 127.0.0.1#53 in 2 ms
知道为什么这不起作用吗?从我在配置中读到和看到的内容来看,如果 DNS 是在本地主机上完成的,它应该只检查 /etc/hosts... 并且一切都在那里,对吗?而且 SSH 正在运行,所以显然这个文件是正确的?
下面是我的配置:
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat group: compat shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 networks: files
protocols: db files services: db files ethers: db files rpc: db files
netgroup: nis
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 127.0.0.1
search cs.ucl.ac.uk
ifconfig:
eth0 Link encap:Ethernet HWaddr 08:00:27:da:a1:bc
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:feda:a1bc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:169 errors:0 dropped:0 overruns:0 frame:0
TX packets:176 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:123968 (123.9 KB) TX bytes:21551 (21.5 KB)
eth1 Link encap:Ethernet HWaddr 08:00:27:99:65:51
inet addr:192.168.56.103 Bcast:192.168.255.255 Mask:255.255.0.0
inet6 addr: fe80::a00:27ff:fe99:6551/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:268 errors:0 dropped:0 overruns:0 frame:0
TX packets:252 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:78333 (78.3 KB) TX bytes:71866 (71.8 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12527 errors:0 dropped:0 overruns:0 frame:0
TX packets:12527 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:23857104 (23.8 MB) TX bytes:23857104 (23.8 MB)
事后分析:
好的,事实证明“host”命令无法解析,这对我原来的问题来说有点分散注意力——它无法工作,因为它没有查看 /etc/hosts,如下面的答案所述。
最初的问题是缺少规范的主机名,即hostname --fqdn
返回 localhost。为了解决这个问题,我必须将以下内容
192.168.56.103 node1-VirtualBox.cs.ucl.ac.uk node1-VirtualBox
作为 /etc/hosts 中的第二行。
然而,为了使它真正工作,我必须重新启动我的机器并在我的集群上重新安装 Cloudera。
答案1
您所做的一切都是正确的,例如将条目放入其中/etc/hosts
,将服务器地址放入其中/etc/resolv.conf
,/etc/nsswitch.conf
看起来也不错。
您遇到的问题是由于对非常具体的术语“名称服务器”的理解。/etc/resolv.conf
除非明确提及,否则用于将 IP 地址解析为主机名和反之亦然的所有命令都使用来自的名称服务器地址。您输入的是 ,因为它nameserver 127.0.0.1
不是有效的名称服务器,因为它未配置为名称服务器。它在那里是因为dnsmasq
充当 DNS 缓存器(和 DHCP 服务器),但host
,dig
,nslookup
仅从有效的、已配置的名称服务器获取数据。
由于host
、nslookup
、dig
命令将使用 中提到的“名称服务器” (除非指定),因此在您的情况下,使用这些命令无法进行主机名解析。尽管使用或 读取 的/etc/resolv.conf
程序会将主机名解析为 IP 地址,反之亦然。/etc/nsswitch.conf
/etc/hosts
如果您想要从 解析主机名,/etc/hosts
则需要使用getent
。例如,要解析“node1-VirtualBox”,您需要以下命令:
getent hosts node1-VirtualBox
答案2
host/nslookup 命令实用程序尝试使用名称服务器直接解析 DNS 查询。它们不使用 /etc/hosts。但应用程序会使用。例如,ping 应该可以工作。也就是说,“ping node1-VirtualBox”应该解析为 192.168.56.103(在您的情况下)。您到底想做什么?