总结:
那里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 代码会加载并尝试在其中查找。但没有人。因为该服务不支持主机数据库。db
hosts
nsswitch.conf
libnss_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
这个包还安装了Makefile
at /var/lib/misc/Makefile
.
cd
into/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)