本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
nss-myhostname, libnss_myhostname.so.2 — 为本地配置的系统主机名 提供解析功能
libnss_myhostname.so.2
nss-myhostname 是一个 glibc(GNU C Library) NSS(Name Service Switch) 插件, 提供了解析本地配置的系统主机名的功能。 所谓"本地配置的系统主机名"其实就是 gethostname(2) 函数的返回值。 该模块的解析规则如下:
本机的主机名 将会被解析为所有本地IP地址,并按照他们所属的 scope 排序。 如果 scope 不存在, 则会被解析为本地回环接口上的 IPv4 127.0.0.2 以及 IPv6 ::1
"localhost
" 与
"localhost.localdomain
" 以及所有以
".localhost
" 或 ".localhost.localdomain
" 结尾的主机名,
都会被解析为 127.0.0.1 与 ::1
"_gateway
" 会被
解析为当前所有的默认网关地址,
并按照地址的数字顺序排序。
这样就为当前网关分配了一个固定的主机名,
从而可以让应用程序在不关心网络配置的情况下,直接引用网关。
许多软件依赖于存在一个可以永远被解析的本地主机名。
当使用动态主机名的时候,
传统的做法是在主机名发生变化的同时修改 /etc/hosts
文件。
这种做法的缺点在于要求
/etc
目录必须是可写的,
而且有可能在修改 /etc/hosts
文件的同时,
系统管理员也正在编辑它。启用 nss-myhostname 之后,
就可以不必修改 /etc/hosts
文件。更进一步,
在许多系统上甚至无需存在这个文件。
要激活此NSS模块,可将 "myhostname
" 添加到 /etc/nsswitch.conf
文件中以
"hosts:
" 开头的行里面。
建议将 "myhostname
" 放置在 nsswitch.conf
文件中以
"hosts:
" 开头的行的末尾,以确保优先使用传统的基于DNS与
/etc/hosts
文件的解析方法。
下面是一个正确开启了 nss-myhostname 插件的
/etc/nsswitch.conf
文件的例子:
passwd: compat mymachines systemd
group: compat mymachines systemd
shadow: compat
hosts: files mymachines resolve [!UNAVAIL=return] dns myhostname
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
可以使用 glibc 软件包中的 getent 工具检查配置的有效性:
$ getent ahosts `hostname` ::1 STREAM omega ::1 DGRAM ::1 RAW 127.0.0.2 STREAM 127.0.0.2 DGRAM 127.0.0.2 RAW
本例中的本地主机名是 omega