具有單獨 IP 地址(網路命名空間)的 systemd-nspawn 容器不起作用
查看 的文件
systemd-nspawn
,它一定是為了以一種非常使用者友好的方式在不同的網路命名空間中啟動容器。您使用該-n
選項,只需systemd-networkd.service
在兩端啟用即可。容器在“私有”範圍之一中獲得自己的 IP 地址。(DNS 可能需要一些額外的步驟)。結果是我得到了範圍內的 IP 地址
169.254.*.*
。預設路由指向host0
介面,不經過任何網關/路由器。嘗試訪問 Internet 伺服器,例如8.8.8.8
失敗並顯示“沒有路由到主機”。(如果這不起作用,則沒有必要製定 DNS)。如果我
tcpdump -i ve-fedora-25
在主機上執行,我可以看到 DHCP 請求,但它們沒有得到響應。systemd-networkd 肯定在主機上執行。主機端日誌在 上顯示“Gained carrier”ve-fedora-25
,networkctl 將其顯示為“可路由”和“已配置”,全部為綠色。我的系統是 Fedora 25。我想要一個可以使用 TCP/IP 連接的作業系統容器,同時能夠連接到世界(例如執行
dnf
包管理器)。就像libvirt
虛擬機開箱即用一樣輕鬆工作。出了什麼問題?
問題是 Fedora 的firewalld。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。