通用名称服务

“通用名称服务查询”指的是通过统一接口(如 getent 命令)访问各种系统支持的名称服务数据库。这些查询的行为,与下列几个关键组件和配置密切相关:


✅ 通用名称服务查询(如 getent)与以下内容有关:

1. /etc/nsswitch.conf名称服务切换配置

这是最核心的配置文件,决定了系统在查询信息(如主机名、用户、组等)时,查询哪些源顺序如何

例如:

hosts: files dns
passwd: files ldap
  • 对于 hosts 查询(如 getent hosts),系统会:

    1. 先查 /etc/hostsfiles)。

    2. 再查 DNS(dns)。

🔁 getent 就是根据这个顺序去查找的,顺序不同,结果可能不同。


2. 实际的数据源(名称服务)

这些是 /etc/nsswitch.conf 中声明的数据源,包括:

名称数据源功能
files /etc/hosts, /etc/passwd 本地文件数据库
dns /etc/resolv.conf 中定义的 DNS 域名解析
nis / nisplus NIS/NIS+ 网络信息服务 旧的网络目录服务
ldap LDAP 目录服务 组织级目录服务
db Berkeley DB 数据库 少用
systemd systemd-resolved 服务 用于动态主机名和服务发现

3. 对应模块库(libnss_XXX.so)

NSS(Name Service Switch)是通过动态链接库 libnss_*.so 来实现模块化查询的。例如:

  • libnss_files.so:支持从 /etc/hosts 等本地文件中读取。

  • libnss_dns.so:支持 DNS 查询。

  • libnss_ldap.so:支持 LDAP。

这些库被 glibc 调用,实现实际的查询行为。


4. /etc/hosts(如果配置了 files

本地静态主机名映射,例如:

127.0.0.1   localhost
10.1.1.5    myhost.local myhost

5. /etc/resolv.conf(如果配置了 dns

用于定义 DNS 服务器和查询参数,例如:

nameserver 8.8.8.8
search example.com

这会影响 getent hosts 查询 DNS 时的行为。


🧠 总结一句话:

getent基于 nsswitch.conf 定义的多个信息源 来统一查询各种“名称服务”的接口,它的行为受 nsswitch.conf 中模块顺序 + 模块配置文件(如 /etc/hosts、DNS、LDAP)共同决定。


如果你想了解具体某个模块如何工作(如 libnss_dns.so 如何通过 resolv.conf 查询 DNS),我可以进一步展开。

 

 

getent hosts tianqingcloud
getent hosts localhost

 

你看到的输出里,`getent hosts localhost` 返回的是:

```
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
```

而不是 `127.0.0.1`,**原因如下:**

---

### ✅ 原因:IPv6 优先
Linux 系统(包括 glibc 的 `getent hosts`)在解析主机名时,**默认优先使用 IPv6 地址(如果系统启用了 IPv6)**。
在你的 `/etc/hosts` 文件中:

```
127.0.0.1 localhost ...
::1 localhost ...
```

虽然两者都映射到了 `localhost`,但 `getent hosts localhost` 会返回**第一个匹配的条目**,而因为 IPv6 优先,它返回的是 `::1`。

---

### 🔍 验证方式
你可以用以下命令强制查看 IPv4 地址:

```bash
getent ahosts localhost
```

输出可能类似于:

```
127.0.0.1 STREAM localhost
127.0.0.1 DGRAM
127.0.0.1 RAW
::1 STREAM
::1 DGRAM
::1 RAW
```

---

### ✅ 如果你想强制用 IPv4
可以临时禁用 IPv6(不推荐)或修改 `/etc/gai.conf` 来调整优先级,但更简单的做法是用 `ping` 或 `dig` 明确指定协议:

```bash
ping -4 localhost
```

---

### ✅ 总结一句话
> `localhost` 同时解析到 `127.0.0.1` 和 `::1`,但系统默认优先返回 IPv6 地址 `::1`,所以 `getent hosts localhost` 显示的是 `::1` 而不是 `127.0.0.1`。

posted on 2025-07-10 12:20  吃草的青蛙  阅读(32)  评论(0)    收藏  举报

导航