查看 的文档systemd-nspawn
,它一定是为了以一种非常用户友好的方式在不同的网络命名空间中启动容器。您使用该-n
选项,只需systemd-networkd.service
在两端启用即可。容器在“私有”范围之一中获取自己的 IP 地址。 (DNS 可能需要一些额外的步骤)。
结果是我得到了范围内的IP地址169.254.*.*
。默认路由指向该host0
接口,不经过任何网关/路由器。例如,尝试访问互联网服务器8.8.8.8
失败,并显示“没有到主机的路由”。 (如果这不起作用,那么解决 DNS 就没有意义)。
如果我tcpdump -i ve-fedora-25
在主机上运行,我可以看到 DHCP 请求,但它们没有得到响应。 systemd-networkd 肯定在主机上运行。主机端日志在 上显示“获得运营商” ve-fedora-25
,networkctl 将其显示为“可路由”和“已配置”,全部显示为绿色。
我的系统是 Fedora 25。我想要一个可以使用 TCP/IP 连接的操作系统容器,同时能够连接到世界(例如运行dnf
包管理器)。正如libvirt
虚拟机可以轻松开箱即用一样。出了什么问题?
答案1
问题出在 Fedora 上防火墙。 nspawn 似乎从未与firewalld 集成。 (nspawn 也没有与 Fedora 的 SELinux 策略正确集成)。
正如问题中提到的,libvirt 工作正常:)。我们可以使用人们发现的用于运行容器的相同技巧Fedora 上的 LXC。
更新:升级到 Fedora 30 后,解决方法停止工作。
使用选项运行 systemd-nspawn --network-bridge virbr0
。systemd-networkd
这不是依靠,而是杠杆libvirtd.service
。后一个服务在 Fedora 上已经默认启动。在访客中,照常设置您首选的 DHCP 客户端。
使用 systemd-networkd 作为 DHCP 客户端时的 DNS 解析
systemd-networkd
作为 DHCP 客户端使用可能偶然/etc/resolv.conf
如果您可能有之前容器启动留下的痕迹,则可以自行工作。但一般来说你不能依赖这个工作。它确实被设计为与 一起运行systemd-resolved.service
。
反过来,systemd-resolved 旨在与nss-resolve
.然而这并不是AIUI的本质。