/etc/hosts文件修改后如何见效

[复制链接]
发表于 2026-10-6 10:04:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

在 Linux 里,/etc/hosts 文件负责把主机名直接翻译成 IP 地址。很多运维同学改完这个文件发现"没反应",其实不是文件写错了,而是少了让本机重新读取这一步。这篇文章把修改 /etc/hosts 后让它立刻生效的几种做法讲清楚,并说明排查顺序。

/etc/hosts 是怎么参与域名解析的

系统解析一个域名时,大致按这样的顺序走:

  1. 先看本机缓存里有没有这个域名;
  2. 命中不了再查 /etc/hosts 里有没有写死的映射;
  3. 没命中才去问 DNS 服务器(/etc/resolv.conf 里配置的那些)。

也就是说 /etc/hosts 的优先级高于 DNS,但前提是前两级缓存都是干净的。只改文件内容而不清缓存,那条新映射就不会被重新读。

第一步:改文件本身要 root 权限

/etc/hosts 属于系统文件,普通用户改不了。用 root 或者 sudo 打开编辑:

sudo vim /etc/hosts

格式是"IP 地址 + 空格 + 主机名",一行一条,改完保存退出:

127.0.0.1   localhost
192.168.1.10  node01.internal
10.0.0.5     test-api.internal

常见的写错方式是 IP 和主机名之间没空格、或者复制进来带了 Windows 的 ^M,这会导致整行被忽略。改完可以用 cat 看一眼确认格式正常。

第二步:重启网络服务让改动生效

改完文件后,重启网络服务是最直接的生效方式。桌面版 Ubuntu / Debian 上一般这样操作:

sudo service network-manager restart

如果是 minimal 安装、没有 NetworkManager 环境的机器,直接重启整机也一定生效,代价是要等机器起来:

sudo reboot

第三步:还没生效就清 DNS 缓存

仍然不生效时,多半是本机 DNS 缓存还留着旧结果。清理缓存的命令如下,适用 Ubuntu / Debian 系】:

sudo systemd-resolve --flush-caches

老版本或者没启用 systemd-resolved 的环境,这条命令会报"无法识别",属于正常现象,换重启网络服务或重启系统即可。

改完之后怎么验证

别只看文件改了就算完,用下面两条命令确认系统真的按新映射走了:

ping 新写的主机名

curl 新写的主机名

正常的话,ping 输出里显示的 IP 应该就是你刚写进去的那个;curl 能通说明解析链路整体没问题。如果 IP 还是旧的,说明缓存没清干净,回到第二步重来。

几个容易踩的坑

  • 没加 root 权限。直接 vim /etc/hosts 用普通账户打开是只读的,改了也存不进去,容易误以为"改了没生效"。
  • 只改了 hosts 却依赖外网域名。如果目标机器还要连公网域名,别忘了 DNS 侧也要放行,只改 hosts 只能覆盖写进去的那几个名字。
  • 写成了公网 IP 但无路由。指向一个不可达地址的映射会让原本能用的域名突然超时,排查时容易背锅方向反了。
  • 容器里改了不生效。Docker 容器有自己独立的 /etc/hosts(由 dockerd 挂载生成),在宿主机改完进容器重跑容器才看得到。

整体思路就是一条线:写对格式 → 重启网络(或重启系统)→ 必要时清缓存 → 用 ping / curl 验证。/etc/hosts 适合固定内部域名、屏蔽广告域名、本机多节点模拟这类场景,改之前想清楚它会影响所有用到这台机器的服务就够了。

qidao123.com企服评测-应用市场 编辑提示

本文由齐道123 IT 运维社区整理,梳理 Linux 下修改 /etc/hosts 后使其立即生效的常规做法与验证手段。所有命令请在自己拥有或已获授权的目标主机上执行;将内部域名指向不可达地址前请先确认依赖方,避免影响到线上正在运行的业务。不同发行版的网络服务管理命令略有差异,本文以 Ubuntu / Debian 系为主,其他系统请按对应包管理器的服务名替换。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表