QEMU通过OVS实现联网

这篇笔记也是记录了一下自己的辛酸历程,仅供有需要的人参考。

首先关于qemu虚拟机的搭建,这不多赘述了,大家应该都会,这里可以给大家提供一个链接和一些命令。

QEMU搭建X86_64 + Ubuntu虚拟系统环境icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/m0_53195006/article/details/129883054这里主要的内容参考是没问题,就是记得在qemu configure的时候要加入--enable-sdl。

命令如下:

#./configure --enable-kvm --enable-debug --enable-sdl --enable-vnc --target-list=x86_64-softmmu

#create empty img
qemu-img create -f qcow2 ubt1.qcow2 10G

#create ubuntu img
qemu-system-x86_64 -m 2048 -smp 2 --enable-kvm ubt1.qcow2 -cdrom ./ubuntu-16.04.4-server-amd64.iso

#cp ubt1.qcow2 ubt2.qcow2

#start too vms
qemu-system-x86_64 -m 2048 -smp 2 --enable-kvm ubt1.qcow2 -netdev tap,id=tapnet,ifname=vnet0,script=no -device rtl8139,netdev=tapnet,mac=00:11:22:33:44:55

qemu-system-x86_64 -m 2048 -smp 2 --enable-kvm ubt2.qcow2 -netdev tap,id=tapnet,ifname=vnet1,script=no -device rtl8139,netdev=tapnet,mac=00:11:22:33:44:66

这样我们就拥有了两台虚拟机,但是先别启动,先配置好vnet。

然后呢,我们要启动ovs了。首先是安装ovs。

sudo apt update
sudo apt install openvswitch-switch

这里我们可以检查一下ovs是否启动了,看下是否active。

sudo systemctl status openvswitch-switch

如果active了的话,那么就代表启动了。接着做下面的命令,这很好懂。我新建两个tap设备,给两个qemu用。enp6s0是我宿主机的网卡名称。但是做完下面的动作你会发现,本来可以上网的,现在不行了。

sudo tunctl -b -t vnet0
sudo ifconfig vnet0 up
sudo tunctl -b -t vnet1
sudo ifconfig vnet1 up

sudo ovs-vsctl add-br vbr0
sudo ovs-vsctl add-port vbr0 vnet0
sudo ovs-vsctl add-port vbr0 vnet1
sudo ovs-vsctl add-port vbr0 enp6s0

最关键的步骤,因为我是通过dhcp获取的ip地址,所以把enp6s0的ip地址给到vbr0并没有用(靠!!!)。需要

sudo dhclient vbr0

这样vbr0获取到ip地址才可以使用。

配置完之后,我们按照之前的命令启动两个qemu,就发现他们可以上网了,附一张iperf3的图,是两个qemu之间打的。

这里有个问题,我之前在 优快云 上看到有人用bridge也可以实现上网的,但是我做了就不行,还没搞清楚原因。

如果觉得这篇文章有用的话,可以点赞、评论或者收藏,万分感谢,goodbye~ 

### KVM、QEMUOVS 的关系 KVM(Kernel-based Virtual Machine)是一个集成到 Linux 内核中的全功能虚拟机监视器,允许一台计算机运行多个来宾操作系统实例。而 QEMU 是一个通用的开源机器模拟器和虚拟器,在 KVM 上提供了硬件仿真支持。 Open vSwitch (OVS) 则是一种高质量、多层虚拟交换软件解决方案,旨在通过提供分布式虚拟多租户第 2 层网络设备来增强传统网络的功能。当与 KVM 结合时,可以创建复杂的虚拟网络拓扑结构并实现高级流量管理特性[^1]。 ### 安装准备 为了使这些组件协同工作,首先需要确保系统上已正确安装了必要的包和服务: #### 安装 QEMU-KVM 及其依赖项 ```bash yum -y install qemu-kvm ``` 这一步骤会自动拉取所有必需的相关库文件以及工具集,从而简化后续操作过程[^2]。 #### 启动 Libvirt 并设置开机自启 Libvirt 提供了一个抽象层用于管理和控制各种类型的 Hypervisor, 包括但不限于 Xen、Hyper-V 和当然还有这里提到的 KVM/QEMU 组合。 ```bash systemctl start libvirtd systemctl enable libvirtd ``` 此时应该验证 `kvm` 模块是否已被成功加载入内核空间: ```bash lsmod | grep kvm ``` 如果未找到相应记录,则需依据处理器架构分别执行如下指令手动触发加载动作: 对于 Intel 处理器: ```bash modprobe kvm-intel ``` 而对于 AMD 而言则是: ```bash modprobe kvm-amd ``` ### 配置 Open vSwitch 完成上述基础环境搭建之后就可以着手处理 OVS 方面的工作了。通常情况下,默认网桥会被命名为 `virbr0`, 这是由 libvirt 自动创建的一个 NAT 类型接口,适用于简单场景下的 VM 对外通信需求。然而当我们引入 OVS 后往往希望能够构建更为灵活可控的数据平面模型。 因此建议新建专属给 OVS 管辖范围内的独立网桥实体,并将其关联至物理 NIC 或者其他形式的外部连接点之上。具体做法如下所示: 假设主机拥有名为 eth0 的以太网卡作为主要出口路径之一,那么可以通过下面这段 shell 命令序列快速建立起一座基于 OVS 架构的新桥梁设施——ovs-br0: ```bash ovs-vsctl add-br ovs-br0 # 创建新的 OVS Bridge 名叫 'ovs-br0' ovs-vsctl add-port ovs-br0 eth0 # 将物理端口 eth0 添加到此 bridge 下 ip link set dev ovs-br0 up # 开启新建立起来的 bridge 接口状态 ``` 与此同时还需要调整 libvirt 中默认定义好的 XML 文件描述符以便让每一个即将被启动出来的 Guest OS 实例都能够顺利接入由我们刚刚定制完毕的那个特定于 OVS 生态圈里的逻辑转发单元之中去。编辑位于 `/etc/libvirt/qemu/networks/default.xml` 的文档内容使之看起来像这样子[^3]: ```xml <network> <name>default</name> <bridge name='ovs-br0'/> <!-- ...其余部分保持不变... --> </network> ``` 最后重启 libvirtd 来应用更改后的配置选项即可生效整个改动流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值