提到KVM热操作,还有一个对应的便是冷操作,所谓冷热操作,差异在于是否须要对虚拟机系统进行重启操作。
本篇紧张先容,在KVM虚拟化实践中,哪些是可以热操作的,不须要重启虚拟机即可使变动的配置生效。
包含以下内容:

1. KVM虚拟机硬盘热添加
2. KVM虚拟机热添加内存
3. KVM虚拟机热添加CPU
4. KVM虚拟机热添加网卡
5.在线刷新防火墙策略
6. CPU动态绑定
1. KVM虚拟机硬盘热添加
热添加硬盘有两个方法,一个是通过命令行,来添加;二个是手动创建xml文件,然后利用attach-device热添加硬盘。
方法一:
创建一块50G的硬盘命名为attack-disk.qcow2,格式指定为qcow2;[root@localhost ~]qemu-img create -f qcow2 /datapool/attack-disk.qcow2 50G
查看须要热添加硬盘的虚拟机当前磁盘的状态[root@localhost ~]virsh domblklist e364bba5-12dd-4044-a52b-4e7c8cf65148
Target Source
------------------------------------------------
vda /dev/vmVG/1deced67-0959-44b6-89bb-d1b1eb401d2f
解释:e364bba5-12dd-4044-a52b-4e7c8cf65148是虚拟机名称,当前这台虚拟机只有一块磁盘vda;
热添加磁盘attack-disk.qcow2到虚拟机中[root@localhost ~]#virsh attach-disk e364bba5-12dd-4044-a52b-4e7c8cf65148 /datapool/attack-disk.qcow2 vdb --cache none --subdriver qcow2
Disk attached successfully
解释:attach-disk后面跟的参数vdb表示硬盘的标识,不能和已有的硬盘标识相同,--cache,指定硬盘缓存策略为none;--subdriver,指定添加磁盘的格式为qcow2默认是raw格式;
查看效果[root@ localhost ~]# virsh domblklist e364bba5-12dd-4044-a52b-4e7c8cf65148
Target Source
------------------------------------------------
vda /dev/vmVG/1deced67-0959-44b6-89bb-d1b1eb401d2f
vdb /datapool/attack-disk.qcow2
查看磁盘状态,多了一块vdb磁盘
[root@guest ~]#fdisk -l
Disk /dev/vdb: 53.6 GB, 53687091200 bytes
16 heads, 63 sectors/track, 104025 cylinders
Units = cylinders of 1008 512 = 516096 bytes
Disk /dev/vdb doesn't contain a valid partition table
在虚拟机内部查看,硬盘已经添加进来了
把稳:在热添加磁盘的时候,在虚拟机内部须要先确定acpiphp是否已经加载。
[root@centos5 ~]# lsmod |grep acpiphp
acpiphp 58841 0
如果未加载的话,须要先加载,虚拟机内部无法看到热添加的磁盘。
方法二:
创建须要热添加硬盘的xml文件, attack-disk.xml[root@localhost ~]# cat attack-disk.xml
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/datapool/attack-disk.qcow2'/>
<target dev='vdb' bus='virtio'/>
<alias name='virtio-disk2'/>
</disk>
利用attach-device加载xml文件[root@localhost ~]#virsh attach-device e364bba5-12dd-4044-a52b-4e7c8cf65148 attack-disk.xml
把稳:
在完成了热添加硬盘之后,须要编辑虚拟机的xml配置文件将新添加硬盘部分的配置添加进去。否则下次重启的时候,新添加的硬盘就消逝了。
2. KVM虚拟机热添加内存
对付KVM虚拟机热添加内存,目前利用Libvirt实现并不完备,但是Libvirt供应了一个变通的办法,便是可以在线变更虚拟机内存大小。真正的热添加内存qemu-kvm也可以实现,但是存在诸多限定和繁琐的配置,有兴趣的朋友可以参考这个链接http://blog.csdn.net/cybertan/article/details/8333791,由于通用性太低,所有这边就不做先容了。以下看看,如何利用Libvirt来对虚拟机进行内存增减。
查看当前虚拟机内存干系的配置项[root@localhost ~]#virsh dumpxml e364bba5-12dd-4044-a52b-4e7c8cf65148
<…>
<memory unit='KiB'>2096128</memory>
<currentMemory unit='KiB'>2096128</currentMemory>
<…>
包括两个配置项,memory表示内存大小2096128/1024/1024=2G,这个配置项解释虚拟机最大用2G,currentMemory表示当前利用内网2096128/1024/1024=2G也是2G,一样平常情形下,这两个值是一样的,如果要在线增加内存就弗成了,但是如果业务许可的话,可以在线减内存。如果要实现在线加内存,须要实现配置较大内预制内存。
[root@localhost ~]# setmaxmem e364bba5-12dd-4044-a52b-4e7c8cf65148 4G
virsh # setmaxmem e364bba5-12dd-4044-a52b-4e7c8cf65148 4G
error: Unable to change MaxMemorySize
error: Requested operation is not valid: cannot resize the maximum memory on an active domain
这个命令须要再关机情形下实行,否则涌现如上报错。
关机情形下调度预制内存大小,并开机[root@localhost ~]# virsh setmaxmem e364bba5-12dd-4044-a52b-4e7c8cf65148 4G
[root@localhost ~]# virsh start e364bba5-12dd-4044-a52b-4e7c8cf65148
利用setmem在线调度虚拟机内存大小[root@localhost ~]# virsh setmem e364bba5-12dd-4044-a52b-4e7c8cf65148 1G
实行完成之后,虚拟机内存就在线调度了。
把稳:
在线热添加内存,有以下3个把稳点:
1)须要在虚拟机关机的情形下调度预制内存大小,之后才能热添加内存;
2)经测试,linux centos5,6的虚拟机可以实时生效,对付windows的虚拟机无法直接识别。
3) 如果你的虚拟机通过define再start的,须要编辑对付的xml文件,否则下次启动变更会失落效。
3. KVM虚拟机热添加CPU
首先须要解释一下,对付cpu的热添加支持,从RedHat RHEL6.5 发行版才开始支持。
查看xml配置文件中关于vcpu的项[root@localhost ~]# virsh setmem e364bba5-12dd-4044-a52b-4e7c8cf65148 1G
[root@ localhost ~]# virsh dumpxml 9f2464c8-9250-4d90-833f-0d79490b0761|grep vcpu
<vcpu placement='static' current='6'>8</vcpu>
解释:8 表示可以利用的vcpu是8核,利用热添加的vcpu核数最多为8核;current=6,表示当前vcpn的核数为6;
热添加cpu[root@localhost ~]# virsh setvcpus 9f2464c8-9250-4d90-833f-0d79490b0761 8
解释:添加成功无任何返回提示信息,如果你的宿主机系统低于redhat6.5发行版,会看到如下提示error:Operation not supported: qemu didn't unplug the vCPUs properly
查看虚拟机内部cpu情形[root@localhost ~]# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 8191 MB
node 0 free: 7695 MB
node distances:
node 0
0: 10
解释:可以看到当前是1个物理cpu,里面包含8个核心。
把稳:
热添加cpu有三把稳点:
1)宿主机的发行版须要大于redhat6.5;
2)必须现在关机状态先调度最大vcpn的配置,之后才能实现热添加cpu。
3)如果你的虚拟机通过define再start的,须要编辑对付的xml文件,否则下次启动变更会失落效。
4. KVM虚拟机热添加网卡
热添加网卡,与热添加硬盘类似,有两种实现的方法
方法一:直策应用virsh命令实现
[root@localhost ~]# virsh attach-interface 9f2464c8-9250-4d90-833f-0d79490b0761 --type bridge --source virbr0 --model e1000
解释:9f2464c8-9250-4d90-833f-0d79490b0761为虚拟机名称,--type实行网卡类型是bridge,--source指定桥接到宿主机virbr0 网桥,--model 指定网卡的驱动e1000。
[root@gues ~]# ethtool -i eth2
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:00:09.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
在虚拟机内部可以看到,新加的网卡eth2驱动为e1000
方法二:编辑xml,然后之后
创建网卡的配置文件,命名为attach-interface.xml[root@localhost ~]# cat attach-interface.xml
<interface type='bridge'>
<mac address='52:54:00:e9:0a:6f'/>
<source bridge='virbr0'/>
<model type='virtio'/>
</interface>
解释:type指定为bridge,驱动为virtio,桥接到宿主机的virbr0上。
加载xml的配置[root@localhost ~]# virsh attach-device 9f2464c8-9250-4d90-833f-0d79490b0761 attach-interface.xml
Device attached successfully
系统内部查看网卡情形[root@localhost ~]# ethtool -i eth4
driver: virtio_net
version:
firmware-version:
bus-info: virtio6
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
在线卸载网卡
查看当前虚拟机有哪些网卡[root@localhost ~]# virsh domiflist 9f2464c8-9250-4d90-833f-0d79490b0761
Interface Type Source Model MAC
-------------------------------------------------------
vnet3 bridge br0 virtio 00:16:3e:f1:e1:ac
vnet4 bridge br1 virtio 00:16:3e:77:42:5a
vnet9 bridge virbr0 e1000 52:54:00:05:20:a1
卸载vnet9的网卡[root@localhost ~]#virsh detach-interface 9f2464c8-9250-4d90-833f-0d79490b0761 --type bridge --mac 52:54:00:05:20:a1
Interface detached successfully
把稳:
网卡热添加,操作完成之后,须要edit xml配置文件,将变革的部分添加进去,否则下次虚拟机关机,在启动的时候,在线添加网卡会丢失。
5.在线刷新防火墙策略
Libvirt本身供应了虚拟机防火墙的功能,利用起来也非常的方便,以下就来先容一下如何利用Libvirt来给虚拟机添加防火墙策略,并演示在线刷新虚拟机防火墙策略。
首先,先容一下环境,所有虚拟机网卡都因此桥接的办法配置的。宿主机系统发行版今年夜于centos6.3,Libvirt版本为操作系统发行版中自带的版本,Libvirt防火墙都生效。
利用Libvirt防火墙,须要开启网桥的filter功能,编辑/etc/sysctl.conf[root@localhost ~]#cat /etc/sysctl.conf |grep net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1
添加net.bridge.bridge-nf-call-iptables= 1
利用virsh nwfilter-list查看当前宿主机上包含nwfilter策略[root@localhost ~]# virsh nwfilter-list
UUID Name
----------------------------------------------------------------
80141227-1af8-da81-9e44-9b4a8307f967 allow-arp
f54c1fe9-0fd6-c58b-5561-9668c6e90431 allow-dhcp
695baf56-0f42-dd57-1b8e-38edd0381bff allow-dhcp-server
8a4a8fe8-3136-c8c7-5edd-d8aad518bd0d allow-incoming-ipv4
dea9a35c-b383-698a-67e3-c4fe988b1397 allow-ipv4
1d5ba7cf-bcdb-9c17-d0e4-2b891cffb9a1 clean-traffic
de11b7ca-c5fa-a5c7-a570-25bc6ad8d71f no-arp-ip-spoofing
b36d63ae-fe50-cbb9-67a1-acf2e54e7215 no-arp-mac-spoofing
b83b084e-b3e3-aaf9-8887-d32708271f7d no-arp-spoofing
378e60c5-38b8-61a7-890d-e5481ffcbcc5 no-ip-multicast
1a59943e-39f0-f774-90ab-6b16c3fa28ae no-ip-spoofing
152dc790-fd40-fe23-ee46-074dede49b76 no-mac-broadcast
8fa76d9d-3746-35bf-1db5-afecdcd0adf7 no-mac-spoofing
7ace5f7d-a01e-5149-2186-cc0e47946be8 no-other-l2-traffic
9dcff82a-2111-b71f-957a-6f2fca823687 no-other-rarp-traffic
475cb614-0baa-c109-06d9-51142c619c25 qemu-announce-self
07b45c81-6f17-72b8-5cda-4db41a5f7911 qemu-announce-self-rarp
查看nwfilter的详细内容,可以利用nwfilter-dumpxml[root@localhost ~]#virsh nwfilter-dumpxml clean-traffic
<filter name='clean-traffic' chain='root'>
<uuid>1d5ba7cf-bcdb-9c17-d0e4-2b891cffb9a1</uuid>
<filterref filter='no-mac-spoofing'/>
<filterref filter='no-ip-spoofing'/>
<rule action='accept' direction='out' priority='-650'>
<mac protocolid='ipv4'/>
</rule>
<filterref filter='allow-incoming-ipv4'/>
<filterref filter='no-arp-spoofing'/>
<rule action='accept' direction='inout' priority='-500'>
<mac protocolid='arp'/>
</rule>
<filterref filter='no-other-l2-traffic'/>
<filterref filter='qemu-announce-self'/>
</filter>
解释一下,clean-traffic这个策略中各定义项的含义
<filter name='clean-traffic' chain='root'> :定义策略名称,filter策略链,如果纯挚一个功能可以写root、stp、mac、vlan、ipv4、ipv6、arp、rarp;
<filterref filter='no-mac-spoofing'/> :如果你的策略中须要引用一些根本策略,可以在这个定义;
<rule action='accept' direction='out' priority='-650'>
<mac protocolid='ipv4'/>
</rule>
这是一个详细的策略,action=’accept’,这条定义的是accept策略,direction定义策略的方向,可以配置in 或者out,priority定义策略优先级[-1000,1000],值越小,优先级越高
创建一个防火墙策略的配置文件deny_ping.xml,浸染是仅许可固定ipping<filter name='deny_ping' chain='root'>
<uuid>6c44d2b6-575f-41e8-bb47-d1a525295dbb</uuid>
<filterref filter='clean-traffic'/>
<rule action='accept' direction='in' priority='300'>
<icmp srcipaddr='192.168.1.1'/>
</rule>
<rule action='drop' direction='in' priority='300'>
<icmp/>
</rule>
</filter>
解释:在策略中定义了两条rule ,第一条是许可192.168.1.1的icmp,第二条是谢绝所有icmp
把这个策略define到nwfilter中[root@localhost ~]#virsh nwfilter-define deny_ping.xml
Network filter deny_ping defined from deny_ping.xml
define策略之后,编辑虚拟机的配置文件,在须要配置防火墙策略的接口下添加[root@localhost ~]#virsh dumpxml vm-name
<……>
<interface type='bridge'>
<mac address='02:00:73:b6:53:f5'/>
<source bridge='br0'/>
<target dev='vnet7'/>
<model type='e1000'/>
<filterref filter=' deny_ping '> //在这里引用策略
<parameter name='IP' value='192.168.1.2'/> //这条实现了ip绑定,在这个接口上只能配置这个ip,否则虚拟机就不通
</filterref>
<alias name='net1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</interface>
<…..>
配置完成之后,启动虚拟机,nwfilter防火墙即可生效,须要修正的话,只须要编辑deny_ping.xml,然后直接define就实时生效了把稳:
nwfilter实际上是在宿主机上有Libvirt来插入了对应的防火墙策略,以是哀求宿主机上防火墙必须开启。如果宿主机上的防火墙关闭或者重启之后,须要重启Libvirtd,使nwfilter重新生效。详细的策略配置请参考:http://Libvirt.org/formatnwfilter.html。
6. CPU动态绑定
在一个宿主机上,如果运行了多台虚拟机,在不做cpu绑定和限定的时候,会涌现cpu资源的争抢。绑定cpu有方法有很多,比如在虚拟机的配文件中编辑
<vcpu placement='static' cpuset='0'>1</vcpu>
虚拟机配置1核,与物理cpu的cpu0绑定。
用这种办法绑定cpu,上风在于管理方便,操作大略,劣势便是不足灵巧。
以下先容两个动态绑定的方法。
方法一:利用cgroup来实现。
查看须要绑定虚拟机的进程和线程id[root@localhost~]#ps -eLo pid,lwp,psr,args|grep 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f|grep -v 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f
30587 30587 2 /usr/libexec/qemu-kvm -name 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f -S -M rhel6.5.0 ……
30587 30590 2 /usr/libexec/qemu-kvm -name 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f -S -M rhel6.5.0 ……
30587 30591 5 /usr/libexec/qemu-kvm -name 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f -S -M rhel6.5.0 ……
解释:虚拟机名称为5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f,虚拟机的进程号为30687,这台虚拟机有两个cpu,分别对应的线程号是30590和30591
将虚拟机的cpu绑定在物理核cpu1上[root@localhost~]#echo \"大众1\"大众>/cgroup/cpuset/Libvirt/qemu/5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f/emulator/cpuset.cpus
[root@localhost~]# echo \"大众30590\"大众>/cgroup/cpuset/Libvirt/qemu/5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f/emulator/tasks
[root@localhost~]# echo \公众30591\"大众>/cgroup/cpuset/Libvirt/qemu/5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f/emulator/tasks
解释:将虚拟机的两个cpu线程绑定到物理cpu1上
查看当前虚拟机cpu的亲和度[root@localhost~]#virsh vcpuinfo 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f
VCPU: 0
CPU: 1
State: running
CPU time: 436.7s
CPU Affinity: -y------ //这项表示虚拟机对宿主机cpu的亲和度,表示虚拟机的cpu线程在cpu1上调度。
VCPU: 1
CPU: 1
State: running
CPU time: 1686.8s
CPU Affinity: -y------
在虚拟机内部做cpu压力测试,不雅观察宿主机cpu利用率,会看到压力都在cpu1上方法二:通过taskset 来热绑定cpu
打消cgroup的配置[root@localhost~]#echo >/cgroup/cpuset/Libvirt/qemu/5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f/emulator/tasks
[root@localhost~]#echo 0-7>/cgroup/cpuset/Libvirt/qemu/5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f/emulator/cpuset.cpus
分别绑定虚拟机cpu的两个核到cpu3,cpu5[root@localhost~]# taskset -p 0x8 30590
pid 30590's current affinity mask: ff
pid 30590's new affinity mask: 8
[root@localhost~]# taskset -p 0x20 30591
pid 30591's current affinity mask: ff
pid 30591's new affinity mask: 20
解释:0x8 是一个十六进制数表示,转换为8位二进制数00001000,由于物理机cpu是8核,所有转化为8位二进制数,再倒序得到 00010000,这个便是cpu3
在宿主机上查看该虚拟机的cpu亲和度[root@localhost~]# virsh vcpuinfo 5e1397fd-9557-4e2c-9d76-6e5ea78b2d1f
VCPU: 0
CPU: 3
State: running
CPU time: 436.8s
CPU Affinity: ---y----
VCPU: 1
CPU: 5
State: running
CPU time: 1687.0s
CPU Affinity: -----y--
此时在虚拟机内部压cpu压力的时候,会看到压力落在宿主机的cpu3,cpu5上把稳:
以上两种cpu热绑定操作,最好利用程序来操作。
总结
本篇大略的先容一下在KVM中可以实现热操作的工具。比如硬件上有硬盘、网卡、内存、cpu,紧张的配件都可以支持热操作,但是也须要把稳有一些限定条件,比如内存、cpu的热操作须要预先在xml配置文件里面做一下预分配。cpu热操作只在CentOS 6.5发行版之后支持。
其余本篇还先容了,两个比较常用的热操作,防火墙策略在线刷新和cpu热绑定。本篇的先容,也只是抛砖迎玉,须要深度理解的话,可以借助一些官方文件,http://Libvirt.org/上有非常详细的先容。
作者简介:
杨俊俊
《深度实践KVM》作者,资深虚拟化专家,精通虚拟化项目的评估与履行,精通开源分布式文件系统在生产环境的运维与实践。