通用名称服务
“通用名称服务查询”指的是通过统一接口(如 getent 命令)访问各种系统支持的名称服务数据库。这些查询的行为,与下列几个关键组件和配置密切相关:
✅ 通用名称服务查询(如 getent)与以下内容有关:
1. /etc/nsswitch.conf – 名称服务切换配置
这是最核心的配置文件,决定了系统在查询信息(如主机名、用户、组等)时,查询哪些源,顺序如何。
例如:
hosts: files dns
passwd: files ldap
-
对于
hosts查询(如getent hosts),系统会:-
先查
/etc/hosts(files)。 -
再查 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`。
浙公网安备 33010602011771号