KVM相关操作

简介

可以使用多种方式创建虚拟机,例如qemu,virt-manager等。本例使用virt-install创建Ubuntu14.04虚拟机demo。以demo虚拟机为例,通过virsh工具进行CPU扩容,内存扩容,网络桥接,内存优化,磁盘I/O优化测试等,通过这些方式,让读者掌握KVM虚拟机的日常管理操作。


操作环境

宿主机操作系统:Ubuntu14.04版本,4.2.0-27-generic内核,QEMU2.0.0版本,IP地址192.168.70.204。
虚拟机操作系统:Ubuntu14.04版本。

操作软件:

sudo apt-get install kvm 
sudo apt-get install virt-manager

内容及步骤


1、VIRSH创建和管理虚拟机

(1) 在宿主机上,创建虚拟磁盘,-f指定格式,代码如下所示:

root@xjy-pc:/home/kvm# qemu-img create -f raw /home/kvm/ubuntu.raw 10G
Formatting '/home/kvm/ubuntu.raw', fmt=raw size=10737418240

(2) 使用virt-install(读者也可以通过其他方式创建虚拟机),通过步骤一中创建的虚拟磁盘,创建一台Ubuntu虚拟机,命名为demo,指定VNC端口号。如下所示:

root@xjy-pc:/home/kvm# virt-install --name demo --virt-type kvm --ram 1024 --cdrom /home/kvm/iso/ubuntu-14.04-desktop-amd64.iso --disk /home/kvm/ubuntu.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

Starting install...
Creating domain...                                             |    0 B     00:00     
Domain installation still in progress. You can reconnect to the console to complete the installation process.

(3) 在另外一台Windows操作系统中,打开一个VNC客户端,输入服务器IP地址和VNC端口号(这里是192.168.70.204:5900),连接建立的KVM虚拟机,如图1所示。

图1 VNC连接KVM虚拟机


(4) 将步骤二中的Ubuntu虚拟机逐步进行安装,图2为安装过程界面,安装完成后,图3所示为Ubuntu虚拟机启动后界面。

图2 Ubuntu14.04的安装界面
这里写图片描述

图3 Ubuntu14.04虚拟机

这里写图片描述


(5) 可以使用virsh list查看已经启动的虚拟机,如果未启动,使用命令“virsh start demo”进行启动,代码如下所示:

root@xjy-pc:/etc/libvirt/qemu# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     demo                           shut off

root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started

root@xjy-pc:/etc/libvirt/qemu# virsh list --all
 Id    Name                           State
----------------------------------------------------
 12    demo                           running

(6) 可以使用“virsh shutdown demo”关闭demo虚拟机,使用“virsh destroy demo”强制关闭demo虚拟机电源。如下所示:

root@xjy-pc:/etc/libvirt/qemu# virsh list --all
 Id    Name                           State
----------------------------------------------------
 12    demo                           running

root@xjy-pc:/etc/libvirt/qemu# virsh destroy demo
Domain demo destroyed

root@xjy-pc:/etc/libvirt/qemu# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     demo                           shut off

(7) KVM虚拟机配置文件默认位置为: /etc/libvirt/qemu/,可以通过配置文件定义并启动虚拟机,命令为:virsh create /etc/libvirt/qemu/demo.xml

(8) 通过virsh将内存中运行的虚拟机导出至虚拟机配置文件,命令为:# virsh dumpxml demo > /etc/libvirt/qemu/demo2.xml,如图4所示。

图4 将虚拟机导出xml文件
这里写图片描述

(9) 通过“virsh edit demo”可以编辑KVM虚拟机配置文件,virsh edit将调用vi命令编辑/etc/libvirt/qemu/demo.xml配置文件。也可以直接通过vi命令进行编辑,修改,保存。


2、CPU扩容

(1) 使用“virsh edit”编辑虚拟机,为了实现CPU的热添加,就需要更改CPU的最大值,当然热添加值不能超过最大值。修改demo虚拟机的vcpu的配置当前为1,自动扩容,最大为4,代码如下:

root@xjy-pc:/etc/libvirt/qemu# virsh edit demo
<domain type='kvm'>
  <name>demo</name>
  <uuid>7ed0d5dd-d283-5390-9575-c1458db792fd</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='auto' current='1'>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
<acpi/> 
……

(2) 关闭虚拟机demo,再次启动,并使用“virsh setvcpus”命令将demo热修改为2个cpu。

root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/etc/libvirt/qemu# virsh start demo 
Domain demo started
root@xjy-pc:/etc/libvirt/qemu# virsh setvcpus demo 2 --live

(3) 通过VNC登录KVM虚拟机,使用命令“grep processor /proc/cpuinfo |wc -l”查看是否扩容成功,如果结果为2,说明扩容成功。


3、内存扩容

(1) 内存的设置拥有一个气球(balloon)机制,可以增大也可以减少,但要设置一个最大值,默认并没有最大值,可以在安装时指定。

(2) 使用virsh edit编辑demo虚拟机的配置文件,标签表示最大内存。将图5中标签内容设置为4194304(4G),如图6所示。标签内容表示当前内存为1048576(1G)。

图5 demo虚拟机配置文件
这里写图片描述

图6 修改demo虚拟机配置文件
这里写图片描述

(3) 配置文件修改后,关闭虚拟机demo,再次启动。如下所示:

root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown

root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started

(4) demo虚拟机内存修改之前使用“virsh qemu-monitor-command”命令查看demo的当前内存。代码如下,“balloon: actual=1024”表示当前的内存为1024M,即1G。

root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd info balloon
balloon: actual=1024

(5) 将demo内存热修改为2097M,即2G。修改完毕后再次查看当前内存,代码如下:

root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd balloon 2097

root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd info balloon
balloon: actual=2097

(6) 可以看出内存已经热修改为2G。


4、网络管理

(1) 在默认情况KVM的网络是NAT模式,但是在生产情况,用的多的都是网桥模式。

(2) 首先在宿主机上添加一个网桥br0,并查看网桥信息。使用命令“brctl”。代码如下:

root@xjy-pc:~# brctl addbr br0
root@xjy-pc:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no
virbr0          8000.fe540048bd84       yes             vnet0

(3) 网桥br0添加完毕后,查看br0的ip地址,代码如下:

root@xjy-pc:~# ifconfig br0
br0       Link encap:Ethernet  HWaddr 26:f4:b6:0d:7a:7f  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

(4) 接下来使用桥接模式把eth0加入网桥br0,让eth0成为br0的一个端口。同时将eth0接口ip删除,给br0设置ip为192.168.70.205,24位子网掩码。同时添加路由网关为192.168.70.2,并关闭防火墙,代码如下:(这个步骤会导致宿主机的网络断掉,之后重新通过bridge建立网络连接,所以建立bridge这个步骤不要通过SSH连接远程配置。)

root@xjy-pc:~# brctl addif br0 eth0 &&ip addr del dev eth0 192.168.70.204/24 && ifconfig br0 192.168.70.205/24 up && route add default gw 192.168.70.2&& iptables -F

(5) 再次查看网桥br0的ip地址,代码如下:

root@xjy-pc:~# ifconfig br0
br0       Link encap:Ethernet  HWaddr 00:25:90:76:67:b5  
          inet addr:192.168.70.205  Bcast:192.168.70.255  Mask:255.255.255.0
          inet6 addr: fe80::225:90ff:fe76:67b5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:528 errors:0 dropped:0 overruns:0 frame:0
          TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:76041 (76.0 KB)  TX bytes:15118 (15.1 KB)

(6) 使用virsh edit命令编辑虚拟机的网络配置,修改为使用br0网桥模式。

图7 demo虚拟机未修改前网络配置
这里写图片描述

图8 demo虚拟机修改后网络配置
这里写图片描述

(7) 将demo虚拟机关闭后重新启动,代码如下:

root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown

root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started

(8) 使用VNC连接demo虚拟机,在demo虚拟机中配置其静态IP地址为192.168.70.203后重启网卡。代码如下:

root@demo-pc:~# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 51:54:00:48:bd:84  
          inet addr:192.168.70.203  Bcast:192.168.70.255  Mask:255.255.255.0
          inet6 addr: fe80::225:90ff:fe76:67b5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:208452 errors:0 dropped:219 overruns:0 frame:0
          TX packets:702108 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:66675114 (66.6 MB)  TX bytes:1010891428 (1.0 GB)
          Interrupt:20 Memory:f7a00000-f7a20000 
root@demo-pc:~# /etc/init.d/networking restart

(9) 在KVM服务器上使用ping命令测试与demo虚拟机的连通性,代码如下:

root@xjy-pc:~# ping 192.168.70.203 -c 5
PING 192.168.70.203 (192.168.70.203) 56(84) bytes of data.
64 bytes from 192.168.70.203: icmp_seq=1 ttl=64 time=0.265 ms
64 bytes from 192.168.70.203: icmp_seq=2 ttl=64 time=0.329 ms
64 bytes from 192.168.70.203: icmp_seq=3 ttl=64 time=0.225 ms
64 bytes from 192.168.70.203: icmp_seq=4 ttl=64 time=0.314 ms
64 bytes from 192.168.70.203: icmp_seq=5 ttl=64 time=0.303 ms

--- 192.168.70.203 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.225/0.287/0.329/0.039 ms

(10) 在demo虚拟机中使用ping命令测试与KVM服务器的连通性,代码如下:

root@demo-pc:~# ping 192.168.70.205 -c 5
PING 192.168.70.205 (192.168.70.205) 56(84) bytes of data.
64 bytes from 192.168.70.205: icmp_seq=1 ttl=64 time=0.181 ms
64 bytes from 192.168.70.205: icmp_seq=2 ttl=64 time=0.207 ms
64 bytes from 192.168.70.205: icmp_seq=3 ttl=64 time=0.329 ms
64 bytes from 192.168.70.205: icmp_seq=4 ttl=64 time=0.388 ms
64 bytes from 192.168.70.205: icmp_seq=5 ttl=64 time=0.248 ms

--- 192.168.70.205 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.181/0.288/0.388/0.064 ms

(11) 至此,虚拟机通过桥接模式和宿主机连通,和外界网络也保持了通畅。


5、内存优化

内存优化项通常包括EPT技术、透明大页和KSM技术几种。

EPT技术:
(1) EPT技术也叫扩展页表,这是Intel开创的硬件辅助内存虚拟化技术。内存的使用,是一个逻辑地址跟物理地址转换的过程。虚拟机内部有逻辑地址转换成物理地址的过程,然后虚拟机又要和宿主机内存进行逻辑到物理的转换过程,整个寻址过程有两次地址转换,效率非常低。而EPT技术,能将两次地址转换变成了一次,提高效率。这项技术基本上现在的服务器CPU都支持,只要在BIOS打开了Intel的VT设置,那么EPT也一起打开了。
(2) 使用图9中命令查看CPU是否支持EPT特性,使用图10中命令查看是否已开启EPT和VPID,Y表示已经加载了EPT和VPID,如果没加载可以通过命令“Modprobekvm _intel ept=0,vpid=0”加载。如图9和10所示:

图9 查看cpu是否支持EPT特性
这里写图片描述

图10 查看是否开启EPT特性
这里写图片描述

透明大页:
(1) 透明大页,也叫透明巨型页(Transparent Huge Page,THP),它允许所有的空余内存被用作缓存以提高性能,使用大页可以显著提高CPU的命中率,所以如果GuestOS使用大内存或者内存负载比较重的情况下,通过配置透明大页可以显著提高性能。这个设置在Ubuntu14.04中是默认开启的,不需要手动去操作。
(2) Ubuntu14.04支持透明大页,默认开启,如图11所示:

图11 透明大页默认开启
这里写图片描述

(3) 图11中的参数说明:
never :关闭。
always :尽量使用透明大页,扫描内存,有512个4k页面可以整合,就整合成一个2M的页面, 需要使用swap的时候,内存被分割为4k大小。
madvise :避免改变内存占用。

(4) 默认情况下,大页的数目为0,通过下面两种方式可以查看到,代码如下:

root@xjy-pc:~# cat /proc/sys/vm/nr_hugepages
0
root@xjy-pc:~# cat /proc/meminfo|grep HugePage
AnonHugePages:    376832 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0

(5) 设置大页的数量为2000后,再次查看大页数目,此时系统有2000个可用大页,代码如下:

root@xjy-pc:~# echo 2000 > /proc/sys/vm/nr_hugepages
root@xjy-pc:~# cat /proc/sys/vm/nr_hugepages
2000

(6) 修改大页数量后查看虚拟机运行状态,发现即使虚拟机在运行,透明大页也没有被使用。

root@xjy-pc:~# virsh list --all
 Id    Name                           State
----------------------------------------------------
 2     demo                           running

root@xjy-pc:~# cat /proc/meminfo|grep HugePage
AnonHugePages:    374784 kB
HugePages_Total:    2000
HugePages_Free:     2000
HugePages_Rsvd:        0
HugePages_Surp:        0

(7) 使用命令“virsh shutdown demo”将demo虚拟机关闭,然后修改demo虚拟机配置,添加使用大页的内容,(图12中可以看到demo虚拟机的内存为1G),在图12标签下面添加标签。如图12和13所示。

图12 demo虚拟机配置文件修改前
这里写图片描述

图13 demo虚拟机配置文件修改后
这里写图片描述

(8) 挂载大页,然后重新启动libvirtd-bin。

root@xjy-pc:/dev# mount -t hugetlbfs hutetlbfs /dev/hugepages
root@xjy-pc:/dev# mount|tail -l
……
hutetlbfs on /dev/hugepages type hugetlbfs (rw)
root@xjy-pc:/dev# /etc/init.d/libvirt-bin restart
 * Restarting libvirt management daemon /usr/sbin/libvirtd
   ...done.

(9) 使用“virsh start demo”重新开启虚拟机后查看结果。从以下代码可以看出,共消耗了520个大页,每个大页默认大小为2M,正好是demo所有的内存。

root@xjy-pc:/dev# cat /proc/meminfo|grep -i HugePage
AnonHugePages:     34816 kB
HugePages_Total:    2000
HugePages_Free:     1480
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

(10) 如果关闭demo的话,所有大页将被释放,代码如下:

root@xjy-pc:/dev# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/dev# cat /proc/meminfo|grep -i HugePage
AnonHugePages:     34816 kB
HugePages_Total:    2000
HugePages_Free:     2000
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

(11) 另外,透明大页的开启使用命令“echo always >

/sys/kernel/mm/transparent_hugepage/enabled”,关闭使用“echo never >/sys/kernel/mm/transparent_hugepage/enabled”。

KSM技术:
(1) KSM(Kernel SamePage Merging),也叫相同页面内存压缩技术。KSM服务在Linux系统里默认是开启的,它的作用就是让内存利用的更加高效。内存是分页的,如果多个程序中用的内存都是相同的页面,那么KSM就会把相同的内存合并,这样就能腾出更多的空间。

(2) KSM在系统里有个守护进程ksmd,它的作用就是不断的扫描宿主机的内存情况,检测有相同的页面就会合并,当然这或多或少会消耗点CPU。查看ksmd进程代码如下:

root@xjy-pc:~# ps aux|grep ksmd|grep -v grep
root        68  0.4  0.0      0     0 ?        SN   09:16   0:13 [ksmd]

(3) 如果宿主机的环境,内存资源比较丰富,建议这个功能不开启。如果不够,又想跑多一点的虚拟机,那么可以打开这个功能,但是一定要清楚,这个是一种内存超用的方案,假如大部分虚拟机内存变化比较频繁(比如内存使用率一下高,一下低),那么不建议开启,因为内存不够时,就会用到SWAP,那么KSM会严重影响虚拟机性能。

(4) 在宿主机KSM服务打开的情况下,如果不想让虚拟机受宿主机KSM的影响,可以进行如下操作:
编辑虚拟机的XML文件,添加:

<memoryBacking>
<nosharepages/>
</memoryBacking>

这样,KSM就不会去合并这个虚拟机的内存了


6、磁盘I/O优化

(1) I/O调度算法,也叫电梯算法。通常有Noop,Deadline和CFQ几种。Noop Scheduler是一个简单的FIFO队列,一个最简单的调度算法,由于会产生读I/O的阻塞,一般使用在SSD硬盘,此时不需要调度,I/O效果非常好。Deadline Scheduler是按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,这样就不会产生饿死的状况。CFQ(Complete Fair Queueing Schedule)是完全公平的排队的I/O调度算法,保证每个进程相对特别公平的使用I/O。

(2) 查看宿主机Ubuntu14.04支持的调度算法,默认采用Deadline Scheduler,代码如下:

root@xjy-pc:/dev# dmesg|grep -i "scheduler"
[    0.378025] io scheduler noop registered
[    0.378027] io scheduler deadline registered (default)
[    0.378048] io scheduler cfq registered

(3) 临时修改宿主机sda磁盘的I/O调度算法,将deadling修改为CFQ模式,代码如下:

root@xjy-pc:/dev# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 
root@xjy-pc:/dev# echo cfq > /sys/block/sda/queue/scheduler 
root@xjy-pc:/dev# cat /sys/block/sda/queue/scheduler 
noop deadline [cfq]

(4) 虚拟机的磁盘只不过是宿主机的一个文件,所以其I/O调度并无太大意义,反而会影响I/O效率,所以可以通过将客户机的I/O调度策略设置为NOOP来提高性能。NOOP就是一个FIFO队列,不做I/O调度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值