我正在尝试在 Arch Linux 主机上为 libvirt 设置没有 DHCP 的虚拟 NAT 网络设备。
我已尝试过:
# virsh net-define network.xml
Network default defined from network.xml
[ network.xml
]:
<network>
<name>default</name>
<bridge name="maas0" />
<forward mode="nat" />
<ip address="10.137.0.1" netmask="255.255.255.0" />
</network>
我的笔记本电脑在启动时输出以下内容:
# virsh net-start default
error: Failed to start network default
error: internal error: Failed to initialize a valid firewall backend
与该主题有关的所有其他帖子都在谈论升级软件——我正在使用最新版本:
$ pacman -Q ebtables dnsmasq libvirt iptables
ebtables 2.0.10_4-5
dnsmasq 2.75-1
libvirt 1.3.3-1
iptables 1.4.21-3
这可能是什么原因造成的internal error
?我该怎么做?
答案1
安装ebtables
后dnsmasq
似乎可以解决问题。别忘了重启libvirtd
服务。
命令:
sudo pacman -Syu ebtables dnsmasq
sudo systemctl restart libvirtd
注意:不要忘记关闭并重新打开您的virt-manager
GUI(如果您正在使用)。
编辑:原始答案建议也安装firewalld
。这对许多用户来说似乎没有必要,并且可能会给您的系统添加额外的不需要的防火墙。但是,如果您想尝试一下,您也可以添加以下命令:
sudo pacman -Syu firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl restart libvirtd
答案2
如果 libvirtd 是开始未安装ebtables
和/或dnsmasq
。如果您已安装它们但仍然遇到此问题,则可能需要重新启动服务libvirtd
:
sudo systemctl restart libvirtd.service
归功于这 评论另一个答案来阐明这一点。我将其作为对原始问题的新的和单独的答案提交,因为安装和启动firewalld
以解决原始问题可能会引发新问题:一旦防火墙守护程序运行,虚拟机中所需的大多数服务,包括 DHCP,将默认被阻止,这意味着您的虚拟机在初始化时将无法访问网络。
我花了一个多小时来解决这个问题,并追溯到我刚刚启用的防火墙是我遇到过的最愚蠢的 bug 源之一。不要让它从你的。
答案3
由于我还无法对获得最多支持的答案添加额外的评论,所以我不得不将此解决方案添加为新答案。
在某些情况下,用户可能不想替换,iptables
因为iptables-nft
它可能会破坏现有规则。
旧版iptables
包包含 的ebtables-nft
符号链接xtables-nft-multi
。
您可以使用文件进行检查:
$ file $(which ebtables-nft)
/usr/bin/iptables: symbolic link to xtables-nft-multi
一个简单的解决方案是创建丢失的符号链接,因此libvirt/virt-manager
无需触及系统上现有的包就可以找到它。
$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables
$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables-save
$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables-restore
随后重新启动libvirt
守护进程/套接字(无论使用什么),网络应该可以启动,而无需防火墙后端错误。