02168888812
云终端系列报道第一百二十六期 - KVM的基础功能 2017-04-25

炙伦云终端分享:



cpu的配置


1)查看cpu插槽数量

[root@kvm ~]# cat /proc/cpuinfo |grep "physical id" |wc -l
24

2)查看cpu核心数量

[root@kvm ~]# cat /proc/cpuinfo |grep "core id"| wc -l
24

3)查看cpu的模型

[root@kvm ~]# cat /proc/cpuinfo |grep model
model      : 62
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
model      : 62
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
model      : 62
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
model      : 62

4)设置CPU的个数

[root@kvm ~]# virsh shutdown vm1  #先关闭vm

[root@kvm ~]# vi /etc/libvirt/qemu/vm1.xml  #修改xml配置文件
  <vcpu placement=\'static\'>10</vcpu>

[root@kvm ~]# systemctl restart libvirtd #重启服务
[root@kvm ~]# virsh start vm1   #启动vm

[root@vm1 ~]# cat /proc/cpuinfo |grep "core id"|wc -l  #查看cpu核心数量
10

5)设置CPU模型

ps:虚拟机的CPU model可以通过配置文件定义

custom模式

可以根据需求自定义CPU的model xml配置文件如下:

<cpu mode=’custom’ match=’exact’>
    <model fallback=’allow’>kvm64</model>
  .  .  .
  .  .  .
<feature policy=’require’ name=’monitor’/>
  </cpu>

host-model模式

根据物理CPU的特性,选择一个最靠近其特性的标准CPU型号。CPU默认的模型就是host-model模式 xml配置文件如下:

<cpu mode=’host-model’/>

host-passthrough模式

直接将物理CPU暴露给虚拟机使用,在虚拟机上完全可以看到的就是物理CPU的型号,一般用于嵌套虚拟化,让虚拟机的CPU支持虚拟化技术,这种模型有一个弊端,就是当要进行kvm迁移的时候,被迁移机器的物理特性要和迁移机器的一样。 xml配置文件如下:

<cpu mode=’host-passthrough’/>

host-passthrough模式实验

[root@kvm ~]# virsh shutdown vm1       #先关闭vm

[root@kvm ~]# vi /etc/libvirt/qemu/vm1.xml   #修改vm的xml配置文件
<cpumode=\'host-passthrough\'>     #把cpu的model改成host-passthrough

[root@kvm ~]# systemctl restart libvirtd     #重启libvirtd服务

[root@kvm ~]# virsh start vm1      #启动vm

[root@vm1 ~]# cat /proc/cpuinfo |grep model     #查看vm的cpu模型
model      : 62
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
model      : 62
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz

内存的配置


1)设置内存大小

[root@vm1 ~]# free –h     #查看当前的内存大小
total    used     free   shared   buff/cache  available
Mem:   992M    96M    779M    6.6M      116M   767M

[root@kvm ~]# virsh shutdown vm1     #关闭vm

[root@kvm ~]# vi /etc/libvirt/qemu/vm1.xml    #修改vm的xml文件
  <memoryunit=\'KiB\'>1048576</memory>  
  <currentMemoryunit=\'KiB\'>716800</currentMemory>    #更改内存大小

[root@kvm ~]# systemctl restart libvirtd     #重启libvirtd服务

[root@kvm ~]# virsh start vm1   #启动vm

[root@vm1 ~]# free –h      #查看当前vm的内存大小
   total     used   free      shared buff/cache   available
Mem:  668M     71M   501M         6M       96M    484M

2)内存限制

ps:只有当内存竞争发生时,内存限制才会生效。

命令行格式为:

virsh memtune virtual_machine --parameter size

[parameter]:

  1. hard_limit:虚拟机可以使用的最大内存,单位为kib

  2. soft_limit:竞争时的内存,单位为kib

  3. swaphardlimit,最大内存加swap

  4. min_guarantee:最低保证给虚拟机使用的内存,单位为kib

memtune生效方式有3种

  • config:写到配置文件中,下次重启虚拟机进程生效

  • live:影响正在运行的虚拟机,虚拟机进程停止后,效果消失,这是默认的方式

  • current:影响停止和正在运行的虚拟机,如果虚拟机运行,虚拟机进程停止后,效果消失。

应用示例:

  • 限制虚拟机最大使用10g内存,写到配置文件中,重启生效

    memtune virthost --hard-limit 10488320 --config

限制虚拟机竞争时为7g内存

memtune virthost --soft-limit 7340032 --config

限制虚拟机最大内存加可以使用的宿主机的swap不超过10g

memtune virthost--swap-hard-limit 10488320 --config

保证虚拟机最少可以使用4g内存

memtune virthost--min-guarantee 4194304 --config

xml配置文件示例:

 <memoryunit=\'KiB\'>1048576</memory>
  <currentMemoryunit=\'KiB\'>1048576</currentMemory>
<memtune>
   <hard_limit unit=’KiB’>9437184</hard_limit>
   <soft_limit unit=’KiB’>7340032</soft_limit>

3)内存气球

KVM支持内存气球技术,允许不关闭虚拟机,实现动态调整内存大小

[root@vm1 ~]# lsmod |grep virio_balloon   #需要加载virio_balloon驱动
virtio_balloon         13664 0
virtio_ring            21524  5 virtio_blk,virtio_net,virtio_pci,virtio_balloon,virtio_console
virtio                15008  5 virtio_blk,virtio_net,virtio_pci,virtio_balloon,virtio_console

查看内存气球空间

[root@kvm ~]# virsh qemu-monitor-command vm1 --hmp --cmd info balloon
balloon: actual=1024

调整内存气球空间

[root@kvm ~]# virsh qemu-monitor-command vm1 --hmp --cmd balloon 800
[root@kvm ~]# virsh qemu-monitor-command vm1 --hmp --cmd info balloon
balloon: actual=800

4)内存共享

KVM有着内存共享的强大功能,内存共享通过一项名为内核同页合并(Kernel Samp-page Merging,KSM)的功能来实现。KSM扫描每个虚拟机的内存,如果虚拟机用于相同的内存页面,KSM将这些页面合并到一个在虚拟机之间共享的页面,仅存储一个副本。可以提供内存利用率。要在linux下实现内存合并,只需要启动KSM,ksmtuned服务

[root@kvm ~]# systemctl status ksm
● ksm.service - KernelSamepage Merging
   Loaded: loaded(/usr/lib/systemd/system/ksm.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2017-04-4 18:25:32 CST;1 day 2h ago

 [root@kvm ~]# systemctl status ksmtuned
● ksmtuned.service -Kernel Samepage Merging (KSM) Tuning Daemon
   Loaded: loaded(/usr/lib/systemd/system/ksmtuned.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-04-4 18:25:32CST; 1 day 2h ago

创建6个内存4G的虚拟机

[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 20G
[root@kvm ~]# virt-install --cdrom=/opt/iso/CentOS-7.2-x86_64-DVD.iso --vcpu=2 --ram=4096 --network bridge=virbr0 --disk path=/var/lib/libvirt/images/vm1.qcow2 --graphics spice,listen=0.0.0.0  --name=vm1
vm2-------vm5略

[root@vm1 ~]# virsh list
 Id   Name                          State
----------------------------------------------------
 1    vm1                            running
2     vm2                            running
3     vm3                            running
4     vm4                            running
5     vm5                            running
6     vm6                            running

我的物理机是16G的内存,由于我启用了内存共享的功能,所有可以创建6个内存为4G的虚拟机。


存储的配置


1)KVM的存储模式:宿主机提供一个存储池,从存储池里面划分存储卷给虚拟机使用。

wKiom1jje6XBzdSeAAA0hKtkncc761.png

2)创建存储池(基于LVM)

[root@kvm ~]# pvcreate /dev/sdb     #把/dev/sdb做成pv
  Physical volume "/dev/sdb"successfully created

[root@kvm ~]# vgcreate kvm-storage /dev/sdb    #创建vg
  Volume group "kvm-storage"successfully created

[root@kvm ~]# lvcreate -L 18G -n kvm-data /dev/kvm-storage    #创建lv
  Logical volume "kvm-data" created.

[root@kvm ~]# lvs       #查看创建的lv                           
  kvm-data kvm-storage -wi-a----- 18.00g

[root@kvm ~]# vi kvm-data.xml    #编辑存储池xml文件
<pool type=\'logical\'>
  <name>kvm-data</name>
  <source>
    <devicepath=\'/dev/kvm-storage/kvm-data\'/> 
    <name>kvm-storage</name>
    <format type=\'lvm2\'/>
  </source>
  <target>
    <path>/dev/kvm-storage</path>
    <permissions>
      <mode>0755</mode>
      <owner>-1</owner>
      <group>-1</group>
    </permissions>
  </target>
</pool>

[root@kvm ~]# virsh pool-define kvm-data.xml   #通过xml文件定义存储池
Pool kvm-data defined fromkvm-data.xml

[root@kvm ~]# virsh pool-start kvm-data     #启动存储池
Pool kvm-data started

[root@kvm ~]# virsh pool-autostart kvm-data   #设置存储池自动启动
Pool kvm-data marked as autostarted

[root@kvm ~]# virsh pool-info kvm-data     #查看存储池的信息
Name:           kvm-data
UUID:           4c453c8f-8ec9-4af9-b377-19ed3d274ee4
State:          running
Persistent:     yes
Autostart:      yes
Capacity:       20.00 GiB
Allocation:     18.00 GiB
Available:      2.00 GiB

3)从存储池划分存储卷给虚拟机使用

[root@kvm ~]# virsh shutdown vm1     #关闭vm1

[root@kvm ~]# vim /etc/libvirt/qemu/vm1.xml    #编辑vm1的xml文件
    <disk type=\'block\' device=\'disk\'>
      <driver name=\'qemu\' type=\'raw\'cache=\'none\' io=\'native\'/>
      <sourcedev=\'/dev/kvm-storage/kvm-data\'/>
      <target dev=\'vdb\' bus=\'virtio\'/>  
  </disk>

[root@kvm ~]# systemctl restart libvirtd
[root@kvm ~]# virsh start vm1

[root@vm1 ~]# lsblk     #VM上验证
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vdb            252:16 0   18G  0 disk
网络的配置


虚拟机上外网的方式有两种:一种通过桥接方式,一种通过nat方式

  • 通过桥接方式

下载软件包

[root@kvm ~]# yum -y install bridge-utils

编辑网桥的配置文件

[root@kvm network-scripts]# cat ifcfg-brex
DEVICE=brex          #指定网桥为brex
BOOTPROTO=static     #IP获取方式为静态
ONBOOT=yes           #启用该设备
TYPE=bridge          #指定类型为网桥
IPADDR=172.16.1.111  #网桥的IP地址
PREFIX=24            #网桥的掩码
GATEWAY=172.16.1.1   #网桥的网关
DNS1=202.96.128.133  #网桥的首选DNS
DNS2=202.96.128.166  #网桥的备用DNS
STP=yes              #启用STP功能

编辑要绑定到桥的物理网卡的配置文件

[root@kvm network-scripts]# cat ifcfg-enp10s0 
DEVICE=enp10s0                              
IPADDR=172.16.1.111
PREFIX=24
GATEWAY=172.16.1.1
DNS1=202.96.128.133
DNS2=202.96.128.166
ONBOOT=yes
NM_CONTROLLD=yes
BRIDGE=brex       #指定绑定到桥brex

重启网络

[root@kvm network-scripts]# systemctl restart network

查看网络状态

[root@kvm~]# ip add show 
4:enp10s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master brex state UP qlen 1000     #网卡enp10s0绑定到网桥brex
    link/ether 70:e2:84:05:fa:30 brdff:ff:ff:ff:ff:ff
32:brex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP      #网桥brex的状态为UP
    link/ether 70:e2:84:05:fa:30 brdff:ff:ff:ff:ff:ff
    inet 172.16.1.111/24 brd 172.16.1.255 scopeglobal brex
       valid_lft forever preferred_lft forever
    inet6 fe80::72e2:84ff:fe05:fa30/64 scopelink
       valid_lft forever preferred_lft forever

编辑虚拟机的XML文件

[root@kvm ~]# vi /etc/libvirt/qemu/vm1.xml
    <interface type=\'bridge\'>     #接口类型为桥
      <source bridge=\'brex\'/>     #指定和宿主机的网桥brex桥接
      <model type=\'virtio\'/>
</interface>

查看网桥的状态

[root@kvm~]# brctl show  
bridgename    bridge id     STP enabled   interfaces
brex        8000.70e28405fa30    yes       enp10s0
                                   vnet0
virbr0       8000.5254000f5751     yes      virbr0-nic

在VM1上验证

[root@vm1 ~]# ip add show
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stateUP qlen 1000
    link/ether 52:54:00:de:d4:61 brdff:ff:ff:ff:ff:ff
    inet 172.16.1.181/24brd 172.16.1.255 scope global dynamic eth0
       valid_lft 7123sec preferred_lft 7123sec
    inet6 fe80::5054:ff:fede:d461/64 scope link
       valid_lft forever preferred_lft forever
#从物理网络的DHCP服务器获取到IP地址

ping外网测试

[root@vm1 ~]# ping www.baidu.com 
PINGwww.a.shifen.com (14.215.177.37) 56(84) bytes of data.
64bytes from 14.215.177.37: icmp_seq=1 ttl=53 time=11.8 ms
64bytes from 14.215.177.37: icmp_seq=2 ttl=53 time=11.4 ms
  • 通过nat方式

下载openvswitch软件yum源

[root@kvm ~]# yum -y install centos-release-openstack-newton

安装openvswitch

[root@kvm ~]# yum -y install *openvswitch*

编辑nat桥的配置文件

[root@kvm network-scripts]#cat ifcfg-natex  
DEVICE=natex         #指定设备为natex
BOOTPROTO=static     #IP获取方式为静态
ONBOOT=yes           #开机启用该设备
TYPE=OVSBridge       #类型为OVS桥
DEVICETYPE=ovs       #设备类型为ovs
IPADDR=192.168.133.80      #桥的IP地址
NETMASK=255.255.255.0      #桥的掩码
GATEWAY=192.168.133.1      #桥的网关

编辑要绑定到桥的物理网卡的配置文件

[root@kvm network-scripts]# cat ifcfg-enp10s0
DEVICE=enp10s0                       
ONBOOT=yes
TYPE=OVSPort
DEVICETYPE=ovs      #设备类型为ovs
OVS_BRIDGE=natex     #指定要绑定到的网桥为natex

编辑VM的xml文件,桥接到物理网卡

[root@kvm ~]# vi /etc/libvirt/qemu/vm1.xml
    <interface type=\'bridge\'>      #指定接口类型
      <source bridge=\'natex\'/>     #指定源设备
      <virtualport type=\'openvswitch\'/>   #指定虚拟接口类型
     <model type=\'e1000\'/>        #指定接口为千兆接口
</interface>

查看宿主机网络状态

[root@kvm ~]# ip add show
4: enp10s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc pfifo_fast master ovs-system state UP qlen 1000
    link/ether70:e2:84:05:fa:30 brd ff:ff:ff:ff:ff:ff
45:natex: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue stateUNKNOWN
    link/ether 70:e2:84:05:fa:30 brdff:ff:ff:ff:ff:ff
    inet 192.168.133.80/24 brd 192.168.133.255scope global natex
       valid_lft forever preferred_lft forever
    inet6 fe80::9879:f1ff:fe8f:7644/64 scopelink
       valid_lft forever preferred_lft forever

查看ovs桥

[root@kvm network-scripts]# ovs-vsctl show
521d2c60-16ce-49b2-9e76-c28e0e6ea38b
    Bridge natex
        Port "enp10s0"
            Interface "enp10s0"
        Port "vnet0"
            Interface "vnet0"
        Port natex
            Interface natex
                type: internal
ovs_version:"2.5.0"

虚拟机上验证

[root@vm1 ~]# ip add show
2:ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stateUP qlen 1000
    link/ether 52:54:00:cd:fc:0b brdff:ff:ff:ff:ff:ff
    inet 172.16.1.193/24brd 172.16.1.255 scope global dynamic ens3
       valid_lft 6375sec preferred_lft 6375sec
    inet6 fe80::5054:ff:fecd:fc0b/64 scope link
       valid_lft forever preferred_lft forever
#网卡从物理网络的DHCP服务器获取到IP地址

ping外网测试

[root@vm1 ~]# ping g.cn 
PINGg.cn (203.208.40.52) 56(84) bytes of data.
64bytes from 203.208.40.52: icmp_seq=1 ttl=52 time=33.3 ms
64 bytesfrom 203.208.40.52: icmp_seq=2 ttl=52 time=32.3 ms

参考文献: 《KVM虚拟化技术 实战与原理解析》 任永杰,单海涛 机械工业出版社

如有纰漏,欢迎指正。


本文出自 “开源精神 源于分享” 博客

http://lidaxia.blog.51cto.com/11588738/1912892


上一页:云终端系列报道第一百二十五期 - 运维角度的Java知识点
推荐新闻 Recommended news

帮助中心
6509367