我需要将一些虚拟机从 Virtualbox 测试系统移至 KVM 生产主机。主机是完全相同的硬件和软件系统(64 位 Ubuntu Server v16.04,就其重要性而言)的两个副本。
这一切都不太复杂,但涉及网络部分。
对于 virtualbox 的客户机,我有一个 virtio 以太网适配器桥接到主机绑定设备之一。客户机可从主机所连接的网络和主机本身轻松访问。这样,客户机就像“网络上的另一台服务器”。在操作过程中,我看不到除 virbr0 桥之外的任何其他东西。
据我所知,这个简单的设置无法在 KVM 下复制。如果我使用桥接,那么我就无法从客户机到主机进行通信。建议的解决方案是向客户机添加第二个接口以供此类使用。
这是我唯一的选择吗?
然后,如果有任何技术细节,我想知道 Virtualbox 如何做 KVM 无法做到的事情。
答案1
您所描述的是绝对标准的 KVM 桥接配置,几乎在您想查看的任何地方都有记录。这个想法是将主机上的绑定置于桥下(桥可以保存主机的 IP 配置,而不是绑定),并且 VM 将能够像您在 vbox 中习惯的那样使用桥。
一旦主机上有可用的网桥,virt-manager 将允许您选择要连接的共享网络设备(例如新网桥),或者您可以简单地更新 domxml 以便客户机使用网桥而不是默认的 NAT 网络
答案2
这并不像预期的那么容易。@dyasny 的一般提示是正确的:这确实是可行的。这里的主要目标是:
请勿使用第三方工具(如或
virsh
)来学习和理解。virtinst
libvirt
以普通管理非特权用户身份运行虚拟机,无需 root 权限。
以下是我的做法。
/etc/network/interfaces
通过注释掉主以太网的行来禁用主主机接口。在同一文件中创建包含该接口的网桥。原始接口将松动的进入网桥的 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
- 为 QEMU 创建 ACL 以允许流量进入网桥
/etc/quemu/bridge.conf
,所有权root:kvm
结束权限0640
。目录/etc/quemu/
需要root:kvm
和0770
:
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/*
- 修复桥接帮助脚本。如果仅对 有效,这才是真正强制性的默认安装
root
。
sudo chmod -vc u+s /usr/lib/qemu/qemu-bridge-helper
- 将非特权用户添加到组
kvm
。您需要注销并重新登录(或打开新会话)才能使此操作生效。
sudo usermod -a -G kvm `id -un`
- 重新启动网络。
sudo service networking restart
- 现在,当您通过命令行启动虚拟机时,您可以为网络设备使用如下参数列表:
... \
-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 主机连接到客户机