麒麟os默认启用systemd-resolved dns缓存,可通过systemctl is-active、resolvectl statistics、resolvectl status、resolvectl query --no-cache及systemd-resolve --flush-caches命令验证、观测、比对、清空缓存;若启用nscd,需额外检查其hosts缓存配置。

如果您在麒麟OS中怀疑DNS缓存导致域名解析异常(如旧IP未更新、跳转错误或解析延迟),需确认当前系统是否启用缓存机制并查看其内容。麒麟OS默认使用 systemd-resolved 作为本地DNS解析器,其缓存行为独立于传统 /etc/resolv.conf,且不提供直接导出缓存条目的命令。以下是验证与间接观测DNS缓存状态的操作方法:
一、确认 systemd-resolved 缓存服务是否启用
systemd-resolved 是麒麟OS V10 SP1及后续版本的默认DNS管理服务,其内置缓存功能默认开启,无需额外配置。缓存命中将显著缩短解析响应时间,但不会暴露具体缓存记录列表。
1、执行命令检查 resolved 服务运行状态:sudo systemctl is-active systemd-resolved
2、若输出为 active,则服务正在运行,缓存功能已启用;若为 inactive,说明缓存未启用,所有查询均直连上游DNS服务器。
3、进一步确认缓存策略:运行 resolvectl statistics,观察输出中 Cache: 行后的数字,例如 Cache: 127/512 表示当前缓存中已有127条有效记录,最大容量为512条。
二、通过 resolvectl status 观察实时缓存影响指标
该命令不显示缓存条目本身,但可反映缓存是否参与解析过程,并揭示当前活跃的DNS服务器及统计信息,从而间接判断缓存是否生效。
1、执行命令获取全局解析状态:resolvectl status
2、在输出中定位 Statistics: 段落,重点关注以下字段:Cache hits: X(缓存命中次数)、Cache misses: Y(缓存未命中次数)。
3、若 Cache hits 值持续增长,说明缓存正在被实际使用;若长期为 0 且 Cache misses 持续增加,则可能因配置禁用缓存或查询类型不支持缓存(如某些 DNSSEC 验证请求)。
三、使用 resolvectl query 强制绕过缓存进行比对测试
通过添加 --no-cache 参数发起不经过本地缓存的解析请求,可与默认解析结果对比,从而验证缓存是否存在响应差异,是诊断缓存干扰最直接的方式。
1、执行标准缓存解析:resolvectl query baidu.com
2、执行强制跳过缓存的解析:resolvectl query baidu.com --no-cache
3、比较两次输出中的 Response: 字段和响应时间(Time:)。若两者响应IP一致但 Time: 差异显著(如 2ms vs 48ms),说明缓存已生效;若 IP 不同,则表明缓存中存在过期或错误记录。
四、清空 systemd-resolved 缓存以排除陈旧数据干扰
systemd-resolved 不提供“查看缓存内容”的接口,但支持彻底刷新整个缓存区。此操作会移除所有已缓存的正向与反向解析记录,强制后续查询重新获取最新结果。
1、执行缓存清空命令:sudo systemd-resolve --flush-caches
2、等待命令无报错返回后,立即运行 resolvectl statistics 确认 Cache: 后的计数已归零。
3、再次执行 resolvectl query baidu.com,观察 Cache hits 是否从 0 开始重新累计,验证清空操作完成。
五、检查 nscd 服务是否叠加启用DNS缓存
部分麒麟OS定制环境可能额外启用 Name Service Caching Daemon(nscd),它会对 hosts、passwd、DNS 等多种系统数据库进行独立缓存。若启用,将与 systemd-resolved 缓存形成嵌套,加剧排查复杂度。
1、检查 nscd 服务状态:sudo systemctl is-active nscd
2、若返回 active,运行 sudo nscd -g | grep hosts 查看 DNS 相关缓存开关状态,重点关注 enable-cache hosts 和 positive-time-to-live hosts 行。
3、如需临时禁用 nscd 的DNS缓存,编辑 /etc/nscd.conf,将 enable-cache hosts 行改为 enable-cache hosts no,保存后执行 sudo systemctl restart nscd。










