概况
完全虚拟化技术(硬件辅助虚拟化技术):在虚拟机和硬件之间加了一个软件层-Hypervisor(虚拟机监视器VMM)。
半虚拟化技术(准虚拟化技术):在全虚拟化的基础上,把操作系统做了修改,添加了一个API对客户发出的指令进行优化,降低hypervisor翻译消耗的一部分不必要的资源,提高了整体资源 。
寄居架构:在操作系统上安装和运行虚拟化程序,依赖主机操作系统对设备的支持和物理资源的管理。
裸金属架构:直接在硬件上安装虚拟化软件,再其上安装系统,依赖虚拟层内核和服务器控制台进行管理。
安装VMware exsi 可以直接安装在计算机硬件上,属于裸金属架构,安装完成后安装vsphere client 客户端部署虚拟机,也可以通过IP访问进行虚拟机的安装,这样可以节省大量的硬件资源。
Kvm虚拟机属于寄居架构,会占用系统大量的资源。
KVM 全称是基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得Linux变成了一个Hypervisor。
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案。KVM中,虚拟机被实现为常规的Linux进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得KVM能够使用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 虚拟化,通过 /dev/kvm 设备和 KVM 交互。
常用工具
libvirt:操作和管理KVM虚机的虚拟化API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
Virsh:基于 libvirt 的 命令行工具 (CLI)。
Virt-Manager:基于 libvirt 的 GUI 工具。
virt-v2v:虚机格式迁移工具。
virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等。
Kvm安装
Kvm 虚拟机使用时注意把主板BIOS的虚拟化功能打开,查看cpu是否支持虚拟化,有输出说明支持虚拟化cat /proc/cpuinfo |grep vmx
开启CPU虚拟化支持
安装依赖关系
[root@localhost ~]# yum -y install qemu-kvm qemu-kvm-tools python-virtinst.noarch qemu-img bridge-utils libvirt virt-manager
查看是否加载了KVM模块
[root@localhost ~]# lsmod | grep kvm
在libvirt中运行KVM网络有两种方法:NAT和bridge,默认是NAT。
将以bridge(桥接模式)为例:
[root@localhost ~]# ip a
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-br0
[root@localhost network-scripts]# vim ifcfg-br0
TYPE="bridge"
BOOTPROTO="static"
DEFROUTE="yes"
HWADDR=00:0c:29:2a:04:e6
NM_CONTROLLED="no"
DEVICE="br0"
ONBOOT="yes"
IPADDR=192.168.77.135
GATEWAY=192.168.77.2
DNS=192.168.77.2
PREFIX=24
[root@localhost network-scripts]# vim ifcfg-eth0
DEVICE=eth0
HWADDR=00:0c:29:88:85:64
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
BRIDGE="br0" #桥接虚拟网卡名称
[root@localhost ~]# /etc/init.d/network restart
[root@localhost ~]# ip a #主机IP会配置在br0网卡上
进入图像界面 virt-manager,连接出错时,重启libvirtd
添加存储池:双击localhost{QEMU}---->存储----->“+”添加池---->选择浏览(选择一个提供存储池空间的目录)------>完成---->创建存储卷---->新建卷------>新建虚拟机----->具体安装过程与安装Linux系统一样
存储池
virsh pool-list --all --details #查看存储池所有详细信息
virsh pool-info 存储池名 #查看指定存储池详细信息
virsh pool-define-as testpool(存储池名) --type dir --target /data_kvm/store2/(存储池目录) #定义存储池
virsh pool-build testpool #创建存储池
virsh pool-start testpool #启动存储池
virsh pool-autostart testpool #自启动存储池
virsh pool-edit testpool #编辑指定存储池
virsh pool-undefine testpool #取消定义存储池
virsh pool-destroy testpool #取消激活存储池
定义存储池—>创建存储池—>启动存储池—>自启动存储池—>完成
存储卷
virsh vol-list --pool 池名 #查看池中的卷
virsh vol-dumpxml kkk.qcow2(卷) test(池) #查看卷的xml文件
virsh vol-delete kkk.qcow2 (卷) --pool test(池) #删除存储卷
KVM文件管理,raw格式转换为qcow2格式
虚拟机磁盘文件分为raw与qcow2格式,KVM默认格式是raw裸设备。
raw好处:性能好、速度最快。缺点:不支持一些新的功能。如:镜像、zlib磁盘压缩,AES加密等
虚拟化中,虚拟机的磁盘:1.虚拟机的硬盘在物理主机上只是一个文件 2.磁盘文件格式可以是RAW,也可以是QCOW2 3.RAW采用与分配空间方式,也就是虚拟机磁盘20G,物理主机就会产生一个20G的文件 4.QCOW2采用延迟分配方式,一开始磁盘文件在物理主机上只占很小的空间,随着向虚拟机写入数据,这个硬盘文件会自动增长 5.虚拟机默认磁盘目录/var/lib/libvirt/images
libguestfs-tools工具实现格式转换
[root@localhost ~]# yum -y install libguestfs-tools
[root@localhost ~]# qemu-img info /data_kvm/store/KVM011.img
[root@localhost ~]# virsh shutdown centos6.5
[root@localhost~]#qemu-img convert -f raw -O qcow2 /data_kvm/store/KVM011.img /data_kvm/store/KVM011.qcow2
[root@localhost ~]# ls /data_kvm/store/
[root@localhost ~]# virsh edit centos6.5 #编辑虚拟机配置
创建虚拟机
[root@localhost ~]# ls /etc/libvirt/qemu #查看KVM的配置文件存放目录
virsh list --all #查看虚拟机状态
virt-install --name yunxiang --memory=512 --vcpu=2 --location=/home/iso/CentOS-7-x86_64-Minimal-1804.iso --diskpath=/home/images/yunxiang.qcow2,size=10 --network bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0" #命令创建虚拟机
(–graphics 指定是否开启图形 --console 定义终端的属性,target_type 则是定义终端的类型 --extra-args 定义终端额外的参数)
写一个xml文件test.xml,利用xml文件创建虚拟机
<domain type="kvm">
<name>centos</name> //虚拟机名称
<memory unit="MiB">1024</memory> //虚拟机最大内存上线
<currentMemory unit="MiB">1024</currentMemory>//当前 内存
<vcpu>2</vcpu> //cpu数量
<os>
<type arch="x86_64" machine="pc">hvm</type>
<boot dev="hd" />
<boot dev="cdrom" />
</os>
<features>
<acpi />
<apic />
<pae />
</features>
<clock offset="localtime" />
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
//这个位置一般不动,,这是你的kvm安装位置
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/home/images/centos.qcow2" />
//qcow2镜像盘位置
<target dev='sda' bus='virtio'/>
<alias name='virtio-disk0'/>
</disk>
<disk type="file" device="cdrom">
<sourcefile="/home/iso/CentOS-7.iso" /> //iso文件
<target dev='hda' bus='ide'/>
</disk>
<interface type="bridge">
<source bridge="br0"/>
</interface>
<input type="mouse" bus="ps2" />
<graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0" keymap="en-us" />
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
</devices>
</domain>
virsh define test.xml #使用xml文件创建虚拟机
virsh start 虚拟机名 #启动虚拟机
virsh console 虚拟机名 #进入指定的虚拟机
virsh shutdown study01 # 关闭虚拟机
virsh destroy study01 # 强制停止虚拟机
virsh undefine study01 # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘
virsh autostart study01 # 设置宿主机开机时该虚拟机也开机
virsh autostart --disable study01 # 解除开机启动
virsh suspend study01 # 挂起虚拟机
virsh resume study01 #恢复挂起的虚拟机
virsh edit 虚拟机名 #修改虚拟机配置信息
virsh dumpxml 虚拟机名> /etc/libvirt/qemu/文件名.xml #导出虚拟机配置
virt-df -h 虚拟机磁盘文件名 #查看虚拟机磁盘使用情况
virsh dominfo 虚拟机名 #查看虚拟机信息
virsh reboot 虚拟机名 #重启虚拟机
快照
快照存放在/var/lib/libvirt/qemu/snapshot目录
virsh snapshot-create 虚拟机名 #创建快照
virsh snapshot-list 虚拟机名 #查看快照
virsh snapshot-revert 虚拟机名 快照编号 #恢复快照
virsh snapshot-current 虚拟机名 #当前虚拟机所用的快照
virsh snapshot-delete 虚拟机名 快照编号 #删除虚拟机
克隆
virsh destroy 虚拟机名 #先停止虚拟机
virt-clone -o ailab1(源虚拟机名) -n ailab1-clone(新虚拟机名) -f ailab1-clone.qcow2(新虚拟机的磁盘文件) #克隆虚拟机
基于后端盘克隆虚拟机
qemu-img create -f(格式) qcow2 -b(后端盘) ailab1.qcow2 myailabq.qcow2 大小 #创建前端盘
qemu-img info myailabq.qcow2 #查看前端盘
virt-manger ->点击“新建虚拟机”->导入现有的磁盘镜像-> myailabq.qcow2->后续根据向导完成 #利用新建前端盘生成虚拟机
Cow格式,写时复制,后端盘的数据同步到前端盘,前端盘的数据不能同步后端盘,这样就能让前端互相独立
网络
virt-cat -a /data_kvm/store/ailab1.qcow2 /etc/sysconfig/network #查看虚 拟机里的network文件
virt-edit -a /data_kvm/store/ailab1.qcow2 /etc/sysconfig/network #编辑虚 拟机里的network文件
virsh net-list #列出虚拟网络
热迁移
相比KVM虚拟机静态迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机动态迁移无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件,本文这部分内容通过nfs来实现。KVM动态迁移目前有两种,一种是基于共享存储的动态迁移,一种是基于数据块的动态迁移。
节点1和节点2挂载相同的nfs目录
节点1挂载
mount -t nfs 192.168.159.180:/mnt/vg/nfs/abc /data -o rw,rsize=32768,hard
节点2挂载
mount -t nfs 192.168.159.181:/mnt/vg/nfs/abc /data -o rw,rsize=32768,hard
确保两节点都有相同的虚拟机磁盘文件存储目录
migrate --live --verbose oeltest01 qemu+ssh://192.168.159.160/system tcp://192.168.159.160 #迁移虚拟机,有一个暂停与关闭的过程
虽然oeltest01虚拟机已经在节点2上启动了,但是虚拟主机上还没有 oeltest01虚拟机的配置文件。所以需要创建配置文件并定义虚拟机
虚拟主机2上,通过迁移过来的虚拟机内存状态创建虚拟机配置文件,并通过xml配置文件定义虚拟机
Virsh dumpxml oeltest01 >/etc/libvirt/qemu/oeltest01.xml #生成xml文件
virsh define /etc/libvirt/qemu/oeltest01.xml #定义虚拟机
进入虚拟机没问题,说明成功
VNC连接虚拟机
新启动的虚拟机没有IP,无法通过IP来远程连接虚拟机,我们可以通过vnc连接宿主机的IP+port访问虚拟机。在define虚拟机时,xml文件需要指定vnc连接选项。
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>