我想创建一个通过 macvlan 和 dhcp 连接到网络的 nspawn 容器。我找到的所有文档都非常有指导性,但没有提供此设置的分步过程。
到目前为止我所做的是使用 debootstrap 包括 systemd-container 创建容器(debian base):
debootstrap --arch=armhf --include=systemd-container stretch /var/lib/machines/raspbian-09 http://archive.raspbian.org/raspbian
本机主机网络
跑步:
systemd-nspawn -b -M raspbian-09
或者
machinectl raspbian-09
单元文件 /etc/systemd/nspawn/raspbian-09.nspawn 包含:
[Exec]
Boot=true
PrivateUsers=no
[Network]
Private=no
VirtualEthernet=no
在这两种情况下,网络连接都很好。
麦克夫兰
对于 macvlan,我运行以下命令:
systemd-nspawn -b -M raspbian-09 --network-macvlan=eth0
或者
machinectl raspbian-09
单元文件 /etc/systemd/nspawn/raspbian-09.nspawn 包含:
[Exec]
Boot=true
PrivateUsers=no
[Network]
MACVLAN=eth0
在这两种情况下,网络连接都不起作用。
在容器内,我可以看到创建了一个接口 mv-eth0:
# networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 mv-eth0 ether degraded configuring
但是没有 ipv4 地址:
# ip a
mv-eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 xxxx::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever
主机和容器上还应该进行哪些其他配置?
答案1
一种可能的解决方案如下:
以下所有操作均需在容器中完成。
检查您的容器是否正在使用 systemd-networkd,您可以通过运行以下命令来检查是否是这种情况
systemctl status systemd-networkd
如果该服务未启用且未运行,您将需要启用并启动它
systemctl enable systemd-networkd
systemctl start systemd-networkd
如果未启用并启动 systemd-resolved 服务,您可能还需要启用并启动该服务。
systemctl enable systemd-resolved
systemctl start systemd-resolved
如果您需要在 macvlan 接口上创建动态 ipv4 地址,则可以创建网络设置文件/etc/systemd/network/mveth0.network
,其中包含以下内容
[Match]
Name=mv-eth0
[Network]
DHCP=ipv4
如果需要为macvlan接口设置静态ipv4地址。例如,如果您的网关地址为 192.168.1.1,并且需要将 ipv4 地址设置为 192.168.1.14/24,则可以在网络设置文件中使用以下内容/etc/systemd/network/mveth0.network
。
[Match]
Name=mv-eth0
[Network]
IPForward=yes
Address=192.168.1.14/24
Gateway=192.168.1.1
# DNS= ?
创建文件后,您需要重新启动 systemd-networkd 服务
systemctl restart systemd-networkd
您可能需要在您的情况下使用 sudo 来运行命令