CPU虚拟化

KVM虚拟化是需要硬件支持的。我们可以用 egrep -o '(vmx|svm)' /proc/cpuinfo 来查看是否支持CPU虚拟化。

虚拟机中每一个vCPU对应qemu-kvm中的一个线程,虚拟机的VCPU数量可以超过物理CPU数量,这个叫做CPU的超配(overcommit)。这个特性使得虚拟机可以充分利用宿主机的CPU资源,但前提是在同一时刻,不是所有虚拟机都满负荷运行。

内存虚拟化

KVM通过内存虚拟化共享物理系统内存,动态分配给虚拟机。为了在一台机器上运行多个虚拟机,KVM需要实现VA(虚拟内存)→PA(物理内存)→MA(机器内存)之间的地址转换。虚机OS控制虚拟地址到客户内存物理地址的映射(VA→PA),但是虚机OS不能直接访问实际机器内存,因此KVM需要负责映射客户物理内存到实际机器内存(PA→MA)

存储虚拟化

KVM虚拟化是通过存储池(storage pool)和卷(volume)来管理的

storage pool 是宿主机上可以看到的一片存储空间,可以是多种类型的。volume是在storage pool 中划分出的一块空间,宿主机将volume分配给虚拟机,volume在虚拟机中看到的就是一块硬盘。

目录类型的Storage Pool

KVM将宿主机目录/var/lib/libvirt/images/ 作为默认的Storage Pool。Volume就是该目录下的文件,一个文件就是一个Volume。

KVM所有可以使用的Storage Pool都定义宿主机的/etc/libvirt/storage 目录下,每个Pool 一个 xml 文件,默认有一个default.xml,内容如下

[root@v5 storage]# cat default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh pool-edit default
or other application using the libvirt API.
--> <pool type='dir'>
<name>default</name>
<uuid>6fcbd70e-27ca-46c8-a34c-5651b9d57143</uuid>
<capacity unit='bytes'>0</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>0</available>
<source>
</source>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>

Storage Pool 的类型是“dir”,目录路径就是/var/lin/libvirt/images/。

网络虚拟化

1.Linux Bridge

是Linux上用来做TCP/IP 二层协议交换的设备,基本原理就是创建一个桥接接口 br0 ,在物理网卡和虚拟网络接口之间传递数据。此种方式host却可以和vm联通。

配置Linux Bridge br0

1)添加 br0 网卡的配置文件

cd /etc/sysconfig/network-scripts

cp ifcfg-ens33 ifcfg-br0

2)编辑br0 配置文件

TYPE=Bridge

NAME=br0

DEVICE=br0

ONBOOT=yes

BOOTPROTO=none

IPADDR=192.168.254.20

PREFIX=24

GATEWAY=192.168.254.1

DNS=114.114.114.114

3)修改ens33网卡配置文件

TYPE=Ethernet

NAME=eth0

DEVICE=eth0

ONBOOT=yes

BRIDGE=br0

4)重启服务

systemctl restart network

5)brctl show

bridge name     bridge id               STP enabled     interfaces

br0             8000.000c29f7719c       no              ens33

virbr0          8000.52540041c6a8       yes             virbr0-nic

2.virbr0

是KVM默认创建的一个Bridge,其作用是为连接其上的虚拟机网卡提供NAT访问外网的功能。

virbr0 默认分配了一个192.168.122.1的地址,并为连接其上的虚拟机提供DHCP服务

在virt-manager 打开VM1设置界面,网卡选择default,将VM1的网卡挂在virbr0上

打开虚拟机,设置动态获取IP,可以看到已经获得了一个192.168.122.188的IP,并且可以通外网。

3.VLAN

1)基本概念

LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。

一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。

VLAN
表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个
LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 简单地说,VLAN
将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。

比方说,有两组机器,Group A 和
B,我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。
一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的
VLAN 中。

VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。

现在的交换机几乎都是支持 VLAN 的。 通常交换机的端口有两种配置模式: Access 和 Trunk。如下图

Access 口

这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID
来区分,VLAN ID 的 范围是 1-4096。 Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access
口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。

Trunk 口

假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3,那如何让 AB 上相同 VLAN 之间能够通信呢?

办法是将
A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。
VLAN1, 2, 3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。

2)KVM虚拟环境下VLAN的实现

eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备与之相连。 eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。 eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。

这样的配置其效果就是: 宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。 eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。而 eth0 就是一个 Trunk 口。VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。

eth0.10 的作用是:定义了 VLAN10
brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中

增加一个 VLAN20,如下图

这样虚拟交换机就有两个 VLAN 了,VM1 和 VM2 分别属于 VLAN10 和 VLAN20。

对于新创建的虚机,只需要将其虚拟网卡放入相应的 Bridge,就能控制其所属的 VLAN。
VLAN 设备总是以母子关系出现,母子设备之间是一对多的关系。 一个母设备(eth0)可以有多个子设备(eth0.10,eth0.20 ……),而一个子设备只有一个母设备。

3.配置VLAN

(1)查看核心是否提供VLAN 功能,执行

dmesg | grep -i 802

或者检查/proc/net/vlan目录是否存在。

如果沒有提供VLAN 功能,/proc/net/vlan目录是不存在的。

如果8021q模块没有载入系统,则可以通过使用modprobe模组命令载入802.1q模组,並且利用lsmod命令确认模组是否已经载入到核心内。

modprobe 8021q

lsmod | grep 8021q

设置开机载入8021q模块(可选)

在/etc/sysconfig/modules下增加一个8021q.modules文件,文件内容为modprobe 8021q

vim /etc/sysconfig/modules/8021q.modules

modprobe 8021q

(2)创建vlan接口

创建vlan接口前,在设备上添加一块网卡ens37,

注意:

将BOOTPROTO=static

基于网卡ens37建立vlan10,vlan20接口:ens37.10,ens37.20:

vconfig add ens37 10

vconfig add ens37 20
cd /etc/sysconfig/network-scripts/

cp ifcfg-ens37 ifcfg-ens37.10        -- 创建ens33.10接口配置文件

编辑ifcfg-ens37.10文件,增加/修改下面内容:

vim ifcfg-ens37.10

VLAN=yes

TYPE=vlan

PHYSDEV=ens37

VLAN_ID=10

NAME=ens37.10

ONBOOT=yes

ZONE=trusted

DEVICE=ens37.10

BRIDGE=brvlan-10

#cp ifcfg-ens37.10 ifcfg-ens37.20

编辑ifcfg-ens37.20文件,增加/修改下面内容:

#vim ifcfg-ens37.20

VLAN=yes

TYPE=vlan

PHYSDEV=ens37

VLAN_ID=20

NAME=ens37.20

ONBOOT=yes

ZONE=trusted

DEVICE=ens37.20

BRIDGE=brvlan-20

(3)分别建立网桥brvlan-10,brvlan-20

brctl addbr brvlan-10

brctl addbr brvlan-20

(4)编辑网桥brvlan-10配置文件:

#vim ifcfg-brvlan-10

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-10

DEVICE=brvlan-10

ONBOOT=yes

编辑网桥brvlan-20配置文件:

vim ifcfg-brvlan-20

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-20

DEVICE=brvlan-20

ONBOOT=yes

(5)将网桥brvlan-10接到网口ens34.10,brvlan-20接到网口ens34.20

brctl addif brvlan-10 ens34.10

brctl addif brvlan-20 ens34.20

(6)重新启动网络服务

systemctl restart network

4.网卡绑定(bond)

1)网卡bond(绑定),也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一个虚拟网卡。网卡是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在应用部署中是一种常用的技术。

多网卡绑定实际上需要提供一个额外的软件的bond驱动程序实现。通过驱动程序可以将多块网卡屏蔽。对TCP/IP协议层只存在一个Bond网卡,在Bond程序中实现网络流量的负载均衡,即将一个网络请求重定位到不同的网卡上,来提高总体网络的可用性。

2)网卡绑定的目的:

(1)提高网卡的吞吐量。

(2)增强网络的高可用,同时也能实现负载均衡。

3)网卡配置bond(绑定)bond模式:

(1)Mode=0(balance-rr) 表示负载分担round-robin,平衡轮询策略,具有负载平衡和容错功能。bond的网卡MAC为当前活动的网卡的MAC地址,需要交换机设置聚合模式,将多个网卡绑定为一条链路。

(2)Mode=1(active-backup) 表示主备模式,具有容错功能,只有一块网卡是active,另外一块是备的standby,这时如果交换机配的是捆绑,将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的。

(3)Mode=2(balance-xor) 表示XOR Hash负载分担(异或平衡策略),具有负载平衡和容错功能。每个slave接口传输每个数据包和交换机的聚合强制不协商方式配合。(需要xmit_hash_policy)。

(4)Mode=3(broadcast)  表示所有包从所有interface发出,广播策略,具有容错能力,这个不均衡,只有冗余机制...和交换机的聚合强制不协商方式配合。

(5)Mode=4(802.3ad) 表示支持802.3ad协议(IEEE802.3ad 动态链接聚合) 和交换机的聚合LACP方式配合(需要xmit_hash_policy)。

(6)Mode=5(balance-tlb) 适配器传输负载均衡,并行发送,无法并行接收,解决了数据发送的瓶颈。 是根据每个slave的负载情况选择slave进行发送,接收时使用当前轮到的slave。

(7)Mode=6(balance-alb) 在5的tlb基础上增加了rlb。适配器负载均衡模式并行发送,并行接收数据包。

5和6不需要交换机端的设置,网卡能自动聚合。4需要支持802.3ad。0,2和3理论上需要静态聚合方式,但实测中0可以通过mac地址欺骗的方式在交换机不设置的情况下不太均衡地进行接收。

常用的有三种:

mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。

mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。

mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。

4)配置Mode=6模式

(1)添加四块网卡,都配置绑定为bond0,例如:

cat ifcfg-ens37

TYPE=Ethernet

BOOTPROTO=none

DEVICE=eth1

ONBOOT=yes

MASTER=bond0

SLAVE=yes

载入bond模块:

modprobe bonding

(2)查看bond0,并桥接到br1

cat ifcfg-bond0

DEVICE=bond0

TYPE=Bond

NAME=bond0

BONDING_MASTER=yes

BOOTPROTO=static

USERCTL=no

ONBOOT=yes

BONDING_OPTS="mode=6 miimon=100"

BRIDGE=br1

(3)创建网桥br1并编辑配置文件

brctl addbr br1
cat ifcfg-br1

TYPE=Bridge

DEVICE=br1

ONBOOT=yes

NAME=br1

BOOTPROTO=static

(4)创建网口br1.10 br1.20 并编辑配置文件

vconfig add br1 10

vconfig add br1 20
vim ifcfg-br1.10

VLAN=yes

TYPE=vlan

PHYSDEV=br1

VLAN_ID=10

NAME=br1.10

ONBOOT=yes

ZONE=trusted

DEVICE=br1.10

BRIDGE=brvlan-10

(5)创建brvlan并编辑配置文件

brctl addbr brvlan-20

brctl addbr brvlan-20
vim ifcfg-brvlan-10

TYPE=bridge

BOOTPROTO=static

NAME=brvlan-10

DEVICE=brvlan-10

ONBOOT=yes

(6)将网桥接到网口

brctl addif brvlan-10 br1.10

brctl addif brvlan-10 br1.20

(7)brctlshow

bridge name       bridge id           STP enabled     interfaces

br0             8000.000c29a1940e        no             ens33

br1             8000.000c29a19418        no             bond0

brvlan-10       8000.000c29a19418        no             br1.10

brvlan-20       8000.000c29a19418        no             br1.20

virbr0          8000.525400de6b4d       yes           virbr0-nic

(8)重启网络服务

systemctl restart network

VLAN+Linux Bridge可以实现虚拟交换机的功能

KVM虚拟化原理的更多相关文章

  1. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  2. [原] KVM 虚拟化原理探究 —— 目录

    KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...

  3. [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化

    KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...

  4. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  5. [原] KVM 虚拟化原理探究(4)— 内存虚拟化

    KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...

  6. [原] KVM 虚拟化原理探究(3)— CPU 虚拟化

    KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...

  7. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  8. KVM虚拟化原理与基础应用示例

    一.KVM简介 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调 ...

  9. KVM 虚拟化基本知识,virtio工作原理

    KVM虚拟化的基本知识,virtio的工作流程及原理,virtio-vhost, virtio-vhost-user pci 配置空间,是谁在kick 写pci配置空间的?又是通过什么机制通知给qem ...

随机推荐

  1. linux命令系列

    Linux系统安装node linux安装rz sz命令:yum install lrzsz上传tar包:rz node-v10.15.0-linux-x64.tar.xz将tar包移到上一级目录下: ...

  2. TTTTTTTTTTTTTTTTTTT UVA 2045 Richness of words

    J - Richness of words Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64 ...

  3. 13. Ajax技术

    在传统的Web应用模式中,页面中用户的每一次操作都将触发一次返回Web服务器的HTTP请求,服务器进行相应的处理后,返回一个HTML页面的客户端.而在Ajax应用中,页面中的用户的操作将通过Ajax引 ...

  4. c++ gdb调试的基本使用

    https://blog.csdn.net/zdy0_2004/article/details/80102076

  5. jstack+jdb命令查看线程及死锁堆栈信息

    如果程序挂死,有时使用jstack查看进程中线程信息时,需要添加上-F参数,此时如果有死锁信息,则可能不会打印出死锁堆栈信息,使用jdb则可以查看当前死锁线程的运行堆栈. 如下模拟一个简单的死锁程序 ...

  6. 链表反转 C++

    ListNode* reverse1(ListNode* pHead) { if(pHead == NULL) return NULL; ListNode * p1 = NULL; ListNode ...

  7. idea将springboot打包成jar或者war

    1.首先在pom.xml中添加下面配置 <groupId>com.melo</groupId> <artifactId>focus</artifactId&g ...

  8. HAproxy负载均衡-ACL篇(转) blog.csdn.net/tantexian

    ACL定制法则: 开放策略:拒绝所有,只开放已知 拒绝策略:允许所有,只拒绝某些 事实上实现安全策略,无非也就是以上两种方法 redirect 参考:http://cbonte.github.io/h ...

  9. html 网页源码解析:bs4中BeautifulSoup

    from bs4 import BeautifulSoup result=requests.request("get","http://www.baidu.com&quo ...

  10. Mysql密码忘记,修改密码方法

    1.set password for ‘root’@’localhost’ = password(‘czllss’); -- czllss为新密码