KVM的基礎功能(網絡、內存、cpu、存儲的配置)
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. swap_hard_limit,最大內存加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的存儲模式:宿主機提供一個存儲池,從存儲池裏面劃分存儲卷給虛擬機使用。
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虛擬化技術 實戰與原理解析》 任永傑,單海濤 機械工業出版社
如有紕漏,歡迎指正。