如何在KVM下实现类似Virtualbox的桥接?

如何在KVM下实现类似Virtualbox的桥接?

我需要将一些虚拟机从 Virtualbox 测试系统移至 KVM 生产主机。主机是完全相同的硬件和软件系统(64 位 Ubuntu Server v16.04,就其重要性而言)的两个副本。

这一切都不太复杂,但涉及网络部分。

对于 virtualbox 的客户机,我有一个 virtio 以太网适配器桥接到主机绑定设备之一。客户机可从主机所连接的网络和主机本身轻松访问。这样,客户机就像“网络上的另一台服务器”。在操作过程中,我看不到除 virbr0 桥之外的任何其他东西。

据我所知,这个简单的设置无法在 KVM 下复制。如果我使用桥接,那么我就无法从客户机到主机进行通信。建议的解决方案是向客户机添加第二个接口以供此类使用。

这是我唯一的选择吗?

然后,如果有任何技术细节,我想知道 Virtualbox 如何做 KVM 无法做到的事情。

答案1

您所描述的是绝对标准的 KVM 桥接配置,几乎在您想查看的任何地方都有记录。这个想法是将主机上的绑定置于桥下(桥可以保存主机的 IP 配置,而不是绑定),并且 VM 将能够像您在 vbox 中习惯的那样使用桥。

一旦主机上有可用的网桥,virt-manager 将允许您选择要连接的共享网络设备(例如新网桥),或者您可以简单地更新 domxml 以便客户机使用网桥而不是默认的 NAT 网络

答案2

这并不像预期的那么容易。@dyasny 的一般提示是正确的:这确实是可行的。这里的主要目标是:

  1. 请勿使用第三方工具(如或virsh)来学习和理解。virtinstlibvirt

  2. 以普通管理非特权用户身份运行虚拟机,无需 root 权限。

以下是我的做法。

  1. /etc/network/interfaces通过注释掉主以太网的行来禁用主主机接口。

  2. 在同一文件中创建包含该接口的网桥。原始接口将松动的进入网桥的 IP。配置文件如下所示:


    auto eth0 # no iface and IP stuff
    auto br0
    iface br0 inet static
        bridge_ports    eth0
        bridge_stp      off
        bridge_maxwait  0
        bridge_fd       0
        address 192.168.255.253/24
        gateway 192.168.255.254
  1. 为 QEMU 创建 ACL 以允许流量进入网桥/etc/quemu/bridge.conf,所有权root:kvm结束权限0640。目录/etc/quemu/需要root:kvm0770

sudo mkdir -v /etc/qemu
# 'br0' is the same name as used in the previous step
echo allow br0 | sudo tee -a /etc/quemu/bridge.conf > /dev/null
sudo chown -R -vc root:kvm /etc/qemu
sudo chmod -vc 0770 /etc/qemu
sudo chmod -vc 0640 /etc/qemu/*
  1. 修复桥接帮助脚本。如果仅对 有效,这才是真正强制性的默认安装root

sudo chmod -vc u+s /usr/lib/qemu/qemu-bridge-helper
  1. 将非特权用户添加到组kvm。您需要注销并重新登录(或打开新会话)才能使此操作生效。

sudo usermod -a -G kvm `id -un`
  1. 重新启动网络。

sudo service networking restart
  1. 现在,当您通过命令行启动虚拟机时,您可以为网络设备使用如下参数列表:

... \
-netdev bridge,id=net0,br=br0

其中net0是枚举的网络设备(本例中为第一个),br0是之前定义的桥接接口的名称。因此,例如,示例完整命令行可以是这样的:


kvm -cpu host -machine q35 -boot order=dc -vga virtio -vnc 127.255.255.1:0 -name qemutest,process=qemutest -uuid 901f83ce-b999-459b-b1b6-a9ba94cac382 -smp cpus=4 -m size=8192 -cdrom /home/user/image.iso -drive file=/home/user/Desktop/QEMU/qemutest/qemutest-D0.qcow2,if=virtio -device virtio-net-pci,mac=02:19:3e:39:a5:de,netdev=net0 -netdev bridge,id=net0,br=br0

答案3

我也花了几天时间寻找答案,仍然没有完全理解,所以无法解释技术细节,但似乎 virtualbox(主机桥)的方式与 macvtap 相比性能不佳。

证据:

http://www.math.cmu.edu/~gautam/sj/blog/20140303-kvm-macvtap.html

答案4

你可以使用 iptables 将内部客户机 IP 与你的公共 IP 进行 NAT,然后使用内部 IP 从 KVM 主机连接到客户机

相关内容