nsswitch.conf - 名称解析选项什么是 db?

nsswitch.conf - 名称解析选项什么是 db?

总结:
那里nsswitch.conf有一个db服务。那是什么类型的数据库?nsswitch 在什么路径上查找它?它如何用于存储hosts

为什么:
如果 DNS 解析失败,我想设置一个后备 IP,我在超级用户上找到了这个答案: 设置主机名的后备 IP 地址

这很好,但是一直转到 DNS 服务器并不是最好的选择,正如另一个答案中提到的那样:使用静态回退 上面的链接也得出结论,这种回退是不可能的。

我还检查了手册页,nsswitch.conf其中FILES提到解析器服务由库定义:

  A  service  named  SERVICE   is   implemented   by   a   shared   object   library   named
  libnss_SERVICE.so.X that resides in /lib.

因此静态回退应该是可行的,只需由不同的服务提供即可。
手册页也提到了该db服务:/lib/libnss_db.so.X implements "db" source.
但是我并没有真正找到有关此db服务的任何进一步信息。

Ubuntu 似乎默认使用此db选项:nsswitch.conf

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

奇怪的是,我的系统上没有/lib/libnss_db.so.X手册页中提到的内容:

~$ ll /lib*/ | grep libnss
-rw-r--r-- 1 root root  38K april  7 03:24 libnss_compat-2.31.so
lrwxrwxrwx 1 root root   21 april  7 03:24 libnss_compat.so.2 -> libnss_compat-2.31.so
-rw-r--r-- 1 root root  26K april  7 03:24 libnss_dns-2.31.so
lrwxrwxrwx 1 root root   18 april  7 03:24 libnss_dns.so.2 -> libnss_dns-2.31.so
-rw-r--r-- 1 root root  54K april  7 03:24 libnss_files-2.31.so
lrwxrwxrwx 1 root root   20 april  7 03:24 libnss_files.so.2 -> libnss_files-2.31.so
-rw-r--r-- 1 root root  26K april  7 03:24 libnss_hesiod-2.31.so
lrwxrwxrwx 1 root root   21 april  7 03:24 libnss_hesiod.so.2 -> libnss_hesiod-2.31.so
-rw-r--r-- 1 root root  54K april  7 03:24 libnss_nis-2.31.so
-rw-r--r-- 1 root root  62K april  7 03:24 libnss_nisplus-2.31.so
lrwxrwxrwx 1 root root   22 april  7 03:24 libnss_nisplus.so.2 -> libnss_nisplus-2.31.so
lrwxrwxrwx 1 root root   18 april  7 03:24 libnss_nis.so.2 -> libnss_nis-2.31.so

答案1

每个数据库(就 NSS 而言)都需要使用自己的查找函数。例如,对于服务数据库,它是getservbyname_r(),对于协议数据库,它是getprotobyname_r()。主机数据库想要使用gethostbyaddr_r()和。因此,当您在 中的行中gethostbyname_r()声明时,nss 代码会加载并尝试在其中查找。但没有人。因为该服务不支持主机数据库。dbhostsnsswitch.conflibnss_db.so_nss_db_gethostbyname_r()db

我有同样的需求,又花了一天时间进行实验并深入研究 glibc 源代码。我得出的结论是,唯一的方法是实现自己的 nss 插件,并利用所需的函数来使用其他文件,然后/ets/hosts用于主机数据库。

使用类似的命令nm -D /usr/lib/x86_64-linux-gnu/libnss_files.so.2来显示服务库中的查找函数以找出哪个实现了什么。

答案2

这里

db 导致使用 libnss_db。它从通常存储在 /var/db(Debian 上为 /var/lib/misc)中的 Berkeley DB 文件中读取数据;对于大型 NSS 数据库,这通常比从纯文本文件中读取数据更快。

您应该能够使用 Berkeley DB 客户端修改数据库,但它们通常是从相关源数据中批量构建的。在上述配置中,数据源是 /etc 中的文本文件,这些文件仍作为参考;DB 文件是用于提高速度的变体,使用 makedb 批量构建,不打算用作主存储。此处的文本文件是用于协议的 /etc/protocols、用于服务的 /etc/services、用于以太网地址的 /etc/ethers 和用于 RPC 程序编号的 /etc/rpc。

更常见的是,db 用于密码和组数据库,作为大型远程托管用户数据库(通常使用 LDAP)的本地缓存。

makedb您可以通过安装包来获取命令libnss-db。如果我们查看已安装的内容,您会发现libnss_db.so

dpkg -L libnss-db | grep so
/lib/x86_64-linux-gnu/libnss_db-2.2.3.so
/lib/x86_64-linux-gnu/libnss_db.so.2

这个包还安装了Makefileat /var/lib/misc/Makefile.
cdinto/var/lib/misc/并运行,它会为你sudo make生成一组文件:db

$ ls /var/lib/misc/
group.db  Makefile  passwd.db  protocols.db  rpc.db  services.db  shadow.db

您也可以手动生成一个:

$ makedb /etc/passwd ~/passwd.db
$ file ~/passwd.db
~/passwd.db: Berkeley DB (Btree, version 9, native byte-order)

相关内容