本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。
本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:
由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。
nss-mymachines, libnss_mymachines.so.2 — 提供了 解析本地容器名称的功能
libnss_mymachines.so.2
nss-mymachines
是一个 glibc(GNU C Library) NSS(Name Service Switch) 插件,
提供了本地容器名称的解析功能。
systemd-machined.service(8)
服务按照本地容器所属 scope 的顺序,在这些本地容器的名称与其IP地址之间建立对应关系。
该功能仅可用于使用了网络名字空间(network namespace)的容器(参见
systemd-nspawn(1)
手册中对 --private-network
的描述)。
注意,解析得到的名称是在 systemd-machined 中注册的名称,
可能不同于容器内配置的主机名。
该插件还为映射到容器中的用户与组的名称提供了解析功能。
分配给 container
容器的所有用户与组的名称都会在主机上显示为
"vu-
" 与
"container
-uid
vg-
" (参见下文的例子)。
该功能仅可用于使用了用户名字空间(user namespace)的容器。参见
container
-gid
--private-users
选项(参见
systemd-nspawn(1) 手册)。
要激活此NSS模块,可将 "mymachines
"
添加到 /etc/nsswitch.conf
文件中以
"hosts:
", "passwd:
", "group:
" 开头的行里面。
建议将 "mymachines
" 放置在 /etc/nsswitch.conf
文件中
紧跟 "files
" 或 "compat
" 项之后,以确保在解析时,本地映射文件
/etc/hosts
, /etc/passwd
, /etc/group
仍为最优先,
同时又将其他解析方式(DNS之类)作为后备。
/etc/nsswitch.conf
文件¶下面的 /etc/nsswitch.conf
文件就是一个正确开启了
nss-mymachines 插件的例子:
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
nss-mymachines
提供的映射¶使用 systemd-nspawn(1)
运行 "rawhide
" 容器:
# systemd-nspawn -M rawhide --boot --network-veth --private-users=pick Spawning container rawhide on /var/lib/machines/rawhide. Selected user namespace base 20119552 and range 65536. ... $ machinectl --max-addresses=3 MACHINE CLASS SERVICE OS VERSION ADDRESSES rawhide container systemd-nspawn fedora 30 169.254.40.164 fe80::94aa:3aff:fe7b:d4b9 $ getent passwd vu-rawhide-0 vu-rawhide-81 vu-rawhide-0:*:20119552:65534:vu-rawhide-0:/:/sbin/nologin vu-rawhide-81:*:20119633:65534:vu-rawhide-81:/:/sbin/nologin $ getent group vg-rawhide-0 vg-rawhide-81 vg-rawhide-0:*:20119552: vg-rawhide-81:*:20119633: $ ps -o user:15,pid,tty,command -e|grep '^vu-rawhide' vu-rawhide-0 692 ? /usr/lib/systemd/systemd vu-rawhide-0 731 ? /usr/lib/systemd/systemd-journald vu-rawhide-192 734 ? /usr/lib/systemd/systemd-networkd vu-rawhide-193 738 ? /usr/lib/systemd/systemd-resolved vu-rawhide-0 742 ? /usr/lib/systemd/systemd-logind vu-rawhide-81 744 ? /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only vu-rawhide-0 746 ? /usr/sbin/sshd -D ... vu-rawhide-0 752 ? /usr/lib/systemd/systemd --user vu-rawhide-0 753 ? (sd-pam) vu-rawhide-0 1628 ? login -- zbyszek vu-rawhide-1000 1630 ? /usr/lib/systemd/systemd --user vu-rawhide-1000 1631 ? (sd-pam) vu-rawhide-1000 1637 pts/8 -zsh $ ping -c1 rawhide PING rawhide(fe80::94aa:3aff:fe7b:d4b9%ve-rawhide (fe80::94aa:3aff:fe7b:d4b9%ve-rawhide)) 56 data bytes 64 bytes from fe80::94aa:3aff:fe7b:d4b9%ve-rawhide (fe80::94aa:3aff:fe7b:d4b9%ve-rawhide): icmp_seq=1 ttl=64 time=0.045 ms ... $ ping -c1 -4 rawhide PING rawhide (169.254.40.164) 56(84) bytes of data. 64 bytes from 169.254.40.164 (169.254.40.164): icmp_seq=1 ttl=64 time=0.064 ms ... # machinectl shell rawhide /sbin/ip a Connected to machine rawhide. Press ^] three times within 1s to exit session. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 ... 2: host0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:aa:3a:7b:d4:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 169.254.40.164/16 brd 169.254.255.255 scope link host0 valid_lft forever preferred_lft forever inet6 fe80::94aa:3aff:fe7b:d4b9/64 scope link valid_lft forever preferred_lft forever Connection to machine rawhide terminated.