马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Linux 里,/etc/hosts 文件负责把主机名直接翻译成 IP 地址。很多运维同学改完这个文件发现"没反应",其实不是文件写错了,而是少了让本机重新读取这一步。这篇文章把修改 /etc/hosts 后让它立刻生效的几种做法讲清楚,并说明排查顺序。
/etc/hosts 是怎么参与域名解析的
系统解析一个域名时,大致按这样的顺序走:
- 先看本机缓存里有没有这个域名;
- 命中不了再查
/etc/hosts 里有没有写死的映射;
- 没命中才去问 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 系为主,其他系统请按对应包管理器的服务名替换。
|