路漫漫其修远兮
吾将上下而求索

kvm学习:网络,优化,快照,迁移,克隆

KVM的网络部分

kvm虚拟机启动后,vnet0默认桥接到了virbr0上,关闭后消失
生产中,网络这块改动如下:
一般是添加一个网络设备桥
把宿主机的网卡桥接到这上面
删除原先宿主机的IP地址
把宿主机的地址配置到这个网络设备桥上
最后修改kvm配置文件,让kvm也桥接到这个网络设备桥上

[root@master ~]#brctl show
bridge name bridge id       STP enabled interfaces
virbr0      8000.5254002430ec   yes     virbr0-nic
                            vnet0
[root@master ~]#brctl addbr br0
[root@master ~]#brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.000000000000   no     
virbr0      8000.5254002430ec   yes     virbr0-nic
                            vnet0
下面操作过程中会断网。我们可以写成脚本形式执行,操作如下
[root@master ~]#cat edit-net.sh
brctl  addif  br0  eth0
ip addr del dev eth0 192.168.170.20/24
ifconfig  br0 192.168.170.20/24 up
route add default gw  192.168.170.2
[root@data-1-1 tools]# sh edit-net.sh

可以看到eth0上就没有ip地址了,同时eth0桥接到了br0上了,要永久生效,需要修改配置文件


把kvm也桥接到br0上
interface这里原先配置如下
<interface type='network'>
  <mac address='52:54:00:83:f7:a0'/>
  <source network='default'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

改成如下配置
virsh edit CentOS-7-x86_64
<interface type='bridge'>
  <mac address='52:54:00:83:f7:a0'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>


还有更好的方法,一条命令搞定,此命令不会中断终端,也会自动修改配置文件,推荐下面的
virsh iface-bridge eth0 br0 --no-stp


修改桥接为永久生效的,上述桥接操作,让宿主机的eth0桥接到br0上是临时生效的,加入重启宿主机,就失效了。
之前使用的brctl命令来自于下面包
[root@master ~]#which  brctl
/usr/sbin/brctl
[root@master ~]#rpm -qf /usr/sbin/brctl
bridge-utils-1.5-9.el7.x86_64

创建了一个ifcfg-br0文件,然后更改eth0的配置文件,桥接上去,下面是改动的地方配置情况
[root@master ~]#pwd
/etc/sysconfig/network-scripts
[root@master ~]#cat ifcfg-eth0
TYPE=Ethernet
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@master ~]#cat ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.170.20
NETMASK=255.255.255.0
GATEWAY=192.168.170.2
NAME=br0

KVM的优化部分

3个方面,cpu、内存、IO,优化点不多,介绍下相关概念

cpu的优化部分
ring0内核态,级别高,可以直接操作硬件
ring0,用户态,级别低,无法直接操作硬件,如想写硬盘,切换到内核态执行
这是一种上下文切换

客户机不知道自己是否工作在内核态
vt-x,可以帮你进行上下文切换,加速上下文切换
kvm是个进程,需要被cpu调度,cpu有缓存,为了访问速度更快
kvm可以被调度到任何cpu上执行

这个kvm这时候在cpu1上运行,有了缓存
下一刻跑到了cpu2上执行,这就是cache miss
把kvm绑定到某个cpu上,命中率就搞了,提供性能

taskset绑定进程到某个或者某几个cpu上
绑定之后,性能能提高不到10%
一般一个cpu多核心,它们的缓存是共享的

使用ps aux | grep kvm命令查看到当前kvm虚拟机进程号是8598,我把它绑定到1号cpu上运行
[root@master ~]#taskset -cp 1 8598
pid 8598's current affinity list: 0-3
pid 8598's new affinity list: 1

把它绑定到1号和2号运行,让它只能在这两个cpu之间运行
[root@localhost ~]#taskset -cp 1,2 8598
pid 8598's current affinity list: 1
pid 8598's new affinity list: 1,2




内存优化
1、宿主机bios打开EPT功能,加快地址映射
2、宿主机系统配置大页内存,这样寻址快一点(使用大页内存虚拟机性能提高10%以上)
3、打开内存合并

EPT为了提升虚拟化内存映射的效率而提供的一项技术。
打开EPT后,GuestOS运行时,通过页表转化出来的地址不再是真实的物理地址,而是被称作为guest-physical addresses,经过EPT的转化后才成为真实的物理地址。
可以使用 $cat /proc/cpuinfo | grep ept检查硬件是否支持ept机制。如果支持那么kvm会自动的利用EPT。

intel开发的ept技术加快地址映射。bios打开这个功能就行

现在宿主机的是进行内存的合并。把连续的内存合并为2MB的大页内存
减少内存碎片
[root@master ~]#cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

大页内存,这里默认是2MB
[root@master ~]#cat /proc/meminfo | tail -10
VmallocChunk:   34359451736 kB
HardwareCorrupted:     0 kB
AnonHugePages:    362496 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       85824 kB
DirectMap2M:     4108288 kB

关于快照功能部分

快照配置文件在/var/lib/libvirt/qemu/snapshot/虚拟机名称/下,目前由于还没做快照,目录下没任何东西
关于快照的命令参数可以查看下面

[root@master /var/lib/libvirt/qemu/snapshot]#virsh --help | grep snapshot
    iface-begin                    create a snapshot of current interfaces settings, which can be later committed (iface-commit) or restored (iface-rollback)
 Snapshot (help keyword 'snapshot')
    snapshot-create                Create a snapshot from XML
    snapshot-create-as             Create a snapshot from a set of args
    snapshot-current               Get or set the current snapshot
    snapshot-delete                Delete a domain snapshot
    snapshot-dumpxml               Dump XML for a domain snapshot
    snapshot-edit                  edit XML for a snapshot
    snapshot-info                  snapshot information
    snapshot-list                  List snapshots for a domain
    snapshot-parent                Get the name of the parent of a snapshot
    snapshot-revert                Revert a domain to a snapshot


raw磁盘格式的虚拟机不支持快照功能
kvm虚拟机默认使用raw格式的镜像格式,性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等。
要使用镜像功能,磁盘格式必须为qcow2,转换格式时虚拟机必须先关机,-f 源镜像的格式,-O 目标镜像的格式,转换成qcow2格式的。

[root@master /var/lib/libvirt/qemu/snapshot]#virsh shutdown centos-7.5_1
Domain centos-7.5_1 is being shutdown

[root@master /var/lib/libvirt/qemu/snapshot]#virsh snapshot-create centos-7.5_1
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

[root@master /data]#qemu-img info centos-7.5_1.raw 
image: centos-7.5_1.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.6G

[root@master /data]#qemu-img convert -f raw -O qcow2 centos-7.5_1.raw centos-7.5_1.qcow2 

[root@master /data]#qemu-img info centos-7.5_1.qcow2 
image: centos-7.5_1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

可以看到它是保留了原来的文件
[root@master /data]#ll
total 4123792
-rw-r--r-- 1 root root  1568538624 Jul 22 22:08 centos-7.5_1.qcow2
-rw-r--r-- 1 root root 10737418240 Jul 22 22:05 centos-7.5_1.raw
-rw-r--r-- 1 root root        4915 Jul 22 21:42 centos-7.5_1.xml


修改配置文件的disk模块,把磁盘改成最新的qcow2的这个文件,同时格式也改成qcow2的
[root@master /data]#virsh edit centos-7.5_1
 39     <emulator>/usr/libexec/qemu-kvm</emulator>
 40     <disk type='file' device='disk'>
 41       <driver name='qemu' type='qcow2'/>
 42       <source file='/data/centos-7.5_1.qcow2'/>


开始做快照备份,如果不放心,可以先启动kvm,没问题后关闭再执行快照
看到下面路径下出现了快照目录和文件
[root@master /data]#virsh snapshot-create centos-7.5_1
Domain snapshot 1532268735 created

[root@master /data]#cd /var/lib/libvirt/qemu/snapshot/
[root@master /var/lib/libvirt/qemu/snapshot]#ll -h
total 4.0K
drwxr-xr-x 2 root root 4.0K Jul 22 22:12 centos-7.5_1

[root@master /var/lib/libvirt/qemu/snapshot]#cd centos-7.5_1/
[root@master /var/lib/libvirt/qemu/snapshot/centos-7.5_1]#ll
total 8
-rw------- 1 root root 4749 Jul 22 22:12 1532268735.xml

[root@master ~]#virsh snapshot-list centos-7.5_1
 Name                 Creation Time             State
------------------------------------------------------------
 1532268735           2018-07-22 22:12:15 +0800 shutoff


查看快照,再次创建一个快照
[root@master /var/lib/libvirt/qemu/snapshot/centos-7.5_1]#virsh snapshot-create centos-7.5_1
Domain snapshot 1532268864 created

[root@master /var/lib/libvirt/qemu/snapshot/centos-7.5_1]#ll
total 16
-rw------- 1 root root 4749 Jul 22 22:14 1532268735.xml
-rw------- 1 root root 4800 Jul 22 22:14 1532268864.xml

[root@master ~]#virsh snapshot-list centos-7.5_1
 Name                 Creation Time             State
------------------------------------------------------------
 1532268735           2018-07-22 22:12:15 +0800 shutoff
 1532268864           2018-07-22 22:14:24 +0800 shutoff

也就是说,配置文件里面只记录了快照的配置信息,以及此快照的父快照是什么,具体的文件快照是在磁盘文件里面的,如下面
[root@master ~]#qemu-img info /data/centos-7.5_1.qcow2 
image: /data/centos-7.5_1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1532268735                0 2018-07-22 22:12:15   00:00:00.000
2         1532268864                0 2018-07-22 22:14:24   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: false

[root@master ~]#virsh snapshot-current centos-7.5_1
<domainsnapshot>
  <name>1532268864</name>
  <state>shutoff</state>
  <parent>
    <name>1532268735</name>
  </parent>
  <creationTime>1532268864</creationTime>



恢复到某个版本的快照状态
[root@master ~]#virsh snapshot-revert centos-7.5_1 1532268735


删除某个快照
[root@master ~]#virsh snapshot-delete centos-7.5_1 1532268864
Domain snapshot 1532268864 deleted

[root@master ~]#virsh snapshot-list centos-7.5_1
 Name                 Creation Time             State
------------------------------------------------------------
 1532268735           2018-07-22 22:12:15 +0800 shutoff

虚拟机冷迁移

需要另外一台kvm物理机:kvm02,在kvm02中安装kvm组件,
[root@kvm02 ~]# yum install libvirt* virt-* qemu-kvm* -y

配置桥接网络
[root@kvm02 ~]# virsh iface-bridge eth0 br0
[root@kvm02 ~]# mkdir -p /data

将虚拟机关机,导出配置文件
[root@kvm data]# virsh dumpxml clsn7 >clsn7.xml

将虚拟机文件传输到kvm02上
[root@kvm data]# scp -rp  clsn7.xml clsn.qcow2  10.0.0.201:/data

导入配置文件
[root@kvm02 ~]# virsh define clsn7.xml

启动虚拟机
[root@kvm02 ~]# virsh start clsn7

查看虚拟机状态
[root@kvm02 ~]# virsh list --all 
 Id    名称                         状态
----------------------------------------------------
 5     clsn7                          running

KVM克隆

克隆需要实现的步骤
第一步:复制虚拟磁盘文件
第二步:修改xml配置文件
  1)name
  2)uuid
  3)虚拟磁盘存储路径
  4)mac地址

脚本实现思路
1) 备份old_vm的配置文件,并重定向生成一个新的虚拟机配置文件
2)取出old_vm的磁盘路径
3)创建新的链接磁盘文件
4) 修改xml配置文件
5) 导入新虚拟机
6)启动测试

具体操作如下

[root@master /data]#cat kvm_clone.sh  #脚本还有缺陷,vnc端口没有改
#!/bin/bash


# init
if [ $# -ne 2 ]
  then 
    echo "Usage: $0 OLD_VMNAME NEW_VMNAME"
    exit 2
fi
LOG=/var/log/messages
old_vm=$1
new_vm=$2
new_xml="/tmp/${new_vm}.xml"
. /etc/init.d/functions

# dump old xmlfile 
virsh dumpxml $old_vm >$new_xml
old_disk=`awk -F "'" '/source file/{print $2}'  $new_xml`
tmp_dir=`dirname $old_disk`
new_disk=${tmp_dir}/${new_vm}.qcow2

# make link disk 
qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG

# make over xml info 
sed -i '/uuid/d' $new_xml
sed -i '/mac address/d' $new_xml
sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml
sed -i "s#$old_disk#$new_disk#g" $new_xml
sed -i '/source mode/d' $new_xml

# import new xml file
virsh define $new_xml &>> $LOG

# start new vm 
virsh start $new_vm &>> $LOG
if [ $? -eq 0 ]
  then 
   action "vmhost $new_vm start"  /bin/true 
else 
   action "vmhost $new_vm start"  /bin/false
   echo "log info : $LOG"
fi

# END
\rm $new_xml


[root@master /data]#virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos-7.5_1                   shut off

[root@master /data]#bash kvm_clone.sh centos-7.5_1 centos-7.5_2
vmhost centos-7.5_2 start                                  [  OK  ]

[root@master /data]#virsh list --all
 Id    Name                           State
----------------------------------------------------
 6     centos-7.5_2                   running
 -     centos-7.5_1                   shut off

[root@master /data]#ll
total 2319960
-rw-r--r-- 1 qemu qemu 1419640832 Sep 15 22:08 centos-7.5_1.qcow2
-rw-r--r-- 1 qemu qemu    6094848 Sep 15 22:16 centos-7.5_2.qcow2

参考文档:

https://www.cnblogs.com/nmap/p/6369180.html

http://www.cnblogs.com/clsn/p/8366251.html

未经允许不得转载:江哥架构师笔记 » kvm学习:网络,优化,快照,迁移,克隆

分享到:更多 ()

评论 抢沙发

评论前必须登录!