KVM虚拟化系统学习笔记

大道之行,天下为公。这篇文章主要讲述KVM虚拟化系统学习笔记相关的知识,希望能为你提供帮助。
第一章 KVM虚拟化系统的基本概念1.1虚拟化系统基本概念1.1.1虚拟化系统架构



1.1.2软件虚拟化和硬件虚拟化
  ?      ?实现虚拟化的关键:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重新定向到虚拟资源池中。
?      ?根据“截获、重定向”的方式,虚拟化可分为软件虚拟化和硬件虚拟化。
软件虚拟化:用纯软件的方式实现“截获、重定向”;如:?QEMU、Vmware的软件虚拟化
【KVM虚拟化系统学习笔记】      优点:可在硬件不支持虚拟化的环境中运行;?
?      ?缺点:性能较差。?
  硬件虚拟化:物理资源本身提供了对“截获、重定向”功能的支持;如:?Intel virtualizationTechnologgy(Intel VT) ,AMD-V
?  ?            ?优点:虚拟化硬件支持?Guest OS?直接在其上面运行,无需进行二进制转换,性能较软件虚拟化更优;
?          ?缺点:需要物理资源支持?VT?功能,需要CPU、主板芯片组、Bios支持VT。
1.1.3 准虚拟化和全虚拟化
准虚拟化:基于希望解决软件虚拟化性能上的损失,提出了一项解决方案:改动?Guest OS?的代码,使它以为自己是运行在虚拟化环境中,可于虚拟系统协同工作。这种方法称为准虚拟化。
注解:
?            ?张三:一个运行在虚拟化环境中的?Guest OS(Linux),但是他的代码告诉他,他是一个操作系统,于是他理所当然认为自己是直接运行在物理资源上,理所应当可以直接调用物理资源。
?      ?张二:一个运行在虚拟化环境中的?Guest OS(windows)
?      ?李四:底层操作系统,“哼哼,老子才是真正的操作系统。”?
?      ?王五:虚拟化系统?
?      ?赵六:物理资源?
张三:“赵六,我需要物理资源!”
赵六:“你丫只是个应用程序,想要物理资源,让你老大李四跟我说。”
李四:“张三,你丫只是个应用程序,还想冒充操作系统?,?滚一边去!”
张三:“靠,老子明明是操作系统!”
王五:“张三,你小子只是我搞出来的山寨货,想要物理资源,得先问我。”
张三: “王王大哥,给点物理资源吧!”
王五:“好的,你等着,让我跟底层操作系统骗点!”“李四大哥,张三这二货只是个应用程序,他让我跟您申请点物理资源,麻烦您处理一下!”
李四:“还是王五懂规矩,现在刚好有多余的物理资源,拿去用吧!”
(虚拟化系统截获了Guest OS对物理资源的直接访问,并将Guest OS?的访问需求重定向到自己,实现了基于软件的全虚拟化)
张二(windows)?:“赵六,给我一些物理资源!”
赵六:“滚犊子!”
王五:“你个二货,要资源跟我申请啊,不要直接去找赵六老大了,不知道自己的身份吗?”
张二:“唉,造孽啊!”
王五:“唉,总这样也不行啊,这两二货天天骚扰赵六老大,总有一天被打断腿。这样,我来给这个两二货洗洗脑,让他有需求来找我!”
给张三洗脑中……..(修改Guest OS代码,让它以为自己就是运行在虚拟化系统中,实现准虚拟化。)
给张二(windows)洗脑中…….“唉,这个张二是个又丑又硬的货,洗脑不成功哇” (windows?是闭源系统,无法修改源代码,无法实现准虚拟化。??
张三:我又需要物理资源了,“赵六…….?”,唉不对,要资源应该跟王五要哇。
?                  ?“王五哥,我需要物理资源!”?
王五:“这才乖嘛,等着,我去跟李四哥要去。
……………………
张三:"?王五哥,我要物理资源,我又要资源了"
王五?:"靠,你想累死我啊,等着….."
张三?:"?快点,我急着用呢"
王五?:"?急毛线啊,等着,唉,累死我了."
(由于Guest OS每次需要物理资源都需要虚拟化系统转发,基于软件的全虚拟化系统性能低下)
全虚拟化:??
?          ?为客户机提供了全套虚拟硬件平台,包括? CPU?、内存、外设等。支持任何可以真实物理物理平台上运行的操作系统。
?  ?基于软件的全虚拟化系统性能较为低下。
?        ?基于硬件的全虚拟化系统是现在主流的虚拟化技术的核心。?
?        ?性能比较:?
基于硬件的全虚拟化 》基于软件的准(半)虚拟化 》基于软件的全虚拟化
KVM系统的?CPU和内存虚拟化,为基于硬件的全虚化模式;?
                                    外设(磁盘、网卡等I/O设备),为基于软件的全虚拟化模式;
                                    通过virtio技术,也可实现外设的准(半)虚拟化,可提高外设的性能。
1.1.4 KVM系统介绍
Kernel Virtual Machine?  ?:内核虚拟机?
?              ?2006年由?Qumranet?公司发布,同年10月被正式纳入Linux Kernel,成为内核源代码的一部分。
?            ?2008年?9月4日,Redhat收购了Qumranet公司。
?          ?2010年?11?月,Redhat发布RHEL 6.0,这个改造版中,用KVM取代了原来xen系统。
  ?      ?在?KVM?系统中,每个虚机都是Linux的一个常规进程,由Linux调试程序进行调度。
?      ?KVM本身并不执行任何模拟,需要用户空间程序来进行实现硬件模拟功能。?
这个空间程序就是大名鼎鼎的?QEMU。
KVM系统架构:

KVM模块:
?            ?KVM模块是?KVM?虚拟机系统的核心部分,主要功能是打开硬件的虚拟化功能,创建特殊设备文件:/dev/kvm,并等待来自用户空间的命令。
?          ?QEMU:用户空间程序,虚拟机的创建、运行、管理等操作,是?QEMU和KVM模块相互配合的过程。
注解:如果把KVM模块看作是一个系统内核的话,那QEMU?就是操作系统,而Virsh?、Virt-manager?等管理工具就是应用程序。
QEMU本身就是一个开源虚拟机软件,是用纯软件方式实现虚拟化的,因此性能比较低下。
QEMU和KVM的结合,是典型的开源系统的代码共用和合作。
QEMU不但可以和KVM结合使用,还可以和其它虚拟机系统结合使用,比如Xen.?
1.2 KVM实验环境的搭建1.2.1 KVM系统安装
第一步:在BOIS中打开电脑的虚拟化功能(一般现在的电脑支持)

第二步:安装?vmware workstation?
?          ?由于学习成本的问题,我们不可能每个人都去购买一台服务器来做实验,因此推荐使用?vmware workstation?这个虚拟化软件来搭建实验环境。
Vmware workstation下载链接:??https://www.vmware.com/go/getworkstation-win????
?        ?下载完安装包后,跟普通软件一样安装就行。?



第三步:新建虚拟机
点击“文件”?--?“新建虚拟机” 















centos?安装界面
GUI?界面安装上



查看内核版本:
命令:uname -r ?

查看?centos?版本:
命令?:cat /etc/centos-release?

各种版本在操作上可能会有所不同,不过都是大同小异。
确认?KVM?模块是否被加载
命令:lsmod | grep kvm



确认?qemu?是否已安装:
命令:rpm -qa | grep qemu

安装?qemu?
yum install qemu-kvm
安装管理工具和应用程序接口:?libvirt?
yum install libvirt -y
安装管理工具:?virt-install,virt-manager,virsh?
Yum install virt-install virt-manager


到些为止,KVM环境基本架设完毕。


1.2.2小试牛刀,创建第一个虚拟机
第一步:创建一个虚拟机的镜像文件(相当于虚机的存储空间)
dd  if=/dev/zero of=kvm1bs=1M count=8096


第二步:?Qemu-kvm?执行程序默认在/usr/libexec/下面,需要在/sbin下创建qemu-kvm命令的软链接:
  ln /usr/libexec/qemu-kvm/sbin -s


第三步:用?qemu?开启虚拟机,其操作界面默认运行在VNC下,所以要安装VNC
yum install tigervnc


第四步:启动虚机机并开始安装?Guest OS?
Qemu-kvm -hda kvm1 -cdrom /XXX.iso -boot oder=cd,once=d -vnc0.0.0.0:0


第五步:查看系统监听端口,确认?VNC?服务已经起来:
netstat -tupln


第六步:在?centos?图形界面中,用vncviewer工具进入虚机的操作界面:
Vncviewer :0


第七步:也可以用?windows?版的vncviewer进入虚机的操作界面:不过需要防火墙放通
Firewall-cmd --add-service=vnc-server
第二章虚拟机的基本配置(qemu-kvm)2.1使用qemu-kvm配置虚拟机的CPU
虚拟化系统中?CPU?的一些概念:
?              ?VCPU:虚拟机?(guest  os)?中拥有的cpu即称为vcpu.
?              ?每个?guest os?都是宿主机OS中的一qemu进程;
?              ?每个?vcpu?则是qemu进程派生出来的一个线程。
进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
SMP和numa?
Smp:symmetric multi-processor(对称多处理器)
?      ?多?CPU?通过一个总线访问内存。
?      ?缺点:当内存接口达到饱和的时候,增加处理器并不能获得更高的性能,?SMP?支持的CPU个数有限。

Numa:每个处理器有自己的内存,每个处理器也可以访问别的处理器的内存。

CPU配置
qemu-kvm -smp n,[maxcpus=maxcpus],[cores=cores],[threads=threadw],[sockets=sockets]
参数注解:
          n:VCPU数量(默认为1 )
          maxcpus:最大使用cpu数量(配合cpu热插拨机制使用)
        cores:每个cpu的core数量;
        threads:每个core线程数量;
        sockets:cpu插槽数量
实验1:
      qemu-kvm test1.qcow2  -monitor stdio -vnc 0.0.0.0:0
  (不加任何CPU参数)

实验2:
              qemu-kvm -smp 2 test1.qcow2  -monitor stdio -vnc 0.0.0.0:0

实验3:
?  ?qemu-kvm -smp2,maxcpus=3,cores=2 test1.qcow2 -monitor stdio -vnc 0.0.0.0:0

实验4:
qemu-kvm -smp 2,maxcpus=3,cores=1,sockets=1 test1.qcow2-monitor stdio -vnc 0.0.0.0:0

  VCPU=sockets * cores * threads
指定CPU?型号:
Guest os未指定型号时:

查看当前qemu?支持的cpu型号:
qemu-kvm -smp 2,maxcpus=3,cores=1,sockets=1 -cpuSandyBridge test1.qcow2 --vnc 0.0.0.0:0



2.2使用qemu-kvm配置虚拟的内存 
虚机机内存配置
qemu配置命令:
qemu -m < size> test1.qcow2
如果不加内存配置参数,默认分配给虚机的内存为?128M?
在虚机中使用?free -h?查看内存大小为108M。
少掉的内存为内核执行文件占用和系统保留占用,?108M?为实际可用内存。


实验1?:为虚机分配1024M内存
qemu-kvm -m 1024 test1.qcow2 -monitorstdio -vnc 0.0.0.0:0



2.3 使用qemu-kvm配置虚拟机的存储
虚拟机存储配置
qemu-kvm -hda file  -fdafile -cdrom file
hda:指定虚拟机第一块硬盘。在Guest os中表现为/dev/hda或/dev/sda。hda对应的值,可以为磁盘镜像文件,也可以为宿主机的存储设备文件。????
        hdb/hdc…:指定虚拟机中的第二、三块硬盘。依此类推。
        fda:指定虚拟机中的第一个软驱。
?  ??    ?  cdrom:指定虚拟机的光驱。cdrom是Guest os中的第三个IDE设备,不能和hdc同时使用。
mtdblock:虚拟机中的?flash存储器?
        sd:虚拟机中的sd卡


详细配置存储参数:qemu-kvm -drive option,[option],[option]……..
?        ?option参数注解:?
                      ?  1)?file=  ?指定磁盘镜像文件名,或存储设备文件名;
2)?if=        指定存储驱动器的接口类型(如ide、scsi(目录qemu版本不支持)、virtio);?
?                        ?3)?bus=  ?指定存储驱动器的总线编号;
?                        ?4)?unit=  ?指定存储驱动器的单元编号;
?                        ?5)?index= ?同一种接口驱动器的索引编号;
?                        ?6)?media= ?设置存储驱动器中媒介的类型(disk、cdrom)
?                      ??  ?7 )snapshot= 可选值为(on,off),当值为on时,不会将更改、新增的数据回写到磁盘镜像文件中,而是写到一个临时文件中。默认为off. 可以在monitor中,使用commit命令强制回写。
?                      ??  ?8)cache= cache访问方式,可先值为(none,write back,writethrough)
?              ??  ?默认值:?writethrough,?(直写模式)数据直接写入磁盘里,不使用缓存;在数据更新时,同时写入Guest os Pagecache和后端块设备。
?          ??  ?  writeback:(回写模式)在数据更新时只写入? Guestos ?和宿主机os的PageCache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。                             
            none:这种模式作用在Guest OS Pagecache和物理磁盘Cache中,相当于虚拟机能直接访问宿主机的磁盘,性能不错!

性能上: writeback > none > writethrough ?
安全上 :writeback < none < writethrough ?
  ?                      ?9)?format=  ?指定磁盘的格式,默认情况下由qemu自动识别。如:qcow2,vmdk,raw
?                      ?10)serial=  分配?  ?给设备的序列号
?                      ?11)?addr= ?存储控制器的PCI地址
?                      ?12)?id= ?设置驱动器id
                      13)readonly= on|off 是否只读
设置启动顺序
?          ?qemu-kvm -boot [order=drives  ],[once=drives ],[menu=on|off]
      ?    ?注解:?
?                        ?drives:
?                                              ?a:第一个软驱?
?                                              ?b:第二个软驱?
?                                              ?c:第一块硬盘?
?          ??                                    ?d:光驱?
?                                              ?n:网络启动)?
?                          ?order:设定启动顺序?,?如设成order=dc,即先从光驱启动,再从第一块硬盘启动。
?                          ?once:设定第一次的启动顺序,重启后失效。?
?                          ?menu:启用交互式启动菜单?  ??


qemu支持的磁盘镜像文件
使用?qemu-img -h?命令查看支持的磁盘镜像文件格式


常用格式介绍:
1、?raw?
原始磁盘镜像格式,?qemu-img?命令的默认格式。
之前用DD创建的磁盘镜像文件就是raw格式。

2、qcow2?
qemu推荐的文件
支持稀疏文件,支持?AES?加密,支持快照。
3、?qcow?
旧版的?qcow2?,现在很少使用
4、?vdi?
virtualbox镜像文件格式
5、?vmdk?
vmware镜像文件格式
6、?vpc?
Microsfot virtual pc文件格式


qemu硬盘管理工具?qemu-img?
命令格式:?qemu-img [command] [-o options]?
1)check:对镜像文件进行检查,查找镜像文件中的错误;
目前只支持?qcow2?、qed、vdi格式
2)create [-f fmt][-o option] filename [size]
创建镜像文件
-f 镜像文件格式(如?raw?、qcow2)
-b指定?backing_file(?这个镜像文件只记录与backing_file差异的部分)
-o 选项(如?backing_file)?
Size 指定文件大小(如?M?、G、T)


3)commit [-f fmt] filename
提交?filename?中的内容到backing_file中。
4)?convert[-c]   [-f fmt] [-O output_fmt][-o option] filename outputfilename ?
镜像文件格式转换
-c:压缩
-f:源文件格式
-O:输出文件格式
Filename:源文件名
Ouputfilename:输出文件名
5)?info filename?
显示镜像文件信息
6)snapshot [-l |-a snapshot|-c snapshot|-d snapshot] filename
-l 列出所有快照
-a使用一个快照
-c创建一个快照
-d删除一个快照
7)?resize filename[+|-]size ?
增加、减小镜像文件的大小(qcow2格式不支持减小空间)
2.4使用qemu-kvm配置虚拟机的网络
虚拟机的网络配置
Qemu-kvm提供了三种网络模式
1、桥接?(bridge)?
将虚拟机的网卡桥接到宿主机的物理网卡。虚拟机和宿主机处于同一个网络内,使用同一个网段。相当于将虚拟机的网卡和宿主机的网卡接在同一台二层交换机上。
2、?NAT?
宿主机需要两块网卡,一块网卡连接物理网络,另一块网卡(通常是虚拟网卡)和虚拟机网卡做桥接。虚拟机需通过宿主机的?NAT?功能,转发数据包。(这时宿主机相当一台NAT路由器。
3、?qemu?内部的用户模式
完全由qemu模拟出来的一种网络模式,性能相对较差。

基本网络配置
?                ?qemu-kvm -netnic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
?      ?建立一个新的网卡,并加入?vlan n(?默认为 vlan 0)
?      ?macaddr:网卡的?mac?地址
?      ?model:网卡型号默认为?rtl8139?
?      ?name:网卡名称?
?      ?addr:网卡?PCI?地址


2.4.1桥接模式配置安装桥接管理工具:yum instal bridge-utils
检查一下?tun?模块是否被加载
?
如果未加载,使用modprobe tun命令加载一下。
新建一个?bridge?(br0)
vim /etc/sysconfig/network-scripts/ifcfg-br0
Ifcfg-br0文件配置内容
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.0.198
PREFIX=24
GATEWAY=192.168.0.1
DNS=114.114.114.114
ONBOOT=yes


修改宿主机物理网卡配置
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=ac25a1e2-258c-42c9-aa11-f5565b3474d9
DEVICE=ens33
ONBOOT=yes
#IPADDR=192.168.0.197      #将此行注释掉
#PREFIX=24                                                    #将此行注释掉
#GATEWAY=192.168.0.1      #将此行注释掉
#DNS1=114.114.114.114    #将此行注释掉
BRIDGE=br0                                                #新增此行


重启网络服务:?systemctl  restart network?


使用ifconfig查看当前网络情况,br0已启动,IP地址配置在br0上

虚拟机配置命令    ?
qemu-kvm -net nic -net tap,script=      ?  ?filename
-net tap:添加一块?tap?虚拟网络设备(用于连接虚拟机的网卡)
-nettap[,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]
vlan:配置加入的?vlan?号
ifname:指定?tap?设备的名称
script:指定启动虚机时宿主机执行的脚本(默认为?/etc/qemu-ifup)?
创建/etc/qemu-ifup脚本


#!/bin/bash
ip link set up $1
brctl addif br0 $1
downscript:虚拟机关闭时执行的脚本(非必要)


2.4.2NAT模式配置
新建一个桥br1?,用于连接虚拟机的网卡(跟桥接模式一样)
Vim/etc/sysconfig/network-script/ifcfg-br1
DEVICE=br1
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.100.254
PREFIX=24
ONBOOT=yes


修改?br1?的IP地址为:192.168.100.254(根据环境不同自己配置)
重启网络服务?systemctl restart network?
查看网络情况:ifconfig

宿主机安装DHCP?软件(建议使用dnsmasq)
yum install dnsmasq
配置/etc/dnsmasq.conf文件内容
Interface=br1
dhcp-range=192.168.100.100,192.168.100.200,255.255.255.0,12h
dhcp-option=option:router,192.168.100.254
dhcp-option=option:dns-server,114.114.114.114


放通宿主机防火墙?DHCP?服务
firewall-cmd --add-service=dhcp


创建/etc/qemu-ifup-NAT脚本(参考桥接配置)


#!/bin/bash
ip link set $1 up
brctl addif br1 $1


启动虚拟机
qemu-kvm -m 2048 -net nic -nettap,script=/etc/qemu-ifup-NAT test1.qcow2
此时虚拟机应该已成功获取到?IP?地址、网关、DNS,已经可以和宿主机br1连通。但是还无法访问外网。


开启宿主机的数据包转发功能
修改? /etc/sysctl.conf?文件
net.ipv4.ip_forward = 1
立即应用配置:sysctl -p


NAT配置
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
将宿主机当成一个NAT网关,主有虚拟机通过宿主地址转换后访问外网。

    推荐阅读