systemd-resolved未启用时resolvectl flush-caches会报错;需先systemctl enable --now systemd-resolved并确认/etc/resolv.conf软链正确,再执行刷新;其仅清除内存中未过期的正向缓存记录,ttl由上游决定。

systemd-resolved 服务没启用,resolvectl flush-caches 直接报错
很多 Linux 发行版(比如 Ubuntu 22.04+、Fedora、Debian 12)默认用 systemd-resolved 管 DNS,但它不是总在运行。如果服务压根没启动,执行 resolvectl flush-caches 会提示 No such file or directory 或直接报 Failed to flush caches: Unit dbus-org.freedesktop.resolve1.service not found。
先确认状态:systemctl is-active systemd-resolved —— 返回 active 才能继续;如果是 inactive 或 failed,得先启用:
sudo systemctl enable --now systemd-resolved- 检查
/etc/resolv.conf是否软链到/run/systemd/resolve/stub-resolv.conf(否则应用可能绕过它) - 若之前手动改过
/etc/resolv.conf,记得还原,否则resolvectl刷的缓存对curl或ping无效
用 resolvectl flush-caches 刷新后,dig 或 nslookup 还走旧记录
这是因为 dig 和 nslookup 默认不走系统解析器,而是直连 /etc/resolv.conf 里写的 nameserver(比如 127.0.0.53)。如果该地址确实是 systemd-resolved 的 stub listener,那缓存已清;但如果你看到结果没变,大概率是应用自己缓存了,或者 DNS 查询被中间设备(如路由器、ISP)缓存了。
- 验证是否真清了:运行
resolvectl statistics,看Cache current:行是否归零或明显下降 - 测试真实解析行为:用
getent hosts example.com(走 libc 的getaddrinfo,受systemd-resolved影响) - 别依赖
ping example.com测缓存——glibc 有自己的一层 host 缓存,重启进程或改/etc/nsswitch.conf才能清
非 systemd-resolved 系统怎么处理(比如 CentOS 7、Alpine)
老系统或精简发行版压根没 systemd-resolved,DNS 缓存不在系统层,而在应用或 libc 层。没有统一命令可刷,得按场景来:
- Chrome / Firefox:它们自己维护 DNS 缓存,需进
chrome://net-internals/#dns或about:networking#dns手动清除 - Java 应用:JVM 有
networkaddress.cache.ttl,默认缓存 30 秒,改-Dsun.net.inetaddr.ttl=0才禁用 - Alpine + musl:libc 不缓存 DNS,每次查都是新请求;但如果你用了
dnsmasq或unbound,就得重启对应服务(如sudo rc-service dnsmasq restart) - CentOS 7 常配
NetworkManager+dnsmasq,此时清缓存要sudo systemctl restart dnsmasq,不是systemd-resolved
resolvectl 刷的是什么缓存?和 TTL 有什么关系
resolvectl flush-caches 只清 systemd-resolved 内存里的正向缓存(A/AAAA 记录),不碰反向、不重载配置、也不影响 DNSSEC 验证状态。关键点是:它不会让未过期的记录提前失效 —— 如果某条记录 TTL 是 300 秒,你刚刷完,5 秒后又查同一域名,它仍可能从缓存返回,只要还没到 TTL 截止时间。
- 真正“强制刷新”的做法是:先
resolvectl flush-caches,再等至少 1 秒,再发一次查询(触发重新递归) - 想看某条记录的剩余 TTL:用
resolvectl query example.com,输出里有cache: yes, ttl 298这类信息 - 注意:TTL 是上游 DNS 设定的,
systemd-resolved不会擅自缩短或延长,刷缓存只是删掉当前已存的条目
容易被忽略的是:systemd-resolved 的缓存行为依赖于上游响应是否带 AD(Authenticated Data)标志和本地 DNSSEC 配置,关了 DNSSEC(sudo resolvectl dnssec example.com off)有时反而让缓存更“听话”,但这属于权衡安全与调试便利性的事。










