Linux排障日記:為什么 /etc/hosts 寫了解析卻不生效?

在docker容器化平臺(tái)安裝過程中,我們遇到一個(gè)典型問題:容器啟動(dòng)過程中,訪問鏡像倉庫服務(wù)失敗,重試40次依然無果。

部署同學(xué)在節(jié)點(diǎn)上手工測試時(shí)發(fā)現(xiàn)報(bào)錯(cuò)
curl http://registry.local.net:5000
curl: (6) Could not resolve host: registry.local.net對(duì)網(wǎng)絡(luò)熟悉的同學(xué)都知道主機(jī)上dns解析會(huì)優(yōu)先匹配/etc/hosts中配置的本地解析,如果沒有配置在再去/etc/resolv.conf中通過dns服務(wù)器解析。
1?? 排查過程
倉庫服務(wù)在部署的時(shí)候會(huì)在所有節(jié)點(diǎn)會(huì)配置本地解析,先通過curl或者ping命令測試解析
- 節(jié)點(diǎn)手工訪問同樣解析失敗
curl http://registry.local.net:5000
curl: (6) Could not resolve host: registry.local.net/etc/hosts確實(shí)配置了本地地址解析
10.x.16.x registry.local.net明明在/etc/hosts里已經(jīng)寫了解析,為什么主機(jī)還是提示無法解析域名?
使用strace命令檢查下解析調(diào)用過程
[root@localhost ~]# strace -e trace=open,openat -f ping -c 1 registry.local.net
.....
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/dev/cur_gl", O_RDONLY|O_CLOEXEC) = -1 ENOENT (沒有那個(gè)文件或目錄)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/usr/lib64/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (沒有那個(gè)文件或目錄)
PING registry.local.net (10.xx.16.xx) 56(84) bytes of data.
openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 5
64 bytes from registry.local.net (10.xx.16.xx): icmp_seq=1 ttl=64 time=0.402 ms
--- registry.local.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.402/0.402/0.402/0.000 ms
+++ exited with 0 +++從調(diào)用過程上看調(diào)用了linux的 /etc/nsswitch.conf 配置文件
排查發(fā)現(xiàn),該文件中相關(guān)配置被注釋掉
#hosts: files dns myhostname解釋:
- files首先查本地文件
/etc/hosts,如果匹配成功,直接返回 IP。 - dns如果本地文件沒找到,再去
/etc/resolv.conf中的 DNS 服務(wù)器查詢。 - myhostname解析當(dāng)前主機(jī)自己的主機(jī)名(
hostnamectl設(shè)置的名字)。

也就是說,Linux 會(huì)嚴(yán)格按照 files → dns → myhostname 的順序來解析域名。如果順序被改了,或者干脆被注釋掉,就會(huì)出現(xiàn)類似 “明明寫在 /etc/hosts,卻不生效” 的現(xiàn)象。
那么問題原因就顯而易見了,由于此配置被注釋,linux系統(tǒng)默認(rèn)走到了dns服務(wù)器查詢ip,但是此域名沒有在dns注冊(cè)過,解析不出來符合預(yù)期。
2?? 解決方案
修改/etc/nsswitch.conf文件,將注釋去掉,恢復(fù)為
hosts: files dns myhostname保存后立即生效,再次訪問:
[root@localhost ~]# curlregistry.local.net:5000 -I
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Mon, 29 Sep 2025 06:45:45 GMT返回正常了,問題解決
3?? 總結(jié)與啟示
1. 不要忽略基礎(chǔ)文件很多看似復(fù)雜的安裝失敗問題,最終原因可能是最基礎(chǔ)的系統(tǒng)配置。
2. 熟悉主機(jī)名解析順序/etc/nsswitch.conf 決定了解析優(yōu)先級(jí),平時(shí)容易被忽視。
3. 排查要有層次先確認(rèn)本地hosts解析,再確認(rèn) DNS,最后再檢查系統(tǒng)配置文件,才能快速定位。






















