基于virtio的网卡使用.docx
《基于virtio的网卡使用.docx》由会员分享,可在线阅读,更多相关《基于virtio的网卡使用.docx(8页珍藏版)》请在冰豆网上搜索。
基于virtio的网卡使用
基于virtio的网卡使用
基于virtio的网卡使用
0.1版
Contents
1.概要
在QEMU中,默认使用的网卡配置为virtio网卡。
virtio本身是一个framework,使用QEMU加上KVM来进行虚拟I/O,概而言之,virtio是半虚拟化hypervisor中位于设备之上的抽象层。
而virtio网卡则是挂载在virtio模拟的pci总线上的一个虚拟网卡。
在虚拟机开发中一般推荐使用virtio网卡,因为virtio网卡是在虚拟化中速度最快、功能最全面的虚拟网卡。
2.使用virtio的前提
使用virtio需要Guest虚拟机的kernel和Host机的kernel包含相应的驱动,virtio驱动包含前段和后端,也就是说需要在Host的Kernel中添加Back-end的驱动,并在Guest的kernel中添加Front-end的驱动。
2.1前端驱动
Guest机使用的kernel在编译时(makemenuconfig)需要添加如下选项:
[*]Virtualization--->
<*>PCIdriverforvirtiodevices
DeviceDrivers--->
[*]Networkdevicesupport--->
<*>Virtionetworkdriver
DeviceDrivers--->
[*]Blockdevices--->
<*>Virtioblockdriver
第一个选项是在内核中添加virtioPCI驱动,第二个选项时再内核中添加virtio网卡驱动,第三个选项时为了支持virtio的块设备驱动,如virtio硬盘等。
上面是使用virtio所需要选择的最小选项集,另外还可以选择的有:
[*]Virtualization--->
<*>Virtioballoondriver(EXPERIMENTAL)
[*]KVMsupportforPowerPCE500processors
2.2后端驱动
由于Guest使用virtio网卡与外部通讯,所以通讯方式一般选用桥接方式,而为了支持桥接模式,Host机使用的kernel必须支持一下选项:
Networkingsupport--->
Networkingoptions--->
<*>802.1dEthernetBridging
DeviceDrivers--->
[*]Networkdevicesupport--->
<*>UniversalTUN/TAPdevicedriversupport
第一个选项是为了支持桥接模式,第二个选项时为了使用TUN和TAP的功能,其中TUN主要用于NAT穿越,TAP主要用于Host机与Guest虚拟机之间的网络。
2.3使用QEMU创建virtio网卡
qemu-system-ppc-netnic,model=virtio,macaddr=00:
0B:
5D:
99:
82:
2B
其中-netnic为QEMU中创建网卡的选项,model指定为使用virtio网卡,macaddr是指定网卡的MAC地址,以防止创建多个虚拟机时产生MAC地址冲突。
在成功使用virtio网卡之后,Guest虚拟机中会生成指定的网卡数量,使用ifconfig-a查看创建的网卡
3virtio网卡的使用场景
网卡的使用范围一般分为Host机与Guest虚拟机通讯、Guest虚拟机与Guest虚拟机通讯、Guest虚拟机通过Host与外部网络通讯。
目前QEMU支持三种方式的网络连接,分别是NAT、TAP、Bridge。
NAT方式是QEMU默认的网络连接方式,使用这种方式创建的Guest虚拟机只能与外部网络通讯,而无法与Host机以及Host机所在局域网中的其他机器通讯。
使用TAP方式连接相当于vmware中的Host-only,使用这种方法创建的Guest虚拟机只能与Host机通讯,处在一个封闭的环境中,多用于调试使用。
使用Bridge方式连接首先要通过TAP方式创建网卡,然后通过另一个桥接网卡使Guest虚拟机与外部通讯。
3.1Guest虚拟机与Host机通讯
主要使用TAP方式来使Guest虚拟机与Host机通讯,步骤如下:
1.创建两个用于TAP启动/关闭的脚本,用于在Host机上创建一个虚拟网卡,例如
qemu-ifup中使用ifconfig命令创建网卡,$1为传入的参数,默认为tap0,也可以在QEMU命令行-nettap,ifname=tap0指定。
#!
/bin/sh
/sbin/ifconfig$1192.168.1.1netmask255.255.255.0up
sleep2
qemu-ifdown中使用ifconfig命令来关闭虚拟网卡
#!
/bin/sh
/sbin/ifconfig$1down
sleep2
2.使用QEMU启动Guest虚拟机
由于ifconfig创建网卡需要管理员权限,所以用户在使用TAP方式启动网卡时需要使用sudo命令或者本身是管理员root。
sudo/home/shir/install/qemu/bin/qemu-system-ppc-Mmpc8544ds-nographic-kerneluImage-append"root=/dev/ramrwrdinit=/linuxrc"-initrdinitrd-small-netnic,model=virtio,macaddr=00:
0B:
5D:
99:
82:
2A-nettap,script=/home/shir/install/qemu-if/qemu-ifup,downscript=/home/shir/install/qemu-if/qemu-ifdown-m512
这里主要关注两个选项
-netnic用于创建网卡,model指定为使用virtio网卡,macaddr是指定网卡的MAC地址,以防止创建多个虚拟机时产生MAC地址冲突。
-nettap指定使用TAP方式启动,script指向tap网卡的启动脚本,downscript指向tap网卡的关闭脚本,在运行时尽量指定downscript,否则在虚拟机关闭后任然有tap网卡存在。
Guest虚拟机启动后,使用ifconfig-a发现会有网卡eth0存在。
3.设置网卡IP地址
eth0的IP地址网段必须和tap网卡的IP处于同一网段,如启动时tap网卡IP为192.168.1.1,则可以配置eth0为192.168.1.10。
然后使用ping命令可以看到,Guest虚拟机已经可以和Host机通过网卡通讯了。
3.2Guest虚拟机通过Host与外部网络通讯
为了使Guest虚拟机能通过Host与外部网络通讯,需要使用Bridge模式,原理即是使用桥接网卡在虚拟机之间建立一个通道,步骤如下:
1.使用QEMU启动Guest虚拟机
sudoqemu-system-ppc-Mmpc8544ds-nographic-kerneluImage-initrdinitrd-small-netnic,model=virtio,macaddr=00:
0B:
5D:
99:
82:
2A-nettap,script=/home/shir/install/qemu-if/qemu-ifup,downscript=/home/shir/install/qemu-if/qemu-ifdown-m512
和3.1Guest虚拟机与Host机通讯中描述的一样,使用TAP方式创建网卡。
2.配置文件方式创建桥接网卡
由于桥接网卡是一个虚拟网卡,所以可以使用配置,也可以使用命令行来配置。
如果使用配置文件,则首先编译Host机中真实网卡eth0的配置文件:
编译/etc/sysconfig/network-scripts/ifcfg-eth0,主要修改就是注释掉UUID,IPADDR,GATEWAY,修改BOOTPROTO为none(表示不使用网络服务,static为使用静态IP,dpch为使用dhcp分配的IP),添加BRIDGE(指定在eth0和桥接网卡br0之间建立一个桥接)。
DEVICE="eth0"
HWADDR="00:
21:
86:
13:
A6:
9A"
NM_CONTROLLED="no"
TYPE="Ethernet"
#UUID="00c3a007-4b84-4abe-8cdb-8142133a8c19"
BOOTPROTO=none
#IPADDR="10.167.141.218"
#GATEWAY="10.167.141.1"
BRIDGE=br0
添加一个新的桥接网卡的配置文件:
编辑/etc/sysconfig/network-scripts/ifcfg-br0,添加如下配置
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=10.167.141.218
GATEWAY=10.167.141.1
DEVICE为设备名字,ONBOOT指定是否在网络重启时自动启动该网卡,TYPE为网络类型,这里是桥接模式,BOOTPROTO表示IP的分配形式,这里为静态IP,IPADDR指定IP地址,GATEWAY指定网关。
一般配置桥接网卡br0的IP地址为原来网卡eth0的IP地址,这样可以保证外部任然可以使用原来的IP地址访问Host。
添加完配置文件之后需要重启网络服务
servicenetworkrestart
网络服务重启后会生成一个br0的桥接网卡,这样可以使用br0与外部通讯了。
3.手动创建桥接网卡
#先使原来的网卡失效;
sudoifdowneth0
#添加桥接网卡br0并使它生效;
sudobrctladdbrbr0
sudoifconfigbr0up
#配置桥接网卡的IP地址,使用桥来代替原来的网卡,这样xshell等telnet工具可以使用原来的IP地址登陆Host机
sudoifconfigbr010.168.141.218
使用手动创建的桥接网卡和用脚本创建的桥接网卡效果是一样的,不同的是使用手动创建的桥接网卡不需要重启网络服务就可以使用,但是在Host机器重启后配置的网卡会失效,所以需要保存到启动文件中,使Host机器在重启时能自动配置。
4.桥接网卡创建成功后需要配置桥接,才能使虚拟机与虚拟机之间进行通讯
使用桥来连接eth0和tap0,这样虚拟机就能通过tap0和外界通讯了,而且由于使用的是tap方式,虚拟机也还是可以和主机通讯
sudobrctladdifbr0eth0
5.配置Guest虚拟机
当桥接配置完后,需要设置Guest机器的网卡eth0的IP地址,eth0的IP地址网段必须和外部网络的IP处于同一网段,如测试Guest虚拟机与Host网络中的另外一台机器进行通讯,其中,Host的IP为10.167.141.218.Host网络中另外一台机器的IP为10.167.141.216,Guest虚拟机的IP设置为10.167.141.215,测试结果如下:
测试结果为:
Guest虚拟机可以与主机通讯;
Guest虚拟机可以与主机的网络通讯。
3.3Guest虚拟机与Guest虚拟机通讯
Guest虚拟机之间的通讯原理和Guest虚拟机与外部网络通讯的原理一样,也是使用一个桥接网卡搭建一个虚拟机与虚拟机之间的桥接。
1.使用TAP方式启动两个虚拟机
先启动虚拟机1,启动成功后,Host机上会创建一个tap0网卡
sudoqemu-system-ppc-Mmpc8544ds-nographic-kerneluImage-initrdinitrd-small-netnic,model=virtio,macaddr=00:
0B:
5D:
99:
82:
2A-nettap,script=/home/shir/install/qemu-if/qemu-ifup,downscript=/home/shir/install/qemu-if/qemu-ifdown-m512
先启动虚拟机2,启动成功后,Host机上会创建一个tap1网卡
sudoqemu-system-ppc-Mmpc8544ds-nographic-kerneluImage-initrdinitrd-small-netnic,model=virtio,macaddr=00:
0B:
5D:
99:
82:
2B-nettap,script=/home/shir/install/qemu-if/qemu-ifup,downscript=/home/shir/install/qemu-if/qemu-ifdown-m512
需要注意的是两个虚拟机所使用的网卡要配置不同的MAC地址,tap网卡的地址不能相同。
2.创建桥接网卡
创建桥接网卡的方式和4.2.9.3.2.2Guest虚拟机通过Host与外部网络通讯中方法相同。
3.添加桥接
桥接网卡中添加网桥网卡br0到tap0网卡的接口(这一步如果已经配置,则可以跳过)
sudobrctladdifbr0tap0
桥接网卡中添加网桥网卡br0到tap1网卡的接口
sudobrctladdifbr0tap1
4.配置Guest虚拟机
当桥接配置完后,需要设置每个Guest虚拟机的网卡eth0的IP地址,各个虚拟机中的网卡的IP地址网段必须处于同一网段,如测试Guest虚拟机与Guest虚拟机进行通讯,其中,Guest虚拟机1的IP为192.168.1.10,Guest虚拟机1的IP为192.168.1.11,测试结果如下:
测试结果为:
Guest虚拟机1可以和Guest虚拟机2通讯;
Guest虚拟机2可以和Guest虚拟机1通讯。
4使用virtio的效果分析
当Guest机只需要和外部通讯时,一般使用NAT方式,因为这是QEMU默认的联网方式,功能单一;
当Guest机只需要和Host机通讯时,一般使用TAP方式。
当Guest机同时需要和Guest机通讯、和Host通讯、和外部网络通讯方式中的两种或者两种以上的方式,则使用Bridge方式,这是目前QEMU支持的最强大的通讯方式,使用4.2.9.3.2.1Guest虚拟机与Host机通讯、4.2.9.3.2.2Guest虚拟机通过Host与外部网络通讯、4.2.9.3.2.3Guest虚拟机与Guest虚拟机通讯中说明的步骤,可以同时实现所有功能,且不会相互干扰。