虚拟化技术之kvm基础

  一、KVM简介

  KVM的全称是kernel base virtual machine(基于内核的虚拟机)是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一。KVM的虚拟化需要硬件支持(如Inter VT技术或者AMD V技术),是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。IBM文档://www.ibm.com/developerworks/cn/linux/l-using-kvm/

  kvm架构

  提示:kvm是Linux内核中的一个模块,而对于用户要操作Linux内核中的模块所提供的功能,必须在用户空间装上一个用户空间软件,通过系统调用的方式去操作;QEMU就是kvm在用户空间的管理功能,有点类似iptalbes是netfilter的管理工具;上面架构图上kvm的主要作用是提供 CPU 和内存的虚级化,以及客户机的 I/O拦截,Guest的部分I/O被KVM拦截后,交给QEMU处理;QEMU通过修改过的被KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通过IOCTL/dev/kvm设备和KVM交互,但是,KVM本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟I/O,并将它的视频显示映射回宿主的显示屏。

  二、KVM宿主机环境准备

  在使用KVM时,宿主机必须在硬件上支持虚拟化功能,如Inter VT技术或者AMD V技术;

  检查宿主机是否支持虚拟化功能

[root@node1 ~]# grep -E "vmx|svm" /proc/cpuinfo 
[root@node1 ~]# 

  提示:如上在宿主机上执行grep -E “vmx|svm” /proc/cpuinfo,如果没有过滤到任何有关vmx或者svm相关字符,那么说明该主机不支持虚拟化功能;

  在vmware workstation宿主机上开启虚拟化功能

  提示:运行的虚拟机,必须要先关机,然后找到对应的虚拟机右键–>设置–>处理器–>把虚拟化inter VT-x/EPT或AMD-V/RVI(V)这一项打勾,然后点击确定开启虚拟机即可;

  验证:现在开启了虚拟化inter VT-x/EPT或AMD-V/RVI(V),看看宿主机上是否能够过滤到vmx或svm的字符?

  提示:如果硬件是inter 处理器过滤出来的是vmx,如果是AMD的过滤出来是svm;两者只要有一种即可;

  检查内核是否装载kvm模块

  提示:如果使用lsmod 没有过滤到kvm字样,说明宿主机没有装载该模块,装载方法modpro kvm即可;到此宿主机上的环境就检查完毕;接下来安装kvm用户空间管理工具;

  安装kvm在用户空间的管理工具

[root@node1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install 
Loaded plugins: fastestmirror
base                                                                               | 3.6 kB  00:00:00     
docker-ce-stable                                                                   | 3.5 kB  00:00:00     
epel                                                                               | 4.7 kB  00:00:00     
extras                                                                             | 2.9 kB  00:00:00     
updates                                                                            | 2.9 kB  00:00:00     
(1/2): epel/x86_64/updateinfo                                                      | 1.0 MB  00:00:00     
(2/2): epel/x86_64/primary_db                                                      | 6.9 MB  00:00:01     
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package libvirt.x86_64 0:4.5.0-33.el7_8.1 will be installed
--> Processing Dependency: libvirt-libs = 4.5.0-33.el7_8.1 for package: libvirt-4.5.0-33.el7_8.1.x86_64
--> Processing Dependency: libvirt-daemon-driver-storage = 4.5.0-33.el7_8.1 for package: libvirt-4.5.0-33.el7_8.1.x86_64
--> Processing Dependency: libvirt-daemon-driver-secret = 4.5.0-33.el7_8.1 for package: libvirt-4.5.0-33.el7_8.1.x86_64
……省略部分内容……
 libxml2                                   x86_64     2.9.1-6.el7.4                     base        668 k
 pciutils-libs                             x86_64     3.5.1-3.el7                       base         46 k
 policycoreutils                           x86_64     2.5-34.el7                        base        917 k
 python-gobject-base                       x86_64     3.22.0-1.el7_4.1                  base        294 k
 selinux-policy-targeted                   noarch     3.13.1-266.el7_8.1                updates     7.0 M

Transaction Summary
==========================================================================================================
Install  5 Packages (+213 Dependent packages)
Upgrade  1 Package  (+ 16 Dependent packages)

Total download size: 95 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(1/235): at-spi2-core-2.28.0-1.el7.x86_64.rpm                                      | 158 kB  00:00:00     
(2/235): at-spi2-atk-2.26.2-1.el7.x86_64.rpm                                       |  81 kB  00:00:00     
(3/235): autogen-libopts-5.18-5.el7.x86_64.rpm                                     |  66 kB  00:00:00     
(4/235): boost-iostreams-1.53.0-28.el7.x86_64.rpm                                  |  61 kB  00:00:00     
(5/235): adwaita-cursor-theme-3.28.0-1.el7.noarch.rpm                              | 641 kB  00:00:00     
(6/235): augeas-libs-1.4.0-9.el7_8.1.x86_64.rpm                                    | 357 kB  00:00:00     
……省略部分内容……
  xkeyboard-config.noarch 0:2.24-1.el7                                                                    
  xml-common.noarch 0:0.6.3-39.el7                                                                        
  xorg-x11-server-utils.x86_64 0:7.7-20.el7                                                               
  xorg-x11-xauth.x86_64 1:1.0.9-1.el7                                                                     
  xorg-x11-xinit.x86_64 0:1.3.4-2.el7                                                                     
  yajl.x86_64 0:2.0.4-4.el7                                                                               

Updated:
  selinux-policy.noarch 0:3.13.1-266.el7_8.1                                                              

Dependency Updated:
  cyrus-sasl-lib.x86_64 0:2.1.26-23.el7             device-mapper.x86_64 7:1.02.164-7.el7_8.2             
  device-mapper-libs.x86_64 7:1.02.164-7.el7_8.2    freetype.x86_64 0:2.8-14.el7                          
  glib2.x86_64 0:2.56.1-5.el7                       libdrm.x86_64 0:2.4.97-2.el7                          
  libselinux.x86_64 0:2.5-15.el7                    libselinux-python.x86_64 0:2.5-15.el7                 
  libselinux-utils.x86_64 0:2.5-15.el7              libsemanage.x86_64 0:2.5-14.el7                       
  libsepol.x86_64 0:2.5-10.el7                      libxml2.x86_64 0:2.9.1-6.el7.4                        
  pciutils-libs.x86_64 0:3.5.1-3.el7                policycoreutils.x86_64 0:2.5-34.el7                   
  python-gobject-base.x86_64 0:3.22.0-1.el7_4.1     selinux-policy-targeted.noarch 0:3.13.1-266.el7_8.1   

Complete!
[root@node1 ~]# 

  启动libvirtd

[root@node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:9a:db:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.41/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9a:dbd6/64 scope link 
       valid_lft forever preferred_lft forever
[root@node1 ~]# systemctl start libvirtd.service 
[root@node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:9a:db:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.41/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9a:dbd6/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:45:06:15 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
    link/ether 52:54:00:45:06:15 brd ff:ff:ff:ff:ff:ff
[root@node1 ~]# 

  提示:libvitrd是C/S架构,它是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术;启动libvirtd后,它会在宿主机上创建virbr0-nic和virbr0两张网卡,其中virbr0是一个NAT网桥,virbr0-nic就桥接到virbr0上,默认virbr0的地址是192.168.122.1/24,如下所示;

  三、基于virtual manager管理工具创建虚拟机

  开启vrit-manager

  提示:要想使用virt-manager,必须要使用支持X11协议的转发的远程工具,windows上可以使用专业版本的xshell和mobaxterm软件;Linux上需要安装桌面即可;如果是mac 需要安装XQuartz;如上连接宿主机,然后执行virt-manager命令,就可以打开virtual manager图形管理工具;

  上传镜像到宿主机

  创建虚拟机

  提示:这个根据自己需求来定义虚拟机的内存和cpu;

  提示:这步是选择磁盘,如果没有提前在宿主机上创建好磁盘,可以直接在这里选择创建,如果创建的有磁盘,则这里选择即可;

  提示:这一步是确定我们虚拟机的确认单和网络的选择,如果有多个网络,可以选择其中一种即可,然后点击finsh;

  提示:到这一步就是安装操作系统了,安装完毕后,重启我们就完成了虚拟机的创建;后续步骤这里就不过多阐述了;安装windows的步骤和上面一模一样;

  提示:安装好系统以后,我们就可以在这个界面上进行管理虚拟机,这里需要注意一点,如果宿主机没有打开核心转发功能,虚拟机是不能够正常上网的;到此基于virt-manager安装虚拟机就完成了;