必须检查/etc/hosts权限与格式、/etc/nsswitch.conf是否含files、systemd-resolved缓存及应用层DNS预取;getent hosts test.local返回192.168.50.10 test.local且ping和curl均解析到该IP才算真正生效。

在银河麒麟OS中修改了/etc/hosts文件却仍无法让test.local解析到192.168.50.10,访问时依旧走DNS、ping返回原IP、浏览器照常打开网站——这不是编辑没保存,而是系统或应用层绕过了你刚写入的映射规则。
先确认改的是真文件且权限无误
执行ls -l /etc/hosts,输出中第一列应为-rw-r--r--(即644权限),第三列属主必须是root。如果不是,运行sudo chmod 644 /etc/hosts && sudo chown root:root /etc/hosts修正。
用sudo cat /etc/hosts | grep test.local确认那行确实存在且格式正确:IP与域名间是空格而非制表符或中文全角符号,行尾无多余空格,整行未被#注释。
这一步漏掉,后续所有验证都失去意义。
绕过glibc缓存,用getent直接测系统级解析
别信ping或浏览器——它们可能被DNS缓存、HTTP连接复用或代理插件干扰。运行:getent hosts test.local
如果返回空,说明系统压根没读取到该条目;如果返回192.168.50.10 test.local,说明hosts本身已生效,问题出在上层应用。
若返回空,立即检查/etc/nsswitch.conf中hosts:这一行——它必须包含files,例如hosts: files myhostname dns。如果只有myhostname dns,手动补上files并保存。
清掉systemd-resolved的DNS缓存(V10 SP1+默认启用)
银河麒麟V10 SP1及更新版默认启用systemd-resolved服务,它会缓存DNS结果并可能忽略hosts——即使getent能查到,ping和curl仍可能失效。
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
执行sudo systemd-resolve --flush-caches,然后立刻再跑一遍getent hosts test.local和ping -c 1 test.local。
如果仍不生效,临时停用该服务:sudo systemctl stop systemd-resolved,再测试。若此时生效,说明是resolved服务配置冲突,需进一步检查/etc/systemd/resolved.conf中DNSStubListener是否为no或FallbackDNS是否干扰了本地解析路径。
浏览器与Java应用的特殊处理
Chrome、Edge等Chromium内核浏览器默认启用DNS预取和socket连接复用,改完hosts后旧标签页不会自动刷新解析结果。
方法一:打开新无痕窗口访问test.local;
方法二:地址栏输入chrome://net-internals/#dns→点“Clear host cache”;
方法三:按F12打开开发者工具→Network选项卡→勾选“Disable cache”→再刷新页面。
Java应用(如Spring Boot后台)可能启用JVM级DNS缓存,需在启动参数中添加:-Dnetworkaddress.cache.ttl=0,否则会永久记住首次解析结果。
验证最终是否真正成功
第一步:运行getent hosts test.local,必须输出192.168.50.10 test.local;
第二步:运行ping -c 1 test.local,回复IP必须是192.168.50.10;
第三步:终端中执行curl -v http://test.local,观察* Connected to test.local (192.168.50.10)是否出现。
三项全部通过,hosts修改即宣告生效。

















