必须在宿主机终端执行排查命令,不能在 docker exec 或 kubectl exec 中盲目修改;需用 ls -l 和 readlink -f 确认 /etc/hosts 是否为真实文件且未被符号链接或挂载覆盖;检查格式、编码、nsswitch.conf 配置及 nscd 缓存,最后验证是否处于隔离网络命名空间。

确认修改的是真正的 /etc/hosts 文件
先用 ls -l /etc/hosts 查看文件是否存在且路径正确。有些容器环境或 chroot 环境下,/etc/hosts 可能是符号链接或挂载覆盖的只读文件,真实配置不在原位置。
运行 readlink -f /etc/hosts,如果输出不是 /etc/hosts 而是类似 /proc/1/root/etc/hosts 或 /var/lib/docker/containers/.../hosts,说明你正在容器内操作,宿主机的 hosts 修改对当前 shell 无效。
【必须在宿主机终端执行排查命令,不能在 Docker exec 或 kubectl exec 中盲目修改】
检查 hosts 行格式与编码是否合法
用 sudo cat /etc/hosts | tail -n 5 查看最后几行,确认新增条目形如:127.0.0.1 api.dev.local——IP 和域名之间必须是**空格或 Tab**,不能是中文全角空格、冒号、等号或逗号。
特别注意:复制粘贴进来的行可能带不可见 Unicode 字符(比如零宽空格、BOM 头),导致整行被系统静默忽略。用 file /etc/hosts 检查编码,结果必须是 ASCII text 或 UTF-8 text;若显示 UTF-8 Unicode text 或含 with BOM,就需重存为纯 ASCII。
这一步操作起来很简单,直接用 sudo nano /etc/hosts 打开,把出问题的那行删掉,手动重新输入一遍,别复制。
验证系统是否真正读取了该映射
不要用 ping 验证——它只测连通性,不反映解析行为。改完后立刻运行:
getent hosts api.dev.local
如果返回空,说明系统 NSS 层根本没从 hosts 文件读到这条记录。此时要检查 /etc/nsswitch.conf 中的 hosts: 行是否包含 files,例如:hosts: files dns。若写成 hosts: dns 或漏掉 files,hosts 映射就完全失效。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
如果 getent 有返回但应用仍不生效,说明程序绕过了系统解析器——比如某些 Go 程序或 Electron 应用会直连 DNS,不走 libc 的 getaddrinfo。
排查 DNS 缓存服务干扰
第一步:运行 ps aux | grep nscd,若看到 nscd 进程,说明启用了 Name Service Cache Daemon,它会缓存 hosts 查询结果。
第二步:临时停掉它:sudo systemctl stop nscd,再立即运行 getent hosts api.dev.local 测试。
第三步:若恢复正常,说明是 nscd 缓存未更新。可选择永久启用自动刷新——编辑 /etc/nscd.conf,确保有 enable-cache hosts yes 和 check-files hosts yes,然后 sudo systemctl restart nscd。
注意:systemd-resolved 不读取 hosts 文件,resolvectl flush-caches 对 hosts 修改无效,别白忙。
检查是否被容器或网络命名空间隔离
方法一:运行 ip netns list,如果有输出,说明存在独立网络命名空间。进入对应命名空间再查:sudo ip netns exec <namespace_name> getent hosts api.dev.local</namespace_name>。
方法二:检查是否在 Docker 容器中运行测试命令。Docker 默认会覆盖容器内的 /etc/hosts,除非启动时加了 --add-host=api.dev.local:127.0.0.1 或使用 network_mode: host。
方法三:用 ls /proc/self/ns/net 和 ls /proc/1/ns/net 对比 inode 号,如果不一致,说明当前 shell 和 init 进程不在同一网络命名空间,宿主机 hosts 修改对当前会话不可见。










