emu-kvm主要向客户机提供了如下4种不同模式的网络:

1)基于网桥(bridge)的虚拟网卡

2)基于NAT(Network Addresss Translation)的虚拟网络

3)QEMU内置的用户模式网络(user mode networking)(QEMU/KVM的默认方式

4)直接分配宿主机上的网络设备的网络(包括VT-d和SR-IOV)

除了特别的需要iptables配置端口映射、数据包转发规则的情况,一般默认将防火墙所有规则都关闭,以避免妨碍客户机中的网络畅通

在QEMU命令行中,对客户机网络的配置(除物理网络设备直接分配外)都是用"-net"参数进行配置的,

如果没有设置任何的"-net"参数,默认使用"-net nic -net user"参数,进而使用完全基于QEMU内部实现的用户模式下的网络协议栈

qemu-kvm提供了对一系列主流和兼容性良好的网卡的模拟,通过"-net nic,model=?"参数可以查询到当前的qemu-kvm工具实现了哪些网卡的模拟

"rtl8139"网卡模式qemu-kvm默认的模拟网卡类型

"e1000"是提供Intel e1000系列的网卡模拟,纯的QEMU(qemu-kvm)默认就是提供Intel e1000系列的虚拟网卡

  virtio类型是qemu-kvm对半虚拟化IO(virtio)驱动的支持

qemu-kvm命令行在不加任何网络相关的参数启动客户机后,在客户机中可以看到它有一个默认的RTL8139系列的网卡,当然由于没有进行更多的网络配置,这个模拟的网卡虽然在客户机中可见,但是它使用的是用户模式的网络,其功能非常有限

查看物理机中的网卡信息:

lspci | grep Ethernet

qemu-kvm命令行中基本的"-net"参数的细节如下:

-net  nic[, vlan=n ] [,m acaddr=mac] [,model=type ][,name=name] [,addr=addr]  [,vectors=v]

执行这个命令行会让QEMU建立一个新的网卡并将其连接到n号VLAN上

其中:

"-net  nic"是必需的参数,表明这是一个网卡的配置。

1)vlan=n, 表示将网卡放入到编号为nVLAN,默认为0

2)macaddr=mac, 设置网卡的MAC地址,默认会根据宿主机中网卡的地址来分配。若局域网中客户机太多,建议自己设置MAC地址,以防止MAC地址冲突。

3)model= type, 设置模拟的网卡的类型,在qemu-kvm中默认为rtl8139。使用qemu-kvm  -net nic,model=? 查询kvm支持的网卡类型

4)name=name, 为网卡设置一个易读的名称,该名称仅在QEMU monitor中可能用到。

5)addr=addr, 设置网卡在客户机中的PCI设备地址为addr

6)vectors=v, 设置该网卡设备的MSI-X向量的数量为n仅对使用virtio驱动的网卡有效。设置为"vectors=0"是关闭virtio网卡的MSI-X中断方式

示例:

-net  vlan=0,macaddr=fe:54:00:86:0d:04,model=rtl8139 ,name=eth0,addr=0x0

如果需要向一个客户机提供多个网卡,可以多次使用"-net"参数

客户机(即虚拟机中)中用一些工具查看网卡相关的信息如下:

lspci|grep Ethernet

ethtool -i eth1                             #-i选项仅显示驱动信息

ifconfig

在QEMU monitor中查看网络的信息,如下:

info  network

一、桥接网络(客户机和宿主机平等,都是局域网中的一个节点,二者网络环境相同,类似vmare中桥接网络)

在QEMU/KVM的网络使用中,网桥(bridge)模式可以让客户机和宿主机共享一个物理网络设备连接网络,客户机有自己的独立IP地址,可以直接连接与宿主机一模一样的网络,客户机可以访问外部网络,外部网络也可以直接访问客户机(就像访问普通物理主机一样)。即使宿主机只有一个网卡设备,使用bridge模式也可知让多个客户机与宿主机共享网络设备

qemu-kvm的命令行中,关于bridge模式的网络参数如下:

-net  tap [,vlan=n] [,name=str] [,fd=h] [,ifname=name] [,script=file] [,downscript=dfile] [,helper=helper] [,sndbuf=nbytes] [,vnet_hdr=on|off] [,vhost=on|off] [,vhostfd=h] [,vhostforce=on|off]

该配置表示连接宿主机的TAP网络接口到nVLAN,并且使用file和dfile两个脚本在启动客户机时配置网络和在关闭客户机时取消网络配置

1)  tap参数,表明使用TAP设备。TAP是虚拟网络设备,它仿真了一个数据链路层设备(ISO七层网络结构的第二层,需要IP地址,仅有mac地址),它像以太网的数据帧一样处理第二层数据报。而TUNTAP类似,也是一种虚拟网络设备,它是对网络层设备的仿真。TAP用于创建一个网络桥,而TUN与路由相关。

2)  vlan=n, 设置该设备VLAN编号,默认值为0。

3)  name=name, 设置名称,QEMU monior中可能用到,一般由系统自动分配即可

4)  fd=h, h为整数,是连接到已经打开的TAP接口的文件描述符,一般不要设置该选项,而是让QEMU自动创建一个TAP接口。在使用了fd=h的选项后,ifnamescriptdownscripthelpervnet_hdr等选项都不可使用了(不能与fd选项同时出现在命令行中)

5) ifname=name , 设置在宿主机中添加的TAP虚拟设备的名称(如tap1tap5等),当不设置这个参数时,QEMU会根据系统中目前的情况,产生一个TAP接口的名称。

6) script  file, 设置宿主机在启动客户机时自动执行的网络配置脚本
                        如果不指定,其默认值为"/etc/qemu-ifup"这个脚本,可指定自己的脚本路径以取代默认值;
                        如果不需要执行脚本,则设置为"script=no"。

7) downscript=file, 设置宿主机在客户机关闭时自动执行的网络配置脚本
       如果不设置,其默认值为"/etc/qemu-ifdown";
       如果户机关闭时宿主机不需要执行脚本,则设置为"downscript=no"。

8)helper=helper, 设置启动客户机时在宿主机中运行的辅助程序,包括建立一个TAP虚拟设备,默认值为/usr/local/libexec/qemu-bridge-helper(编译安装)。一般不用自定义,采用默认值即可

9) sndbuf=nbytes, 限制TAP设备的发送缓冲区大小为n字节, 当需要流量进行流量控制时可以设置该选项。其默认值为"sndbuf=0", 即不限制发送缓冲区的大小。

示例:

-net tap
ifname=vnet0,script=/etc/qemu-ifup,downscript=no

其余几个选项都是与virtio相关的,需要配合virtio使用

1)vnet_hdr =on | off, 设置是否打开TAP设备的"IFF_VNET_HDR"标识
          "vnet_hdr= off''表示关闭这个标识,
          "vnet_hdr=on" 表示强制开启这个标识,如果没有这个标识的支持,则会触发错误。

IFF_VNET_HDRtun/tap的一个标识,打开这个标识则允许发送或接受大数据包时仅做部分的校验和检查。打开这个标识,还可以提高virtio_net驱动的吞吐量

2)vhost=on | off, 设置是否开启vhost-net这个内核空间的后端处理驱动只对使用MIS-X中断方式的virtio客户机有效。

3)vhostfs=h,设置去连接一个已经打开的vhost网络设备

4)vhostforce=on | off,设置是否强制使用vhost作为非MSI-X中断方式的virtio客户机的后端处理程序

准备环境:

宿主机上进行如下操作

1) 要采用bridge模式的网络配置,首先需要安装两个RPM包,即bridge-utils和tunctl,它们提供所需的brctl和tunctl命令行工具

yum  install  bridge-utils   -y

tunctl工具可选安装,centos 7.x系列需要编译安装

2) 查看tun模块是否加载,如下:

lsmod | grep tun                #注意这个模块于是否安装tunctl工具无关

如果tun模块没有加载,则运行"modprobe tun"命令来加载。当然,如果已经将tun编译到内核(可查看内核config文件中是否有"CONFIG_TUN=y"选项),则不需要加载了。如果内核完全没有配置TUN模块,则需要重新编译内核才行

3) 检查/dev/net/tun的权限,需要让当前用户拥有可读写的权限。

ll  /dev/net/tun

4) 建立一个bridge,并将其绑定到一个可以正常工作的网络接口上,同时让bridge成为连接本机与外部网络的接口(下面设置是临时生效,重启机器或重启网络服务后,将会失效,最好是写入到网卡配置文件中)

主要的配置命令如下:

brctl  addbr  br0

brctl  addif  br0  eth0      #这一步如果是ssh远程连接将会断开

brctl  stp  br0  on

ifconfig  eth0  0

dhclient  br0      这一步是自动获取ip地址,可手动设置

route

需要将默认路由设备设置为br0

ping         #测试网络,ping外网

5 ) 准备qemu-ifup和qemu-ifdown脚本。

在客户机启动网络前会执行的脚本是由"script"选项配置的脚本(默认为/etc/qemuif-up),该脚本中创建一个TAP设备并将其与bridge绑定起来

qemu-ifup脚本中"$1"qemu-kvm命令工具传递给脚本的参数(即ifname选项的值),它是(在宿主机使用ifconfig可看到)客户机使用的TAP设备名称(如tap0、tap1等,或者是前面提及的ifname选项的值)。

另外,其中的"tunctl"命令这一行是不需要的,因为qemu-bridge-helper程序已经会创建好TAP设备,这里列出来只是因为在一些版本较旧的qemu-kvm中可能没有自动创建TAP设备

cat  >> /etc/qemu-ifup<<end

#!/bin/bash

#

bridge=br0

if [ -n "$1" ];then

tunctl    -u $(whoami)   -t $1

ip link set $1 up

sleep 1

brctl addif $bridge $1

[ $? -eq 0 ] && exit 0 || exit 1

else

echo "Error: no interface specified."

exit 1

fi

end

qemu-kvm工具在客户机关闭时会自动解除TAP设备与bridge绑定,也会自动删除已不再使用的TAP设备,所以qemu-ifdown这个脚本不是必需的,最好设置为"downscript=no"

安装虚拟机:

qemu-kvm  --enable-kvm  -m 2048 -smp 2  \

-boot order=cd -hda /kvm/os/cs-01.qcow2 \

-cdrom /kvm/iso/CentOS-7-x86_64-Minimal-1804.iso \

-vnc :1 \

-net nic      -net tap,ifname=tap0,script=/etc/qemu-ifup.sh,downscript=no \

-daemonize

启动虚拟机:

qemu-system-x86_64     /kvm/os/cs-01.qcow2  -smp 2  -m 2048 \

-net nic  -net tap,ifname=tap1,script=/etc/qemu-ifup,downscript=no  \

-vnc :0  \

-daemonize

brctl  show        #如果在br0上绑定了tap设备,说明成功

ls  /sys/devices/virtual/net/

使用vncviewer登录到客户机上,设置网络(此时一定要像配置物理机一样配置网络环境)

KVM中的网络简介(qemu-kvm)的更多相关文章

  1. KVM(七)使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    本文将梳理 QEMU/KVM 快照相关的知识,以及在 OpenStack Nova 中使用 libvirt 来对 QEMU/KVM 虚机做快照的过程. 1. QEMU/KVM 快照 1.1 概念 QE ...

  2. KVM 介绍(6):Nova 通过 libvirt 管理 QEMU/KVM 虚机 [Nova Libvirt QEMU/KVM Domain]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  4. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  5. QEMU KVM Libvirt(12): Live Migration

    由于KVM的架构为 Libvirt –> qemu –> KVM 所以对于live migration有两种方式,一种是qemu + KVM自己的方式,一种是libvirt的方式,当然li ...

  6. Qemu/kvm虚拟化源码解析学习视频资料

    地址链接:tao宝搜索:Linux云计算KVM Qemu虚拟化视频源码讲解+实践​https://item.taobao.com/item.htm?ft=t&id=646300730262 L ...

  7. 理解 Linux 网络栈(3):QEMU/KVM + VxLAN 环境下的 Segmentation Offloading 技术(发送端)

    本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...

  8. KVM/QEMU桥接网络设置及kvm资料

    KVM/QEMU桥接网络设置 配置kvm的网络有2种方法.其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送.其二,使用桥接方式(Brid ...

  9. QEMU/KVM网络模式(二)——NAT

    在QEMU/KVM中,默认使用IP伪装的方式去实现NAT,而不是用SNAT或DNAT的方式. 1.安装软件包 # yum -y install bridge-utils iptables dnsmas ...

随机推荐

  1. 当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录

    当打开一个.h或.cpp文件时,  Solution Explorer就自动展开文件所在的目录: 如果不想展开: Tools           -> Options           -&g ...

  2. python __builtins__ filter类 (24)

    24.'filter', 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True ...

  3. hdu 4704 Sum【组合数学/费马小定理/大数取模】By cellur925

    首先,我们珂以抽象出S函数的模型:把n拆成k个正整数,有多少种方案? 答案是C(n-1,k-1). 然后发现我们要求的是一段连续的函数值,仔细思考,并根据组合数的性质,我们珂以发现实际上答案就是在让求 ...

  4. iOS Swift3 用全局“宏”时要注意的问题

    当你需要定义一个APP全局“宏”来调用 UserDefaults.standard里存储的值的时候, 一定要将这个“宏”定义为计算属性,否则你得到的值只会在APP启动的时候计算一次. 示例如下: va ...

  5. 跟我一起玩Win32开发(8):绘图(A)

    从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相 ...

  6. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) 题解

    真心简单的一场比赛 就是坑比较多(自己太蠢) A是一个水题 3分钟的时候过了 B也是一个比较简单的题 类似的套路见得多了 但是我当时可能比较困 想了一会才想出来 19分钟的时候过掉了 C同样很显然 性 ...

  7. G. 24 观察 + 树状数组

    http://codeforces.com/gym/101257/problem/G 首先要看到题目,题目是本来严格大于score[i] > score[j].然后score[i] < s ...

  8. 【学习笔记】深入理解js原型和闭包系列学习笔记——精华

    深入理解js原型和闭包笔记: 1.“一切皆是对象”,对象是属性的集合. 丨 函数也是对象,但是使用typeof时为什么函数返回function而 丨  不是object呢,js为何要对函数做这样的区分 ...

  9. CCF|火车购票|Java|80分

    import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...

  10. Redis为什么这么快

    Redis为什么这么快 1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1): 2.数据结构简单, ...