一.以命令的方式创建虚拟主机
1.创建存储池
mkdir -p /data_kvm/store
2.创建虚拟机
virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data_kvm/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c /opt/CentOS-7-x86_64-DVD-2009.iso --vnc --vncport=5901 --vnclisten=0.0.0.0
备注:
-n:指定虚拟机的名字。
-r:指定内存大小。
--vcpu:指定虚拟 CPU 个数。
--disk:指定磁盘文件放置位置及大小。
-w:制定所使用的网桥。
--autostart:设置虚拟机在宿主机开机时启动。
-c:指定镜像文件。
--vncport:通过 vnc viewer 连接的端口。
--vnclisten:通过 vnc
--accelerate:当安装qemu客户机时,如果支持可用kvm或kqemu内核加速能力,KVM加速器
3.安装完成后使用VNC连接
注意:填写的IP地址(192.168.10.201)是Linux宿主机的IP地址,开放的端口号5901映射到了test01虚拟机。连接成功后,就可以开始安装虚拟机了。
二.静态迁移
1.提取磁盘和配置文件
virsh shutdown test01 关闭虚拟机
(1)导出虚拟机test01的xml配置文件
virsh dumpxml test01 > test01.xml
(2)定位虚拟机的磁盘文件
virsh domblklist test01
(3)拷贝配置文件和磁盘文件到目标主机kvm02中
在KVM02上创建磁盘存放目录
[root@kvm2 ~]# mkdir -p /data_kvm/store
将kvm01文件拷贝到kvm02上
[root@kvm01 ~]# scp /etc/libvirt/qemu/test01.xml 192.168.10.202:/etc/libvirt/qemu/
[root@kvm01 ~]# scp /data_kvm/store/test01.qcow2 192.168.10.202:/data_kvm/store/
(4)在kvm02重新定义虚拟机
[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
[root@kvm02 ~]# virsh start test01
[root@kvm02 ~]# virsh list --all
备注:要注意的是如果kvm01的这台虚拟机不关机,kvm02的虚拟机是无法正常开机的会报以下错误;这时就需要你去kvm01中关闭该台虚拟机 (5)连接管理工具查看
[root@kvm02 ~]# virt-manager
三.基于共享存储的动态迁移
准备工作
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# hostnamectl set-hostname kvmnfs
[root@localhost ~]# bash
备注:两台kvm主机的selinux的状态要一致。
1.额外打开一台服务器,在上面安装NFS
[root@kvmnfs ~]# yum -y install nfs-utils
2.创建共享存储目录
[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# chmod -R 777 /data/
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.10.0/24(rw,sync,no_root_squash)
3.启动并查看NFS服务
[root@kvmnfs ~]# systemctl enable nfs
[root@kvmnfs ~]# systemctl enable rpcbind
[root@kvmnfs ~]# systemctl start nfs
[root@kvmnfs ~]# systemctl start rpcbind
[root@kvmnfs ~]# showmount -e localhost
4.kvm01和kvm02挂载共享目录
两台机器创建挂载点
[root@kvm01 ~]# mkdir /data_kvm/kgc
[root@kvm02 ~]# mkdir /data_kvm/kgc
挂载共享目录
[root@kvm01 ~]# mount -t nfs 192.168.10.101:/data /data_kvm/kgc
[root@kvm01 ~]# mount[root@kvm02 ~]# mount -t nfs 192.168.10.101:/data /data_kvm/kgc
[root@kvm02 ~]# mount
设置永久挂载
[root@kvm01 ~]# vim /etc/fstab
192.168.10.101:/data /data_kvm/kgc nfs defaults 0 0
5.通过现有的磁盘文件生成虚拟机
(1)拷贝qcom2磁盘文件
将实验用到的系统镜像上传到KVM主机的root家目录中。这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2),这个镜像可以直接部署到kvm或openstack的平台中。
[root@kvm01 ~]# cp /opt/CentOS-7-x86_64-GenericCloud-2009.qcow2 /data_kvm/store/test02.qcow2
(2)部署虚拟机
[root@kvm01 ~]# yum -y install libguestfs-tools
备注:该工具提供了virt的高级命令,其中有一个virt-customize命令,可以为系统镜像设置密码。
(3)设置密码
[root@kvm01 ~]# virt-customize -a /data_kvm/kgc/test02.qcow2 --root-password password:aptech
(4)创建虚拟机
virt-install --name=test02 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/data_kvm/kgc/test02.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd
四.动态迁移
(1)修改要迁移虚拟机的配置文件
添加红色部分<driver name='qemu' type='qcow2' cache='none'/>
[root@kvm01 ~]# virsh edit test02<devices>
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/data/kgc/test02.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
修改一起迁移的虚拟机配置文件是为了防止出现以下错误
(2)迁移虚拟机
[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.10.202/system tcp://192.168.10.202
备注:
migrate :迁移
--live:实时迁移
--verbose :显示迁移的进度
在前迁移时出现以下错误,可能有以下情况:
1.虚拟机本身有问题未被正常创建
2.没有共享存储目录,数据在传输过程可能出错
(3) 生产新的配置文件
[root@kvm02 ~]# ls -l /etc/libvirt/qemu
[root@kvm02 ~]# virsh dumpxml test02 > test02.xml
[root@kvm02 ~]# cd /etc/libvirt/qemu/
[root@kvm02 qemu]# ll
(4)定义虚拟机test02配置文件
[root@kvm02 qemu]# virsh define /etc/libvirt/qemu/test02.xml
五.基于数据块的动态迁移
1.在kvm01和kvm02上安装依赖包
(1)设置阿里的yum源
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
(2)修改地址源
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
[root@kvm02 ~]# vim /etc/yum.repos.d/CentOS-QEMU-EV.repo
[centos-qemu-ev]
name=CentOS-$releasever - QEMU EV
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
baseurl=http://mirrors.aliyun.com/$contentdir/$releasever/virt/$basearch/kvm-common/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization
(3)安装依赖包
[root@kvm02 ~]# yum -y install qemu-kvm-ev
备注:安装完成后重启系统
2.迁移前准备
确保源主机和目标主机两台机器上的hosts配置文件一致
192.168.10.201 kvm01
192.168.10.202 kvm02
克隆一台虚拟机
[root@kvm01 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
3.在目的主机kvm02创建同名磁盘文件
[root@kvm02 ~]# mkdir -p /data_kvm/store
[root@kvm02 store]# qemu-img create -f qcow2 /data_kvm/store/test03.qcow2 20G
4.在kvm01主机上执行迁移操作
[root@kvm01 ~]# virsh start test03
[root@kvm01 ~]# virsh migrate test03 qemu+ssh://192.168.10.202/system --live --persistent --undefinesource --copy-storage-all --verbose
备注:
--live:实时迁移
--persistent :将域保留为目标主机物理机器的持久性状态
--undefinesource:删除源主机物理机器上的客户机虚拟机
--copy-storage-all :使用全磁盘复制的非共享存储进行迁移
--verbose:显示迁移的进度
如果提示:
“错误:不支持的配置:Hypervisor 不支持 CPU 型号 Broadwell-noTSX-IBRS“
需要安装软件包如下:
yum -y install centos-release-qemu-ev
yum -y install qemu-kvm-ev
5.验证迁移结果
[root@kvm01 ~]# virsh list --all
[root@kvm02 store]# virsh list --all
六.KSM
1.KSM服务介绍
Linux内核特性称为Kernel Shared Memory(基于内核的共享内存)或Kernel Samepage Merging。KSMD作为守护进程,能够合并内存页面来增加并发虚拟机的数量。KSM 适用于宿主机过载的情况下。KSM 通过减少每个虚拟机实际占用的内存数,可以让多个虚拟机分配的内存数量之和大于物理内存数量。而对于相同类型的虚拟机,在物理内存量不变的情况下,可以在一个宿主机中创建更多虚拟机,从而提高虚拟化部署的密度,同时也可以提高物理资源的利用效率。
(1)检查当前 Linux 系统是否支持 KSM
[root@kvm02 ~]# egrep -i ksm /boot/config-3.10.0-1160.el7.x86_64
CONFIG_KSM=y
(2)ksmd服务的配置文件
[root@kvm02 ~]# ls -l /sys/kernel/mm/ksm/
备注:
KSM 的常用配置的作用分别如下所示。
- max_page_sharing:设置每个 KSM 页面允许的最大共享数量。这个配置设置了重复数据删除限制,以避免虚拟内存 rmap 列表变得太大。max_page_sharing 最小值为 2,因为新创建的 KSM 页面至少有两个共享器。
- merge_across_nodes:指定是否可以合并来自不同 numa 节点的页面。当设置为 0 时,ksm 只合并物理页面并驻留在同一 numa 节点的内存区域中,可以降低访问共享页面的延迟。
- pages_to_scan:在 KSM 进程休眠之前会去扫描的内存数量。
- run:控制 ksmd 进程是否运行,默认值为 0。要激活 ksm 必须设置其值为 1。如果设置为 0,表示停止运行 ksmd, 但会保留已经合并的内存页;如果设置为 1,表示马上运行 ksmd 进程;设置为 2 表示停止运行 ksmd,并分离已经合并的所有内存页,但是保留已经注册为合并的内存区域给下一次使用。
- sleep_millisecs:设置 ksmd 进程休眠的时间(单位:毫秒),即为 ksmd 进程两次运行之间的间隔。
- stable_node_chains_prune_millisecs: 在 stable_node“ 链 ” 中 链 接 的 整 个stable_node“dups”列表被周期性地扫描,以删除陈旧的 stable_nodes。该参数的值用于调节重复扫描的时间(单位:毫秒)。
2.配置KSM优化内存
(1)先将虚拟机test01克隆出三份
[root@kvm02 ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test03 -f /data_kvm/store/test03.qcow2
[root@kvm02 ~]# virt-clone -o test01 -n test04 -f /data_kvm/store/test04.qcow2
注意:
克隆虚拟机,源虚拟机需要关闭状态
(2)开启所有的虚拟机
[root@kvm02 ~]# virsh start test01
[root@kvm02 ~]# virsh start test02
[root@kvm02 ~]# virsh start test03
[root@kvm02 ~]# virsh start test04
(3)查看Linux宿主机的内存使用情况
[root@kvm02 ~]# freetotal used free shared buff/cache available
Mem: 3861288 2464360 135440 15208 1261488 1157748
Swap: 4194300 0 4194300
(4)启动 KSM 服务
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned检查/sys/kernel/mm/ksm/run的值是否为1,如果不是,修改为1
[root@kvm02 ~]# echo 1 > /sys/kernel/mm/ksm/run
(5)再次查看Linux宿主机的内存使用情况
[root@kvm02 ~]# freetotal used free shared buff/cache available
Mem: 3861288 2449008 103556 15212 1308724 1173004
Swap: 4194300 0 4194300