Linux系统/etc/hosts文件中配置了主机解析,但还是无法解析ip

Linux主机解析过程记录

问题记录:

/etc/hosts文件中配置了主机解析,但还是无法解析ip

复制代码
[root@rocky810 ~]# ping snerdi-hpc
ping: snerdi-hpc: Name or service not known
[root@rocky810 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.219 snerdi-hpc

[root@rocky810 ~]#
[root@rocky810 ~]# ping snerdi-hpc
ping: snerdi-hpc: Name or service not known

使用命令分析

复制代码
[root@rocky810 linux-x64]# strace -e trace=open,openat -f ping -c 1 snerdi-hpc
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libidn2.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libunistring.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/proc/sys/crypto/fips_enabled", O_RDONLY) = 3
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
openat(AT_FDCWD, "/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 5
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/lib64/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 5
openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
ping: snerdi-hpc: Name or service not known

可以看到虽然读取了/etc/hosts文件,但还是优先走的dns解析

原因:

查看/etc/nsswitch.conf文件

发现hosts这一行被注释掉了,将这一行注释取消就能正常解析

复制代码
shadow:     files sss
#hosts:      files dns myhostname

aliases:    files
ethers:     files
gshadow:    files
# Allow initgroups to default to the setting for group.
# initgroups: files
networks:   files dns
protocols:  files
publickey:  files
rpc:        files

主机名解析流程:

  1. glibc → 读取 /etc/nsswitch.conf

  2. 查看/etc/nsswitch.conf这个文件中是否存在下面这行内容

    复制代码
    hosts:      files dns myhostname
  3. 如果/etc/nsswitch.conf不存在上述该内容,glibc 内部就会使用它的"内置默认配置",一般都是dns解析。

  4. 如果/etc/nsswitch.conf存在上述内容,那么就会按照这一行的配置顺序进行解析

    复制代码
    hosts:      files dns myhostname
    先走/etc/hosts进行解析
    如果/etc/hosts没有解析成功,会进行dns解析
    最后如果上面两步都没有解析成功,会再查看当前主机名,即hostnamectl所配置的主机名
相关推荐
CS_Zero几秒前
Ubuntu系统安装CH340&CH341串口驱动
linux·ubuntu
落羽的落羽几秒前
【Linux系统】从零实现一个简易的shell!
android·java·linux·服务器·c++·人工智能·机器学习
代码游侠4 分钟前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
工程师0077 分钟前
计算机网络知识(一)
运维·服务器·计算机网络
Trouvaille ~11 分钟前
【Linux】UDP Socket编程实战(三):多线程聊天室与线程安全
linux·服务器·网络·c++·安全·udp·socket
江湖有缘19 分钟前
Docker环境下使用RustScan端口扫描工具教程
运维·docker·容器
海棠AI实验室20 分钟前
VS Code Remote-SSH :原理、前置条件、配置套路与踩坑清单
运维·ssh
梦想的旅途220 分钟前
Java/Python/Go 实现企微外部群自动化消息推送
运维·自动化·企业微信
赋创小助手20 分钟前
NVIDIA B200 GPU 技术解读:Blackwell 架构带来了哪些真实变化?
运维·服务器·人工智能·深度学习·计算机视觉·自然语言处理·架构
sagima_sdu21 分钟前
bin、sbin 与 usr/bin、usr/sbin 目录的区别和由来
linux·运维·网络