libvirt:“无法初始化有效的防火墙后端”

tes*_*dby 30 networking qemu virtual-machine linux-kvm libvirt

我正在尝试在 Arch Linux 主机上为 libvirt 设置一个没有 DHCP 的虚拟 NAT 网络设备。

我尝试过的:

# virsh net-define network.xml 
Network default defined from network.xml
Run Code Online (Sandbox Code Playgroud)

[ network.xml]:

<network>
  <name>default</name>
  <bridge name="maas0" />
  <forward mode="nat" />
  <ip address="10.137.0.1" netmask="255.255.255.0" />
</network>
Run Code Online (Sandbox Code Playgroud)

我的笔记本电脑在启动时输出以下内容:

# virsh net-start default
error: Failed to start network default
error: internal error: Failed to initialize a valid firewall backend
Run Code Online (Sandbox Code Playgroud)

与此主题相关的所有其他线程都在谈论升级软件——我使用的是最新版本:

$ 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
Run Code Online (Sandbox Code Playgroud)

这可能是什么原因,internal error我可以做什么?

小智 49

安装ebtablesdnsmasq似乎解决了问题。不要忘记重新启动libvirtd服务。

命令:

sudo pacman -Syu ebtables dnsmasq
sudo systemctl restart libvirtd
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记关闭并重新打开您的virt-managerGUI(如果您正在使用)。

编辑:原始答案还建议安装firewalld. 对于许多用户来说,这似乎不是必需的,并且可能会向您的系统添加额外的不需要的防火墙。但是,如果您想尝试一下,也可以添加以下命令:

sudo pacman -Syu firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl restart libvirtd
Run Code Online (Sandbox Code Playgroud)

  • 不需要安装`firewalld`,它也[未在ArchLinux wiki上列出](https://wiki.archlinux.org/index.php/libvirt#Server),只需要启动`ebtables`和`dnsmasq` , 之后使用 `libvirtd`/`virtlogd`。 (17认同)
  • 我想强调一下,在安装了 `ebtables` 和 `dnsmasq` 之后,**重启 libvirtd** (14认同)
  • 我确认不需要安装`firewalld`,正如@pepper_chico(评论)和[Stuart P. Bentley](https://superuser.com/a/1360773/1038080)(其他答案)所述。 (4认同)

Stu*_*ley 11

如果 libvirtd 在未安装和/或未安装的情况下启动,则会出现此错误。如果您已经安装了它们并且仍然遇到此问题,则可能需要重新启动该服务:ebtablesdnsmasqlibvirtd

sudo systemctl restart libvirtd.service
Run Code Online (Sandbox Code Playgroud)

归功于对此问题的另一个答案 评论,以阐明这一点。我将其作为对原始问题的新的单独答案提交,因为安装并开始firewalld解决原始问题可能会导致新问题:一旦防火墙守护程序运行,您需要在虚拟机中的大部分服务,包括 DHCP,将在默认情况下被阻止,这意味着您的虚拟机将无法在初始化时访问网络。

我花了一个多小时试图追踪这个问题,而将它追踪到我刚刚启用的防火墙是我遇到过的最愚蠢的错误来源之一。不要让它占用你的时间。