KVM虚拟化系统学习笔记

Posted wx600649499b2bc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM虚拟化系统学习笔记相关的知识,希望对你有一定的参考价值。

第一章 KVM虚拟化系统的基本概念

1.1虚拟化系统基本概念

1.1.1虚拟化系统架构

KVM虚拟化系统学习笔记_centos


1.1.2软件虚拟化和硬件虚拟化

 ​    ​实现虚拟化的关键:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重新定向到虚拟资源池中。

    ​根据“截获、重定向”的方式,虚拟化可分为软件虚拟化和硬件虚拟化

软件虚拟化:用纯软件的方式实现“截获、重定向”;如:​QEMUVmware的软件虚拟化

    优点:可在硬件不支持虚拟化的环境中运行;​

    ​缺点:性能较差。​

 硬件虚拟化:物理资源本身提供了对“截获、重定向”功能的支持;如:​Intel virtualizationTechnologgy(Intel VT) AMD-V

        ​优点:虚拟化硬件支持​Guest OS​直接在其上面运行,无需进行二进制转换,性能较软件虚拟化更优;

      ​缺点:需要物理资源支持​VT​功能,需要CPU、主板芯片组、Bios支持VT

1.1.3 准虚拟化和全虚拟化

准虚拟化:基于希望解决软件虚拟化性能上的损失,提出了一项解决方案:改动​Guest OS​的代码,使它以为自己是运行在虚拟化环境中,可于虚拟系统协同工作。这种方法称为准虚拟化。

注解:

       ​张三:一个运行在虚拟化环境中的​Guest OSLinux),但是他的代码告诉他,他是一个操作系统,于是他理所当然认为自己是直接运行在物理资源上,理所应当可以直接调用物理资源。

    ​张二:一个运行在虚拟化环境中的​Guest OSwindows)

    ​李四:底层操作系统,“哼哼,老子才是真正的操作系统。”​

    ​王五:虚拟化系统​

    ​赵六:物理资源​

张三:“赵六,我需要物理资源!”

赵六:“你丫只是个应用程序,想要物理资源,让你老大李四跟我说。”

李四:“张三,你丫只是个应用程序,还想冒充操作系统​,​滚一边去!”

张三:“靠,老子明明是操作系统!”

王五:“张三,你小子只是我搞出来的山寨货,想要物理资源,得先问我。”

张三: “王王大哥,给点物理资源吧!”

王五:“好的,你等着,让我跟底层操作系统骗点!”“李四大哥,张三这二货只是个应用程序,他让我跟您申请点物理资源,麻烦您处理一下!”

李四:“还是王五懂规矩,现在刚好有多余的物理资源,拿去用吧!”

(虚拟化系统截获了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年​94日,Redhat收购了Qumranet公司。

      ​2010年​11​月,Redhat发布RHEL 6.0,这个改造版中,用KVM取代了原来xen系统。

 ​    ​在​KVM​系统中,每个虚机都是Linux的一个常规进程,由Linux调试程序进行调度。

    ​KVM本身并不执行任何模拟,需要用户空间程序来进行实现硬件模拟功能。​

这个空间程序就是大名鼎鼎的​QEMU

KVM系统架构:

KVM虚拟化系统学习笔记_centos_02

KVM模块:

       ​KVM模块是​KVM​虚拟机系统的核心部分,主要功能是打开硬件的虚拟化功能,创建特殊设备文件:/dev/kvm,并等待来自用户空间的命令。

      ​QEMU:用户空间程序,虚拟机的创建、运行、管理等操作,是​QEMUKVM模块相互配合的过程。

注解:如果把KVM模块看作是一个系统内核的话,那QEMU就是操作系统,而VirshVirt-manager等管理工具就是应用程序。

QEMU本身就是一个开源虚拟机软件,是用纯软件方式实现虚拟化的,因此性能比较低下。

QEMU和KVM的结合,是典型的开源系统的代码共用和合作。

QEMU不但可以和KVM结合使用,还可以和其它虚拟机系统结合使用,比如Xen.

1.2 KVM实验环境的搭建

1.2.1 KVM系统安装

第一步:在BOIS中打开电脑的虚拟化功能(一般现在的电脑支持)

KVM虚拟化系统学习笔记_centos_03

第二步:安装​vmware workstation

      ​由于学习成本的问题,我们不可能每个人都去购买一台服务器来做实验,因此推荐使用​vmware workstation​这个虚拟化软件来搭建实验环境。

Vmware workstation下载链接:​​https://www.vmware.com/go/getworkstation-win​​​​

     ​下载完安装包后,跟普通软件一样安装就行。​

KVM虚拟化系统学习笔记_应用程序_04


第三步:新建虚拟机

点击“文件”​--​“新建虚拟机” 

KVM虚拟化系统学习笔记_虚拟化_05

KVM虚拟化系统学习笔记_虚拟化_06

KVM虚拟化系统学习笔记_虚拟化_07

KVM虚拟化系统学习笔记_centos_08

KVM虚拟化系统学习笔记_centos_09

KVM虚拟化系统学习笔记_虚拟化_10

KVM虚拟化系统学习笔记_centos_11

KVM虚拟化系统学习笔记_应用程序_12

KVM虚拟化系统学习笔记_虚拟化_13

KVM虚拟化系统学习笔记_虚拟化_14

KVM虚拟化系统学习笔记_centos_15

KVM虚拟化系统学习笔记_centos_16

KVM虚拟化系统学习笔记_应用程序_17

KVM虚拟化系统学习笔记_虚拟化_18

KVM虚拟化系统学习笔记_虚拟化_19

centos​安装界面

GUI​界面安装上

KVM虚拟化系统学习笔记_虚拟化_20


查看内核版本:

命令:uname -r

KVM虚拟化系统学习笔记_应用程序_21

查看​centos​版本:

命令​:cat /etc/centos-release

KVM虚拟化系统学习笔记_虚拟化_22

各种版本在操作上可能会有所不同,不过都是大同小异。

确认​KVM​模块是否被加载

命令:lsmod | grep kvm

KVM虚拟化系统学习笔记_应用程序_23


确认​qemu​是否已安装:

命令:rpm -qa | grep qemu

KVM虚拟化系统学习笔记_应用程序_24

安装​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个数有限。

KVM虚拟化系统学习笔记_虚拟化_25

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

KVM虚拟化系统学习笔记_应用程序_26

CPU配置

qemu-kvm -smp n,[maxcpus=maxcpus],[cores=cores],[threads=threadw],[sockets=sockets]

参数注解:

      n:VCPU数量(默认为1

      maxcpus:最大使用cpu数量(配合cpu热插拨机制使用)

     cores:每个cpucore数量;

     threads:每个core线程数量;

     sockets:cpu插槽数量

实验1

    qemu-kvm test1.qcow2  -monitor stdio -vnc 0.0.0.0:0

 (不加任何CPU参数)

KVM虚拟化系统学习笔记_centos_27

实验2:

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

KVM虚拟化系统学习笔记_虚拟化_28

实验3:

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

KVM虚拟化系统学习笔记_应用程序_29

实验4:

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

KVM虚拟化系统学习笔记_centos_30

 VCPU=sockets * cores * threads

指定CPU​型号:

Guest os未指定型号时:

KVM虚拟化系统学习笔记_虚拟化_31

查看当前qemu​支持的cpu型号:

qemu-kvm -smp 2,maxcpus=3,cores=1,sockets=1 -cpuSandyBridge test1.qcow2 --vnc 0.0.0.0:0

KVM虚拟化系统学习笔记_centos_32


2.2使用qemu-kvm配置虚拟的内存 

虚机机内存配置

qemu配置命令:

qemu -m <size> test1.qcow2

如果不加内存配置参数,默认分配给虚机的内存为​128M

在虚机中使用​free -h​查看内存大小为108M

少掉的内存为内核执行文件占用和系统保留占用,​108M​为实际可用内存。

KVM虚拟化系统学习笔记_centos_33

KVM虚拟化系统学习笔记_centos_34

实验1​:为虚机分配1024M内存

qemu-kvm -m 1024 test1.qcow2 -monitorstdio -vnc 0.0.0.0:0

KVM虚拟化系统学习笔记_应用程序_35


2.3 使用qemu-kvm配置虚拟机的存储

虚拟机存储配置

qemu-kvm -hda file  -fdafile -cdrom file

hda:指定虚拟机第一块硬盘。在Guest os中表现为/dev/hda或/dev/sda。hda对应的值,可以为磁盘镜像文件,也可以为宿主机的存储设备文件。

     hdb/hdc…:指定虚拟机中的第二、三块硬盘。依此类推。

     fda:指定虚拟机中的第一个软驱。

 ​​    cdrom:指定虚拟机的光驱。cdromGuest os中的第三个IDE设备,不能和hdc同时使用。

mtdblock:虚拟机中的flash存储器

     sd:虚拟机中的sd


详细配置存储参数:qemu-kvm -drive option,[option],[option]……..

     ​option参数注解:​

             1file=  ​指定磁盘镜像文件名,或存储设备文件名;

2)if=     指定存储驱动器的接口类型(如ide、scsi(目录qemu版本不支持)、virtio);

             ​3)​bus=  ​指定存储驱动器的总线编号;

             ​4)​unit=  ​指定存储驱动器的单元编号;

             ​5)​index= ​同一种接口驱动器的索引编号;

             ​6)​media= ​设置存储驱动器中媒介的类型(diskcdrom)

            ​​ 7 )snapshot= 可选值为(on,off),当值为on时,不会将更改、新增的数据回写到磁盘镜像文件中,而是写到一个临时文件中。默认为off. 可以在monitor中,使用commit命令强制回写。

            ​​ 8cache= cache访问方式,可先值为(none,write back,writethrough)

        ​​ ​默认值:​writethrough,​(直写模式)数据直接写入磁盘里,不使用缓存;在数据更新时,同时写入Guest os Pagecache和后端块设备。

      ​​  writeback:(回写模式)在数据更新时只写入​ Guestos ​和宿主机osPageCache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。               

       none:这种模式作用在Guest OS Pagecache和物理磁盘Cache中,相当于虚拟机能直接访问宿主机的磁盘,性能不错!

KVM虚拟化系统学习笔记_centos_36

性能上: 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格式。

KVM虚拟化系统学习笔记_虚拟化_37

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​、qedvdi格式

2)create [-f fmt][-o option] filename [size]

创建镜像文件

-f 镜像文件格式(如​raw​、qcow2)

-b指定​backing_file(​这个镜像文件只记录与backing_file差异的部分)

-o 选项(如​backing_file)

Size 指定文件大小(如​M​、GT)


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模拟出来的一种网络模式,性能相对较差。

KVM虚拟化系统学习笔记_centos_38

基本网络配置

         ​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​模块是否被加载

KVM虚拟化系统学习笔记_应用程序_39

如果未加载,使用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

KVM虚拟化系统学习笔记_centos_40

虚拟机配置命令   ​

qemu-kvm -net nic -net tapscript=     ​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模式配置

KVM虚拟化系统学习笔记_centos_41

新建一个桥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

KVM虚拟化系统学习笔记_centos_42

宿主机安装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网关,主有虚拟机通过宿主地址转换后访问外网。

OpenStack学习笔记----安装虚拟化工具

kvm虚拟化学习笔记(十四)之kvm虚拟机静态迁移

学习笔记-KVM虚拟化

KVM虚拟化笔记(十四)------kvm虚拟机动态迁移

KVM虚拟化笔记------kvm虚拟机日常管理

KVM虚拟化笔记------kvm虚拟机时间配置