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
–
–
–
评论前必须登录!
注册