一、KVM虚拟化介绍

KVM 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。KVM不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。

kvm云平台管理 kvm虚拟化管理平台_数据结构与算法

KVM有如下特点:

  • guest作为一个普通进程运行于宿主机
  • guest的CPU(vCPU)作为进程的线程存在,并受到宿主机内核的调度
  • guest继承了宿主机内核的一些属性,比如huge pages(大页表)
  • guest的磁盘IO和网络IO会受到宿主机的设置的影响
  • guest通过宿主机上的虚拟网桥与外部相连

KVM整体架构

kvm云平台管理 kvm虚拟化管理平台_操作系统_02

每一个虚拟机(guest)在Host上都被模拟为一个QEMU进程,即emulation进程。
我们创建一个虚拟机后,用普通的ps 命令就可以查看到。

➜  ~ virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     kvm-01                         running ➜ ~ ps aux | grep qemu libvirt+ 20308 15.1 7.5 5023928 595884 ? Sl 17:29 0:10 /usr/bin/qemu-system-x86_64 -name kvm-01 -S -machine pc-i440fx-wily,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 2 qemu ....

可以看到,此虚拟机就是一个普通的Linux进程,他有自己的pid。并且有四个线程,线程数量不是固定的,但是至少会有三个(vCPU,IO,Signal)。其中有两个是vCPU线程,有一个IO线程还有一个信号处理线程。

➜  ~ pstree -p 20308
qemu-system-x86(20308)-+-{qemu-system-x86}(20353) |-{qemu-system-x86}(20408) |-{qemu-system-x86}(20409) |-{qemu-system-x86}(20412)

虚拟CPU

guest的所有用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用KVM的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过CPU指令集的软件模拟转换,大大的减少了虚拟化成本,这也是KVM优于其他虚拟化方式的点之一。

KVM向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对KVM进行操作,包括虚拟机的初始化,分配内存,指令加载等等。

虚拟IO设备

guest作为一个进程存在,当然他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。

虚拟内存

guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是做一个overview。

二、KVM安装

1.安装centos7服务器

kvm云平台管理 kvm虚拟化管理平台_操作系统_03

kvm云平台管理 kvm虚拟化管理平台_数据结构与算法_04

点击完成,后开始安装

2.虚机开启虚拟化引擎配置

kvm云平台管理 kvm虚拟化管理平台_数据结构与算法_05

3.开启网卡ONBOOT,并重启网卡

kvm云平台管理 kvm虚拟化管理平台_操作系统_06

4.查看CPU是否支持虚拟化



grep -E --color=auto "(vmx|svm)" /proc/cpuinfo



5.安装KVM



virtualization             #提供虚拟机的环境,主要包含qemu-kvm

virtualization-client      #管理和安装虚拟机实例的客户端,主要有python-virtinst,virt-manager,virt-viewer

virtualization-platform    #提供访问和控制虚拟客户端的接口,主要有libvirt,libvirt-client

virtualization-tools       #管理离线虚拟机镜像的工具,主要有libguestfs

gnome-desktop         #安装图形管理界面

yum -y group install gnome-desktop virtualization-tools virtualization-platform virtualization-client virtualization      #yum安装包组



6.KVM远程管理



[root@localhost ~]# which virsh      #查看虚拟机管理命令
/usr/bin/virsh
[root@localhost ~]# virsh list --all    #查看所有虚拟机
 Id    名称                         状态
----------------------------------------------------



7.使用qemu-kvm管理虚拟机

参数简介

CPU、Memory、SMP、NUMA



-cpu cpu     #select CPU (-cpu ? for list)
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
-m megs      #set vRAM size to megs MB [default=128]
-numa node[,mem=size][,cpus=cpu][,nodeid=node]



Storage Device



-drive option[,option[,option[,...]]]    #定义一个存储设备
子选项介绍:
 id=name                         #定义硬盘设备名称
 file=/path/to/somefile                #硬件映像文件路径
 if=interface_type                  #指定硬盘设备所连接的接口类型(控制器类型), 如ide, scsi, virio等
 index=i                         #设定同一种控制器类型中不同设备的索引号
 media=disk|cdrom                   #定义介质类型为硬盘(disk)还是光盘(cdrom)
 snapshot=on|off                    #指定当前硬盘设备是否支持快照功能
 cache=writethrough|writeback|none|unsafe    #定义如何使用物理机缓存来访问块数据
 format=format                    #指定映像文件的格式, 具体格式可参见qemu-img命令



Display options  #显示选项用于定义虚拟机启动后的显示接口相关类型及属性等



-nographic                     #默认情况下, qemu使用SDL来显示VGA输出; 而此选项用于禁止图形接口, 此时, qemu类似一个简单的命令行程序, 其仿真串口被将被重定向到控制台
-curses                        #禁止图形接口, 并使用curses/ncurses作为交互接口
-alt-grab                      #使用Ctrl+Alt+shift组合键释放鼠标
-ctrl-grab                     #使用右Ctrl键释放鼠标
-sdl                          #启用SDL
-spice option[,option[,...]]           #启用spice远程桌面协议, 具体请参照qemu-kvm帮助手册
-vga [std|cirrus|vmware|qxl|xenfb|none]     #指定要仿真的VGA接口类型
-vnc display                  #默认情况下, qemu使用SDL显示VGA输出; 使用该选项, 可以让qemu监听在VNC上, 并将VGA输出重定向至VNC会话; 使用此选项, 必须使用-k选项指定键盘布局类型



Network options  #简单介绍几种,更多可参考官方手册



NIC
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
# 创建一个新的网卡设备并连接至vlan n中;
# pc架构上默认的nic为e1000, macaddr用于为其指定MAC地址
# 使用"qemu-kvm -net nic,model=?"来获取当前平台支持的类型
# name用于指定一个在监控时显示的网卡设备名称


TAP
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][downscript=dfile]
#通过物理机的tap网络接口连接至vlan n中, 
#使用script=file指定脚本(默认为/etc/qemu-ifup)来配置当前网络接口
#使用downscript=dfile指定脚本(默认为/etc/qemu-ifdown)来撤销接口配置
#使用script=no和downscript=no可分别用来禁止执行脚本


USER
-net user[,option][,option][,...]    #在用户模式配置网络栈, 其不依赖于管理权限
子选项介绍:
 vlan=n                   #连接之vlan n, 默认n=0
 name=str                  #指定接口的显示名称, 常用于监控模式中
 net=addr[/mask]               #设定GuestOS可见的IP网络, 默认为192.168.1.0/24
 host=addr                  #指定GuestOS中看到的Host的IP地址, 默认为指定网络中的第二个, 即x.x.x.x
 dhcpstart=addr              #指定DHCP服务器地址池中16个地址的起始IP, 默认为第16个至第31个, 即x.x.x.x ~ x.x.x.x
 dns=addr                   #指定GuestOS可见的dns服务器地址, 默认为GuestOS网络中第三个地址, 即x.x.x.x



 

7.1 安装qemu-kvm



yum -y install qemu-kvm



7.2 查看文件位置



rpm -ql qemu-kvm | grep qemu-kvm | head -2



7.3 创建软连接到/usr/bin目录下



ln -s /usr/libexec/qemu-kvm /usr/bin



 7.4 安装centos6.10虚机



qemu-kvm -m 128 -smp 1 -name "test" -hda /kvm/images/CentOS-6.10.iso            #内存128M  CPU 1块



若此步报错,应该是主机未开启虚拟化,在bios中配置虚拟化即可

7.5 安装VNC客户端



yum -y install tigervnc



7.6 切换图形管理界面连接VNC



startx &
#打开终端命令台
vncviewer :5900



kvm云平台管理 kvm虚拟化管理平台_虚拟化_07

8.virt-install创建虚拟机并安装

8.1 创建磁盘



qemu-img create -f qcow2 /kvm/images/CentOS-6.10.qcow2 5G #建一个格式为qcow2的磁盘



8.2 安装系统



virt-install \
--name=centos6 \
--disk path=/kvm/images/CentOS-6.10.qcow2 \
--vcpus=1 --ram=1024 \
--cdrom=/kvm/images/CentOS-6.10.iso \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--os-type=linux \
--os-variant=rhel6



切换至图形界面可看到如下图

kvm云平台管理 kvm虚拟化管理平台_虚拟化_08