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. mysql 分区后查询效率

    准备工作: 蠕虫复制 文章表 增加数据到112万 语法:insert into  tableNameA  select * from tableNameB       未分区查询  54s 改变现有表 ...

  2. 如何修改hosts文件并生效

    hosts文件位置C:\Windows\System32\drivers\etc(可以建立一个.bat 的文件把(start "" C:\Windows\System32\driv ...

  3. rpm -e ** error :No such file or directory 解决

    参考文章:http://www.redhat.com/archives/rpm-list/2006-June/msg00025.html 我遇到的情况是这样的: 1 先安装包 rpm -ivh tes ...

  4. Luogu P1542包裹快递【实数域二分】 By cellur925

    题目传送门 题目中说:最大值最小,显然是一个二分答案嘛qwq. 我们二分的答案显然是速度,但是由于实际中每一段的速度可能不同,所以这里我们把所有段进行的速度都定为二分出的答案. 二分的步骤好说,只是c ...

  5. 使用pytesseract识别验证码,报错WindowsError: [Error 2]

    问题现象: 按照网上的方式进行代码编写,使用pytesseract模块,然后导入指定图片进行解析,报错WindowsError: [Error 2] 问题原因: 源代码里面的路径设置错误,这里有一个坑 ...

  6. python之重写父类方法

    #修改父类的方法#重写父类的方法的目的是为了给他扩展功能,父类的方法已经不能满足需求#核心思想就一句话,先调用一下你要重写的父类方法,class Coon(object): #基本类 def __in ...

  7. Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)

    题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...

  8. 大数模板 (C ++)

    上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. //可以处理字符串前导零 #i ...

  9. 479 Largest Palindrome Product 最大回文数乘积

    你需要找到由两个 n 位数的乘积组成的最大回文数.由于结果会很大,你只需返回最大回文数 mod 1337得到的结果.示例:输入: 2输出: 987解释: 99 x 91 = 9009, 9009 % ...

  10. C++ <string> 里面的size_type

    string::size_type string的 str.size() 返回值是一个unsigned,实际上返回的是size_type类型的值. string类和其他的大多数标准库类型都定义了几套配 ...