Linux KVM 虚拟化技术

一  、 KVM 介绍 ;

KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
 ① 、它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
 ②、它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
 ③ 、它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
 ④ 、它需要支持虚拟化扩展的 CPU。
 ⑥ 、它是完全开源的 

 

二 、KVM 架构 ;

 KVM 的架构非常简单,KVM 就是一个内核模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux 进程,通过对这个进程的管理就可以完成对虚拟机的管理。

KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案,KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。

 但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
QEMU:修改过的被 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。

 

注意 :KVM  公司使用场景 ;

一般是底层采用 KVM 上层采用 OpenStack ,通过OpenStack 来管理 KVM 的  ;

 

三 、 KVM 的功能列表  ;
KVM 所支持的功能包括:
 ① 、支持 CPU 和 memory 超分(Overcommit)
 ② 、支持半虚拟化 I/O (virtio)
 ③ 、支持热插拔 (cpu,块设备、网络设备等)
 ④ 、支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
 ⑤ 、支持实时迁移(Live Migration)
 ⑥ 、支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
 ⑦ 、支持 内核同页合并 (KSM )
 ⑧ 、支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

 

四 、 安装部署 KVM  ;

安装之前需要确保开启了  BIOS  此功能 ;

4.1 、确保把 disable  改成 enable 

4.2 、  配置内存不要少于3G ,配置虚拟机支持KVM虚拟化  ;

 

4.3  、  基础环境检查 ;

[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[[email protected] ~]# uname -r
3.10.0-693.el7.x86_64
[[email protected] ~]# getenforce 
Disabled
[[email protected] ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[[email protected] ~]# hostname -I
10.0.0.200 172.16.1.200 
[[email protected] ~]# 
 

4.4 、KVM 检查,其实KVM已经内置到了centos7 的内核中 ;

[[email protected] ~]# lsmod |grep kvm
kvm_intel             170086  0 
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm
[[email protected] ~]# 
 

[[email protected] ~]# grep -Eo '(vmx|svm)' /proc/cpuinfo
vmx                                                  ---->>  这里需要保证 必须要有一个 vmx 一个vmx 表示一个 cpu  也就是一核的 两个表示是两核
[[email protected] ~]# 

 

五 、安装管理kvm 的命令 ;

[[email protected] ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install 

查看已经安装的软件包 ;

[[email protected] ~]# rpm -qa|grep -E 'qemu|libvirt|virt'

virt-what-1.13-6.el7.x86_64

libvirt-daemon-driver-storage-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-config-network-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-nodedev-2.0.0-10.el7_3.9.x86_64

libvirt-2.0.0-10.el7_3.9.x86_64

ipxe-roms-qemu-20160127-5.git6366fa7a.el7.noarch

qemu-kvm-common-1.5.3-126.el7_3.10.x86_64

libvirt-client-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-network-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-nwfilter-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-qemu-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-lxc-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-interface-2.0.0-10.el7_3.9.x86_64

libvirt-glib-0.2.3-1.el7.x86_64

virt-manager-common-1.4.0-2.el7.noarch

qemu-kvm-1.5.3-126.el7_3.10.x86_64

virt-manager-1.4.0-2.el7.noarch

qemu-img-1.5.3-126.el7_3.10.x86_64

libvirt-daemon-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-config-nwfilter-2.0.0-10.el7_3.9.x86_64

libvirt-daemon-driver-secret-2.0.0-10.el7_3.9.x86_64

libvirt-python-2.0.0-2.el7.x86_64

virt-install-1.4.0-2.el7.noarch

qemu-kvm-tools-1.5.3-126.el7_3.10.x86_64

[[email protected] ~]#

 

===========================================================

安装包详解;

python-virtinst-0.600.0-29.el6.noarch          # 一套Python的虚拟机安装工具

gpxe-roms-qemu-0.9.7-6.14.el6.noarch       # 虚拟机iPXE的启动固件,支持虚拟机从网络启动

virt-manager-0.9.0-29.el6.x86_64                # 基于Libvirt的图像化虚拟机管理软件,需要图形界面操作系统

qemu-img-0.12.1.2-2.479.el6.x86_64           # 用于操作虚拟机硬盘镜像的创建、查看和格式转化

libvirt-python-0.10.2-54.el6.x86_64              # libvirt为Python提供的API

qemu-kvm-0.12.1.2-2.479.el6.x86_64          # KVM在用户空间运行的程序

qemu-kvm-tools-0.12.1.2-2.479.el6.x86_64

libvirt-0.10.2-54.el6.x86_64                         # 用于管理虚拟机,它提供了一套虚拟机操作API

libvirt-client-0.10.2-54.el6.x86_64           # Libvirt的客户端,最重要的功能之一就是就在宿主机关机时可以通知虚拟机也关机,使虚拟机系统                                                                      正常关机,而不是被强制关机,造成数据丢失

virt-top-1.0.4-3.15.el6.x86_64             # 类似于top命令,查看虚拟机的资源使用情况

virt-what-1.11-1.2.el6.x86_64              # 在虚拟机内部执行,查看虚拟机运行的虚拟化平台

virt-viewer-0.5.6-8.el6.x86_64             # 显示虚拟机的控制台console

 

5.1  、 启动  libvirtd 服务  ; 

[[email protected] ~]# systemctl start libvirtd.service                --->>  启动 libvirtd 服务会出现 3 4 网卡信息 
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ed:fb:50 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feed:fb50/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 52:54:00:86:12:85 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 500
    link/ether 52:54:00:86:12:85 brd ff:ff:ff:ff:ff:ff

[[email protected] ~]# 

[[email protected] ~]# systemctl status libvirtd.service              --->>  查看服务状态   ;
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-09-21 21:29:26 CST; 1min 23s ago        -->>  这里是绿色的表示启动成功 ;
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 18713 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           ├─18713 /usr/sbin/libvirtd
           ├─18834 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...
           └─18835 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dh...

 

六  、  开始创建虚拟机  ;

6.1 、创建虚拟硬盘,以后的数据放在哪里  ;

[[email protected] ~]# mkdir -p /application/kvm_data
[[email protected] ~]# cd /application/kvm_data
[[email protected] kvm_data]# qemu-img create -f qcow2 /application/kvm_data/moban.qcow2 10G
[[email protected] kvm_data]# ll -h
total 196K
-rw-r--r-- 1 root root 193K Sep 21 21:35 moban.qcow2
 

create          --->>  创建  ;
-f                 --->> 指定磁盘格式  ;
moban.qcow2       --->>  虚拟磁盘文件名称     大小为 10G   ;


6.2  、查看虚拟磁盘的详细信息 ;

[[email protected] kvm_data]# qemu-img info moban.qcow2 
image: moban.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)            ---->>   实际大小 
disk size: 196K                                                 ---->>  使用中的大小
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[[email protected] kvm_data]# 

 

6.3   安装虚拟机( 挂载光盘 ) ;

 

6.4  、创建 挂目录 ;

[[email protected] kvm_data]# mkdir -p /application/tools
[[email protected] kvm_data]# cd /application/tools
[[email protected] kvm_data]#  dd if=/dev/sr0 of=/application/tools/CentOS7_2.iso        --- >> 挂载镜像
[[email protected] tools]# ll -h
total 4.1G
-rw-r--r-- 1 root root 4.1G Sep 21 22:00 CentOS7_2.iso
[[email protected] tools]# 
 

安装 KVM 图形界面 ;(注意 ; 这里需要一个  VNC 的远程连接软件 )

virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0--noautoconsole --os-type=linux --os-variant=rhel7 --disk 
path=/application/kvm_data/moban.qcow2,size=10,format=qcow2

参数注解 ;

--virt-type=kvm              --->>  指定 kvm 的虚拟化来安装虚拟机  ;

--name=c72-moban       --->>  指定虚拟机的名称  ;

--vcpus=1                      --->>  指定cpu 的核数

-r 1024                         --->>  指定的是内存 1024  1G 这里最少给1G 少于1G 是看不到图形的 ;

-c                                  --->> 指定了安装镜像的路径  ;

network                         --->> 指定了网络类型   

graphics                        --->> 指定图形化安装 指定了使用 vnc  ; 

--os-type=linux              --->>  指定linux 系统  ;

--os-variant=rhel7          --->> 指定系统是红帽 7 

--disk path                      --->> 指定了磁盘的系统文件 ;

安装第2台虚拟机需要改动的2 个地方  ;

 

 

[[email protected] kvm_data]# virt-install --virt-type=kvm --name=c72-moban --vcpus=1 -r 1024 -c /application/tools/CentOS7_2.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole --os-type=linux --os-variant=rhel7 --disk path=/application/kvm_data/moban.qcow2,size=10,format=qcow2

 

Starting install...                                             ------->>  执行以上命令结束之后,到 vnc 界面点击确认确保是可以看到安装页面的表示成功 ;
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.
[[email protected] kvm_data]# 
 

之后就是安装系统的界面  。。。。。。。。。。。。。。。。。

 

VNC  的端口是 5900 

 

 

七  、  命令行中查看和管理虚拟机的命令 ;

[[email protected] kvm_data]# virsh list --all               ---->>  查看正在运行的虚拟机,虚拟机列表
 Id    Name                           State
----------------------------------------------------
 1     c72-moban                      running
 

生成kvm虚拟机: virt-install

查看在运行的虚拟机: virsh list

查看所有虚拟机: virsh list --all

查看kvm虚拟机配置文件: virsh dumpxml name

启动kvm虚拟机: virsh start name

正常关机:virsh shutdown name

非正常关机(相当于物理机直接拔掉电源):virsh destroy name

删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)

根据配置文件定义虚拟机:virsh define file-name.xml

挂起,终止: virsh suspend name

恢复挂起状态:  virsh resume name

 

这两个文件最好长备份一下  ;

KVM  虚拟机在宿主机就是一个进程 

当启动第一个虚拟机是用的默认的端口 5900 , 第二个是 5901  依次类推,所以在启动第二台的时候需要加上端口号 

磁盘文件格式 ;

 

八 、虚拟机克隆  ;

8.1    确保虚拟机是关闭状态 

[[email protected] kvm_data]# virsh shutdown c72-moban    --->>  关闭c72-moban 虚拟机

[[email protected] kvm_data]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     c72-moban                      shut off

 

8.2  、 克隆 

[[email protected] kvm_data]# ls
moban.qcow2
[[email protected] kvm_data]# cp moban.qcow2 clone.qcow2
[[email protected] kvm_data]# ll -h
total 2.1G
-rw-r--r-- 1 root root 1.1G Sep 22 02:25 clone.qcow2
-rw-r--r-- 1 root root 1.1G Sep 22 02:11 moban.qcow2
[[email protected] kvm_data]# pwd
/application/kvm_data
[[email protected] kvm_data]# 

[email protected] kvm_data]# virsh dumpxml c72-moban >/tmp/moban.xml       --->>  导出模板文件 ;

[[email protected] kvm_data]# cp /tmp/moban.xml{,.ori}         --->>  备份模板文件 ;

 

修改配置文件 ;

uuid  和 mac   随便改几个数字即可,只要保证不一样就行 ;

 

现在娱有了 虚拟机的新的磁盘文件,需要导入了 ;

[[email protected] tmp]# virsh define moban.xml           --->>  导入文件 
Domain c72-clone defined from moban.xml

[[email protected] tmp]# 

 

[[email protected] tmp]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     c72-clone                      shut off
 -     c72-moban                      shut off

 

[[email protected] tmp]# virsh start c72-clone            --->>   启动这个虚拟机 
Domain c72-clone started

[[email protected] tmp]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     c72-clone                      running
 -     c72-moban                      shut off

[[email protected] tmp]#