KVM部署、使用、調優


 背景介紹


 

傳統數據中心面臨的問題:
資源使用率低
資源分配不均
自動化能力差
初始化成本高
 
雲計算:
雲計算是一種按 使用量付費的模式,這種模式提供可用的、便捷的、按需的 網絡訪問, 進入可配置的計算 資源共享池(資源包括網絡,服務器,存儲,應用軟件,服務)
這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的交互。
 
特點:
雲計算是什么?:1.一種模式  2.雲計算必須通過網絡使用 3.彈性計算,按需付費,快速擴展。你不用關心太多,都由雲計算廠商提供
按開發模式,分公有雲,私有雲,混合雲,社區雲
 
注意點: 

雲計算不等於虛擬化
虛擬化是技術
雲計算是資源使用交付模式

 
桌面虛擬化:
弊端:看視頻可能卡。
應用場景:呼叫中心,銀行外包。教學使用
 

應用虛擬化:

比如你沒安裝xshell,但是你可以點這個xshell圖標,調用程序,這就是應用虛擬化的作用
應用虛擬化可能做好的xenapp

 

互聯網中服務器虛擬化應用最多。

半虛擬化的技術,比如IO層面,肯定是半虛擬化的性能好,否則多了一層

另外網絡IO也是半虛擬化好

kvm支持超配(虛擬出多個cpu)
xen不支持超配,你買vps的時候,對方說它們是基於xen的。其實意思就是不是屬於超配的那種

kvm是一個內核模塊
qemu是將網絡IO和硬盤IO的虛擬化
 

學習基礎環境搭建可以參照這篇鏈接

http://www.cnblogs.com/nmap/p/6368157.html

 

kvm學習開始


 

先查看服務器cpu是否支持kvm虛擬機。有下面信息就表示支持了

[root@data-1-1 ~]# grep  -E  'vmx|svm'  /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp 
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust [root@data-1-1 ~]#

  

安裝kvm相關軟件包

virt-install包提供virt-install工具,可以用於創建虛擬機

qemu-kvm 主要的KVM程序包

virt-manager GUI虛擬機管理工具

libvirt        是可底層kvm內核打交道的接口工具。用戶態的所有命令都是調用了它。停止它,kvm運行正常,但是無法管理了

virt-install 基於libvirt服務的虛擬機創建命令

bridge-utils 創建和管理橋接設備的工具(安裝上述包會依賴此包。自動安裝上)

[root@data-1-1 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
Package 10:qemu-kvm-1.5.3-126.el7_3.3.x86_64 already installed and latest version
Package 10:qemu-kvm-tools-1.5.3-126.el7_3.3.x86_64 already installed and latest version
Package virt-manager-1.4.0-2.el7.noarch already installed and latest version
Package libvirt-2.0.0-10.el7_3.4.x86_64 already installed and latest version
Package virt-install-1.4.0-2.el7.noarch already installed and latest version
Nothing to do
[root@data-1-1 ~]# 

 安裝完畢通過下面命令都可以看到多出一個新的網絡設備virbr0

[root@data-1-1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.5254002430ec	yes		virbr0-nic
[root@data-1-1 ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.133  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::20c:29ff:fea7:1724  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a7:17:24  txqueuelen 1000  (Ethernet)
        RX packets 165  bytes 27580 (26.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 148  bytes 23370 (22.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:24:30:ec  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@data-1-1 ~]# 

 啟動libvirtd服務,這個工具作用很大

 

設置libvirtd服務開機啟動,同時啟動此服務

[root@data-1-1 ~]# systemctl enable libvirtd.service
[root@data-1-1 ~]# systemctl start libvirtd.service
[root@data-1-1 ~]# systemctl status libvirtd.service

qemu-img工具

[root@data-1-1 ~]# whereis qemu-img
qemu-img: /usr/bin/qemu-img /usr/share/man/man1/qemu-img.1.gz
[root@data-1-1 ~]# rpm -qf /usr/bin/qemu-img 
qemu-img-1.5.3-126.el7_3.3.x86_64
[root@data-1-1 ~]# 

使用qemu-img工具創建硬盤,格式,路徑,多大

[root@data-1-1 ~]#  qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G
Formatting '/opt/CentOS-7.1-x86_64.raw', fmt=raw size=10737418240 
[root@data-1-1 ~]# 

  

准備安裝kvm的系統源,這里使用iso的和宿主機的一致

[root@data-1-1 ~]# mkdir /tools
[root@data-1-1 ~]# dd if=/dev/sr0 of=/tools/CentOS-7-x86_64-DVD-1503-01.iso
8419328+0 records in
8419328+0 records out
4310695936 bytes (4.3 GB) copied, 112.997 s, 38.1 MB/s
[root@data-1-1 ~]# 
 
創建虛擬機,命令如下
virt-install命令可以創建虛擬機,是rpm包python-virtinst里的一個工具,其實是個python腳本 ,可以利用該工具在終端下創建KVM guest主機
關於virt-install在centos6里面virt-manager里面帶的,在centos7是需要單獨安裝virt-install安裝
virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 \
--cdrom=/tools/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7.1-x86_64.raw \
--network network=default  --graphics vnc,listen=0.0.0.0 --noautoconsole

執行過程如下

[root@data-1-1 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 --cdrom=/tools/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7.1-x86_64.raw \
> --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole Starting install... Creating domain... | 0 B 00:00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process. [root@data-1-1 ~]#

提前准備好vnc工具,連接過去

選中Install  CentOS7 ,按tab鍵,輸入net.ifnames=0 biosdevname=0

 下面的安裝步驟和宿主機的安裝基本一致。分區那里不用設置swap分區。本身就是虛擬機了,再設置swap分區,效果很差,比如阿里雲就沒設置swap分區

 最后一步要注意,點擊reboot,它其實是關機。需要手動使用virsh命令啟動

 

virsh  list可以查看虛擬機

[root@data-1-1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     CentOS-7-x86_64                running

[root@data-1-1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------

[root@data-1-1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     CentOS-7-x86_64                shut off

[root@data-1-1 ~]# virsh start CentOS-7-x86_64
Domain CentOS-7-x86_64 started

[root@data-1-1 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 4     CentOS-7-x86_64                running

[root@data-1-1 ~]# 

  

 

virsh常用命令

查看處於運行狀態的虛擬機
virsh list

查看宿主機上所有虛擬機(無論處於什么狀態,關機,掛起等)
virsh list --all

關閉虛擬機
virsh shudown CentOS-7-x86_64(主機名)
virsh destroy CentOS-7-x86_64(主機名) 類似kill -9 進程號

啟動虛擬機
virsh start CentOS-7-x86_64

刪除虛擬機
virsh undefine CentOS-7-x86_64

編輯虛擬機
virsh edit CentOS-7-x86_64

掛起虛擬機
virsh suspended CentOS-7-x86_64

恢復虛擬機
virsh resume CentOS-7-x86_64

查看正在運行的虛擬機:
ps -aux |grep kvm

kvm是以進程的方式運行的。也可以kill  -9  殺掉這個虛擬機

 

假如停止了libvirt,虛擬機還在跑,但是你無法管理它了
libvirt對虛擬機不產生任何影響,只是用來管理的

[root@data-1-1 ~]# systemctl stop libvirtd
[root@data-1-1 ~]# virsh list --all
error: failed to connect to the hypervisor
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

[root@data-1-1 ~]# 

使用vncviewer登錄虛擬機

更改IP配置,去掉IPv6的配置,onboot改成yes,重啟網絡服務,更改resolv.conf,freedns改成no,可以ping通外網

出kvm機器安裝一些工具,比如ifconfig命令找不到可以安裝net-tools包,但是可以使用ip命令

 yum install vim screen mtr nc nmap lrzsz openssl-devel gcc glibc gcc-c++ make  zip dos2unix  mysql sysstat  wget  rsync   net-tools  dstat setuptool  system-config-*  iptables ntsysv  -y

 

 在宿主機上查看,創建完kvm,下面路徑多了一個xml的文件,是虛擬機的配置文件

[root@data-1-1 ~]# cd /etc/libvirt/qemu
[root@data-1-1 qemu]# ll
total 4
-rw-------  1 root root 3844 Feb  6 18:48 CentOS-7-x86_64.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# less CentOS-7-x86_64.xml 
[root@data-1-1 qemu]# 

它定義了虛擬機的軟件和硬件信息,12行到13行定義了內存和cpu

[root@data-1-1 qemu]# cat CentOS-7-x86_64.xml 
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit CentOS-7-x86_64
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>CentOS-7-x86_64</name>
  <uuid>702d4eed-7463-4ded-b8f8-a70a4f7164ce</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>SandyBridge</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/opt/CentOS-7.1-x86_64.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </controller>
    <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>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
[root@data-1-1 qemu]# 

這里找出一些重要的說下,vnc的端口是-1 表示監聽再5900端口上

    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>

這里是最大內存和當前內存,以及cpu數量

  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>

下面是硬盤路徑和格式

      <driver name='qemu' type='raw'/>
      <source file='/opt/CentOS-7.1-x86_64.raw'/>

 hvm表示硬件虛擬化

    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>

 文件開頭提示,你如果想編輯虛擬機配置,需要使用下面命令,不要直接修改這個文件

WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit CentOS-7-x86_64

 

 

libvirt的一些重要命令
virsh --help
dumpxml參數,如果你某天把這個虛擬機刪除了,通過xml文件還可以把它起來
這個參數可以導出xml文件
你要是物理刪除虛擬機,那就無法恢復了,這個xml文件類似一個靜態的saltstack描述文件

[root@data-1-1 qemu]# systemctl start libvirtd
[root@data-1-1 qemu]# virsh list
 Id    Name                           State
----------------------------------------------------
 4     CentOS-7-x86_64                running

[root@data-1-1 qemu]# ll
total 4
-rw-------  1 root root 3844 Feb  6 18:48 CentOS-7-x86_64.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# virsh dumpxml CentOS-7-x86_64 >kvm1.xml
[root@data-1-1 qemu]# ll
total 12
-rw-------  1 root root 3844 Feb  6 18:48 CentOS-7-x86_64.xml
-rw-r--r--  1 root root 4740 Feb  6 22:54 kvm1.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# 

刪除虛擬機

刪除虛擬機的參數可以使用undefine  ,它是徹底刪除的意思,如果沒有備份xml配置文件,那么虛擬機無法恢復了

[root@data-1-1 qemu]# virsh undefine CentOS-7-x86_64
Domain CentOS-7-x86_64 has been undefined

[root@data-1-1 qemu]# ll
total 8
-rw-r--r--  1 root root 4740 Feb  6 22:54 kvm1.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# virsh list
 Id    Name                           State
----------------------------------------------------
 4     CentOS-7-x86_64                running

[root@data-1-1 qemu]# 

一旦關閉虛擬機,虛擬機就消失了

但是我們依然可以從虛擬機當前運行狀態備份它的配置文件

[root@data-1-1 qemu]# virsh list
 Id    Name                           State
----------------------------------------------------
 4     CentOS-7-x86_64                running

[root@data-1-1 qemu]# virsh dumpxml CentOS-7-x86_64 >kvm2.xml
[root@data-1-1 qemu]# ll
total 16
-rw-r--r--  1 root root 4740 Feb  6 22:54 kvm1.xml
-rw-r--r--  1 root root 4740 Feb  6 22:57 kvm2.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# 

關閉kvm虛擬機。

[root@data-1-1 qemu]# virsh shutdown CentOS-7-x86_64
Domain CentOS-7-x86_64 is being shutdown

[root@data-1-1 qemu]# virsh list --all
 Id    Name                           State
----------------------------------------------------

[root@data-1-1 qemu]# 

從備份的配置文件恢復虛擬機

[root@data-1-1 qemu]# virsh define kvm1.xml 
Domain CentOS-7-x86_64 defined from kvm1.xml

[root@data-1-1 qemu]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     CentOS-7-x86_64                shut off

[root@data-1-1 qemu]# virsh start CentOS-7-x86_64
Domain CentOS-7-x86_64 started

[root@data-1-1 qemu]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 5     CentOS-7-x86_64                running

[root@data-1-1 qemu]# 

  恢復之后,配置文件也出現了

[root@data-1-1 qemu]# ll
total 20
-rw-------  1 root root 4001 Feb  6 23:00 CentOS-7-x86_64.xml
-rw-r--r--  1 root root 4740 Feb  6 22:54 kvm1.xml
-rw-r--r--  1 root root 4740 Feb  6 22:57 kvm2.xml
drwx------. 3 root root   40 Feb  6 18:04 networks
[root@data-1-1 qemu]# 

  

關於快照功能部分


 

快照配置文件在/var/lib/libvirt/qemu/snapshot/虛擬機名稱/下,目前由於還沒做快照,目錄下沒任何東西

關於快照的命令參數可以查看下面

[root@data-1-1 qemu]# cd /var/lib/libvirt/qemu/snapshot/
[root@data-1-1 snapshot]# ll
total 0
[root@data-1-1 snapshot]# virsh shutdown CentOS-7-x86_64
Domain CentOS-7-x86_64 is being shutdown

[root@data-1-1 snapshot]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     CentOS-7-x86_64                shut off

[root@data-1-1 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
[root@data-1-1 snapshot]# 

raw磁盤格式的虛擬機不支持快照功能

kvm虛擬機默認使用raw格式的鏡像格式,性能最好,速度最快,它的缺點就是不支持一些新的功能,如支持鏡像,zlib磁盤壓縮,AES加密等。
要使用鏡像功能,磁盤格式必須為qcow2
 
[root@data-1-1 snapshot]# pwd
/var/lib/libvirt/qemu/snapshot
[root@data-1-1 snapshot]# ls
[root@data-1-1 snapshot]# virsh snapshot-create  CentOS-7-x86_64
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

[root@data-1-1 snapshot]# cd /opt/
[root@data-1-1 opt]# ll
total 2206412
-rw-r--r-- 1 root root 10737418240 Feb  6 23:07 CentOS-7.1-x86_64.raw
[root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.raw 
image: CentOS-7.1-x86_64.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 2.1G
[root@data-1-1 opt]# 

好在我們可以轉換格式

轉換格式時虛擬機必須先關機

-f 源鏡像的格式
-O 目標鏡像的格式

轉換成qcow2格式的。可以看到它是保留了原來的文件

[root@data-1-1 opt]# qemu-img  convert -f raw  -O qcow2 CentOS-7.1-x86_64.raw  CentOS-7.1-x86_64.qcow2
[root@data-1-1 opt]# ll
total 4413264
-rw-r--r-- 1 root root  2259877888 Feb  6 23:15 CentOS-7.1-x86_64.qcow2
-rw-r--r-- 1 root root 10737418240 Feb  6 23:07 CentOS-7.1-x86_64.raw
[root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.qcow2 
image: CentOS-7.1-x86_64.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.1G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@data-1-1 opt]# 

修改配置文件的disk模塊,把磁盤改成最新的qcow2的這個文件,同時格式也改成qcow2的

virsh edit CentOS-7-x86_64

    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/opt/CentOS-7.1-x86_64.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

修改成如下,type和source都改掉

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/opt/CentOS-7.1-x86_64.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

開始做快照備份,如果不放心,可以先啟動kvm,沒問題后關閉再執行快照

看到下面路徑下出現了快照目錄和文件

[root@data-1-1 opt]# virsh snapshot-create  CentOS-7-x86_64
Domain snapshot 1486394873 created
[root@data-1-1 opt]# cd -
/var/lib/libvirt/qemu/snapshot
[root@data-1-1 snapshot]# pwd
/var/lib/libvirt/qemu/snapshot
[root@data-1-1 snapshot]# ls
CentOS-7-x86_64
[root@data-1-1 snapshot]# cd CentOS-7-x86_64/
[root@data-1-1 CentOS-7-x86_64]# ls
1486394873.xml
[root@data-1-1 CentOS-7-x86_64]# 

查看快照,再次創建一個快照

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list  CentOS-7-x86_64 
 Name                 Creation Time             State
------------------------------------------------------------
 1486394873           2017-02-06 23:27:53 +0800 shutoff

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-create  CentOS-7-x86_64
Domain snapshot 1486394993 created
[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list  CentOS-7-x86_64 
 Name                 Creation Time             State
------------------------------------------------------------
 1486394873           2017-02-06 23:27:53 +0800 shutoff
 1486394993           2017-02-06 23:29:53 +0800 shutoff

[root@data-1-1 CentOS-7-x86_64]# ll
total 16
-rw------- 1 root root 4480 Feb  6 23:29 1486394873.xml
-rw------- 1 root root 4531 Feb  6 23:29 1486394993.xml
[root@data-1-1 CentOS-7-x86_64]# 

 查看當前快照,可以看到當前快照是1486394993,它上一級的快照是1486394873

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-current  CentOS-7-x86_64 
<domainsnapshot>
  <name>1486394993</name>
  <state>shutoff</state>
  <parent>
    <name>1486394873</name>
  </parent>

恢復到某個版本的快照狀態

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list  CentOS-7-x86_64 
 Name                 Creation Time             State
------------------------------------------------------------
 1486394873           2017-02-06 23:27:53 +0800 shutoff
 1486394993           2017-02-06 23:29:53 +0800 shutoff

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-revert CentOS-7-x86_64 1486394873

[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-current  CentOS-7-x86_64 
<domainsnapshot>
  <name>1486394873</name>
  <state>shutoff</state>

  

還可以通過下面方式查看快照

[root@data-1-1 CentOS-7-x86_64]# cd /opt/
[root@data-1-1 opt]# ll
total 4413396
-rw-r--r-- 1 root root  2260075008 Feb  6 23:32 CentOS-7.1-x86_64.qcow2
-rw-r--r-- 1 root root 10737418240 Feb  6 23:07 CentOS-7.1-x86_64.raw
[root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.qcow2 
image: CentOS-7.1-x86_64.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 2.1G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1486394873                0 2017-02-06 23:27:53   00:00:00.000
2         1486394993                0 2017-02-06 23:29:53   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@data-1-1 opt]# 

刪除某個快照

[root@data-1-1 opt]# virsh snapshot-delete CentOS-7-x86_64  1486394873
Domain snapshot 1486394873 deleted

[root@data-1-1 opt]# virsh snapshot-list  CentOS-7-x86_64 
 Name                 Creation Time             State
------------------------------------------------------------
 1486394993           2017-02-06 23:29:53 +0800 shutoff

[root@data-1-1 opt]# 

  

  

CPU和內存動態擴容部分


 

安裝的時候,就可以設置cpu大小和內存大小,最大內存和最大cpu,當前內存和當前cpu
[root@data-1-1 opt]# virt-install --help | grep cpu
  --vcpus VCPUS         Number of vcpus to configure for your guest. Ex:
                        --vcpus 5
                        --vcpus 5,maxcpus=10,cpuset=1-4,6,8
                        --vcpus sockets=2,cores=4,threads=2,
  --cpu CPU             CPU model and features. Ex:
                        --cpu coreduo,+x2apic
                        --cpu host
[root@data-1-1 opt]# virt-install --help | grep memory
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
  --memory MEMORY       Configure guest memory allocation. Ex:
                        --memory 1024 (in MiB)
                        --memory 512,maxmemory=1024
  --memtune MEMTUNE     Tune memory policy for the domain process.
  --memorybacking MEMORYBACKING
                        Set memory backing policy for the domain process. Ex:
                        --memorybacking hugepages=on
[root@data-1-1 opt]# 

這里我們通過修改配置文件實現

首先需要修改支持動態更改cpu和內存

這里默認如下

  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>

改成下面配置,主要改cpu這里

virsh edit CentOS-7-x86_64

  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='auto' current='1'>4</vcpu>

重啟kvm虛擬機

 

動態修改cpu

查看cpu操作相關的參數,其中有一個setvcpus

[root@data-1-1 opt]# virsh --help | grep cpu
    cpu-baseline                   compute baseline CPU
    cpu-compare                    compare host CPU with a CPU described by an XML file
    cpu-stats                      show domain cpu statistics
    setvcpus                       change number of virtual CPUs
    vcpucount                      domain vcpu counts
    vcpuinfo                       detailed domain vcpu information
    vcpupin                        control or query domain vcpu affinity
    guestvcpus                     query or modify state of vcpu in the guest (via agent)
    cpu-models                     CPU models
    maxvcpus                       connection vcpu maximum
    nodecpumap                     node cpu map
    nodecpustats                   Prints cpu stats of the node.
[root@data-1-1 opt]# 

 kvm虛擬機的cpu個數當前是1個

[root@data-1-1 opt]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Mon Feb  6 22:28:49 2017 from 192.168.122.1
[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l
1
[root@localhost ~]# 

修改成2個

[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live

[root@data-1-1 opt]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Mon Feb  6 23:52:33 2017 from gateway
[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l
2
[root@localhost ~]# 

動態修改cpu只有在CentOS7支持,CentOS6不支持

[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live

[root@data-1-1 opt]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Mon Feb  6 23:52:33 2017 from gateway
[root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l
2
[root@localhost ~]# 

另外動態修改CPU,只能動態的添加,不能動態的減少,如果要減少可以通過關閉kvm,修改配置文件操作

動態修改的東西重啟失效

[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 3 --live

[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live
error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

[root@data-1-1 opt]# 

另外,centos7版本的kvm修改后立即生效了

動態修改cpu只有centos7支持。centos6不支持

以前版本需要手動讓新加的cpu啟用

[root@data-1-1 ~]# virsh setvcpus CentOS-7-x86_64 2 --live

[root@data-1-1 ~]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Tue Feb  7 00:09:34 2017 from gateway
[root@localhost ~]# cat /sys/devices/system/cpu/cpu1/online 
1
[root@localhost ~]# 

 也可以通過下面方式不登錄kvm虛擬機查看cpu個數

[root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep CPU 
CPU(s):         1
CPU time:       23.8s
[root@data-1-1 ~]# 

  

 

 

動態修改內存

[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64  --hmp  --cmd balloon 1512


[root@data-1-1 ~]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Tue Feb  7 00:10:45 2017 from gateway
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1464          95        1248           8         121        1238
Swap:             0           0           0
[root@localhost ~]# exit
logout
Connection to 192.168.122.141 closed.
[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64  --hmp  --cmd balloon 
600


[root@data-1-1 ~]# ssh root@192.168.122.141
root@192.168.122.141's password: 
Last login: Tue Feb  7 00:12:53 2017 from gateway
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            552          95         335           8         121         326
Swap:             0           0           0
[root@localhost ~]# 

也可以不用登陸查看kvm內存

[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64  --hmp  --cmd balloon 800


[root@data-1-1 ~]# virsh dominfo  CentOS-7-x86_64 | grep memory
Max memory:     2097152 KiB
Used memory:    819200 KiB
[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64  --hmp  --cmd balloon 1800


[root@data-1-1 ~]# virsh dominfo  CentOS-7-x86_64 | grep memory
Max memory:     2097152 KiB
Used memory:    1843200 KiB
[root@data-1-1 ~]# 

另一種修改kvm內存的方式,另外修改內存不能超過最大內存

[root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 748288

[root@data-1-1 ~]# virsh dominfo  CentOS-7-x86_64 | grep memory
Max memory:     2097152 KiB
Used memory:    748288 KiB
[root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 1748288

[root@data-1-1 ~]# virsh dominfo  CentOS-7-x86_64 | grep memory
Max memory:     2097152 KiB
Used memory:    1748288 KiB
[root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 2748288
error: invalid argument: cannot set memory higher than max memory

[root@data-1-1 ~]# virsh dominfo  CentOS-7-x86_64 | grep memory
Max memory:     2097152 KiB
Used memory:    1748288 KiB
[root@data-1-1 ~]# 

在規划是考慮到想要熱添加,當時裝虛擬機的時候,就要考慮這個問題,設置max內存和cpu  

關於硬盤擴容部分,雖然可以resize增大,但是有丟失數據的風險,生產中不推薦使用

 

 

幾種磁盤格式比較


 

1. raw
raw格式是最簡單,什么都沒有,所以叫raw格式。連頭文件都沒有,就是一個直接給虛擬機進行讀寫的文件。raw不支持動態增長空間,必須一開始就指定空間大小。所以相當的耗費磁盤空間。但是對於支持稀疏文件的文件系統(如ext4)而言,這方面並不突出。ext4下默認創建的文件就是稀疏文件,所以不要做什么額外的工作。用
du -sh 文件名
可以查看文件的實際大小。也就是說,不管磁盤空間有多大,運行下面的指令沒有任何問題:
qemu-img create -f raw test.img 10000G
raw鏡像格式是虛擬機種I/O性能最好的一種格式,大家在使用時都會和raw進行參照,性能越接近raw的越好。但是raw沒有任何其他功能。對於稀疏文件的出現,像qcow這一類的運行時分配空間的鏡像就沒有任何優勢了。

2. cow
cow格式和raw一樣簡單,也是創建時分配所有空間,但cow有一個bitmap表記錄當前哪些扇區被使用,所以cow可以使用增量鏡像,也就是說可以對其做外部快照。但cow也沒有其他功能,其特點就是簡單。

3. qcow
qcow在cow的基礎上增加了動態增加文件大小的功能,並且支持加密,壓縮。qcow通過2級索引表來管理整個鏡像的空間分配,其中第二級的索引用了內存cache技術,需要查找動作,這方面導致性能的損失。qcow現在基本不用,一方面其優化和功能沒有qcow2好,另一方面,讀寫性能又沒有cow和raw好。

4. qcow2
qcow2是集各種技術為一體的超級鏡像格式,支持內部快照,加密,壓縮等一系列功能,訪問性能也在不斷提高。但qcow2的問題就是過於臃腫,把什么功能都集於一身。鏡像小的原因是鏡像文件只保存改變的部分,原來的文件被鎖住了。

qcow2格式,類似虛擬機的瘦模式,雖然划分10GB,但是不是立即占完的,用多少占多少  

 

另外

假如你有幾百GB的數據,不建議放在kvm里面,
IO慢,kvm遷移也麻煩

 

 

KVM的網絡部分


 

啟動kvm虛擬機,會多出一個vnet0網絡設備,這是虛擬啟動后生成的。

[root@data-1-1 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.133  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::20c:29ff:fea7:1724  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a7:17:24  txqueuelen 1000  (Ethernet)
        RX packets 289558  bytes 327309816 (312.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 86615  bytes 17569530 (16.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 4  bytes 1844 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 1844 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:24:30:ec  txqueuelen 0  (Ethernet)
        RX packets 45935  bytes 4046581 (3.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 84374  bytes 315862341 (301.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fe83:f7a0  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:83:f7:a0  txqueuelen 500  (Ethernet)
        RX packets 464  bytes 49210 (48.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1356  bytes 104195 (101.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

kvm虛擬機啟動后,vnet0默認橋接到了virbr0上,關閉后消失

[root@data-1-1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.5254002430ec	yes		virbr0-nic
							vnet0
[root@data-1-1 ~]# virsh shutdown CentOS-7-x86_64
Domain CentOS-7-x86_64 is being shutdown

[root@data-1-1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.5254002430ec	yes		virbr0-nic
[root@data-1-1 ~]# 

此時的kvm虛擬機出去的流量是警告橋接到virbr0上,然后經過宿主機的iptables的nat,再經過eth0出去

這就有網絡瓶頸了,而且依靠iptables,如果你把iptables關閉無法上網了。同時ip地址是地址池中分配的內網地址

[root@data-1-1 ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 203 packets, 16415 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 34 packets, 6320 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 24 packets, 4644 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 24 packets, 4644 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
    0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
    0     0 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
  169 10095 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    0     0 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
[root@data-1-1 ~]# 

kvm獲取的地址來源於下面

[root@data-1-1 ~]# ps aux | grep dns
nobody     1343  0.0  0.0  15544   964 ?        S    Feb06   0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root       1344  0.0  0.0  15516   300 ?        S    Feb06   0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root       7701  0.0  0.0 112648   968 pts/0    S+   00:36   0:00 grep --colour=auto dns
[root@data-1-1 ~]# cat /var/lib/libvirt/dnsmasq/default.conf
##WARNING:  THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST.  Changes to this configuration should be made using:
##    virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
pid-file=/var/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0
dhcp-range=192.168.122.2,192.168.122.254
dhcp-no-override
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
[root@data-1-1 ~]# 

 

生產中,網絡這塊改動如下:
一般是添加一個網絡設備橋
把宿主機的網卡橋接到這上面
刪除原先宿主機的IP地址
把宿主機的地址配置到這個網絡設備橋上
最后修改kvm配置文件,讓kvm也橋接到這個網絡設備橋上

 

[root@data-1-1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.5254002430ec	yes		virbr0-nic
							vnet0
[root@data-1-1 ~]# brctl addbr br0
[root@data-1-1 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000000000000	no		
virbr0		8000.5254002430ec	yes		virbr0-nic
							vnet0

 下面操作過程中會斷網。我們可以寫成腳本形式執行 

操作如下

[root@data-1-1 ~]# cd /tools
[root@data-1-1 tools]# vim edit-net.sh
[root@data-1-1 tools]# cat edit-net.sh 
brctl  addif  br0  eth0
ip addr del dev eth0 192.168.145.133/24
ifconfig  br0   192.168.145.133/24 up
route add default gw 192.168.145.2
[root@data-1-1 tools]# sh edit-net.sh &
[1] 8311
[root@data-1-1 tools]# 
[1]+  Done                    sh edit-net.sh
[root@data-1-1 tools]# 

可以看到eth0上就沒有ip地址了,同時eth0橋接到了br0上了

[root@data-1-1 tools]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29a71724	no		eth0
virbr0		8000.5254002430ec	yes		virbr0-nic
							vnet0
[root@data-1-1 tools]# ifconfig 
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.133  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::20c:29ff:fea7:1724  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a7:17:24  txqueuelen 0  (Ethernet)
        RX packets 38  bytes 2676 (2.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35  bytes 3654 (3.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fea7:1724  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a7:17:24  txqueuelen 1000  (Ethernet)
        RX packets 293183  bytes 327693627 (312.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 89134  bytes 18395706 (17.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 4  bytes 1844 (1.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4  bytes 1844 (1.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:24:30:ec  txqueuelen 0  (Ethernet)
        RX packets 46059  bytes 4057533 (3.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 84485  bytes 315875854 (301.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::fc54:ff:fe83:f7a0  prefixlen 64  scopeid 0x20<link>
        ether fe:54:00:83:f7:a0  txqueuelen 500  (Ethernet)
        RX packets 12  bytes 1162 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 737  bytes 38921 (38.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@data-1-1 tools]# 

把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>

重啟kvm,使用vnc登錄,看到ip地址已經重新獲取到了

可以修改網卡配置文件改成靜態地址

此時已經可以使用xshell從筆記本登錄此kvm機器了

[root@localhost ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00: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 state UP qlen 1000
    link/ether 52:54:00:83:f7:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.145.134/24 brd 192.168.145.255 scope global dynamic eth0
       valid_lft 1643sec preferred_lft 1643sec
    inet6 fe80::5054:ff:fe83:f7a0/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# 

esxi默認就是橋接的,,沒這么復雜

kvm這里復雜,所以靈活

 

 

 

 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多核心,它們的緩存是共享的

[root@data-1-1 ~]# taskset --help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]

Options:
 -a, --all-tasks         operate on all the tasks (threads) for a given pid
 -p, --pid               operate on existing given pid
 -c, --cpu-list          display and specify cpus in list format
 -h, --help              display this help
 -V, --version           output version information

The default behavior is to run a new command:
    taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
    taskset -p 700
Or set it:
    taskset -p 03 700
List format uses a comma-separated list instead of a mask:
    taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
    e.g. 0-31:2 is equivalent to mask 0x55555555

For more information see taskset(1).
[root@data-1-1 ~]# 

  使用ps aux | grep kvm命令查看到當前kvm虛擬機進程號是8598,我把它綁定到1號cpu上運行

[root@data-1-1 ~]# taskset -cp 1 8598
pid 8598's current affinity list: 0-3
pid 8598's new affinity list: 1
[root@data-1-1 ~]# 

 把它綁定到1號和2號運行,讓它只能在這兩個cpu之間運行

[root@data-1-1 ~]# taskset -cp 1,2 8598
pid 8598's current affinity list: 1
pid 8598's new affinity list: 1,2
[root@data-1-1 ~]# 

  

 

 

 

 內存優化

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@data-1-1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled 
[always] madvise never
[root@data-1-1 ~]# 

大頁內存,這里默認是2MB

[root@data-1-1 ~]# 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
[root@data-1-1 ~]# 

  

 

 

IO的優化

 

關於IO緩存模式的優化

參照下面博文,版權歸原作者所有。

http://blog.chinaunix.net/uid-20940095-id-3371268.html

2. kvm 存儲棧的原理

從上圖的storage stack中可以看出有些模塊都是double的,比如:
(1)兩層file system: guest file system 和 host file system
(2)兩層的page cache:guest和host中分別有針對文件的page cache
(3)兩層的IO scheduler


鑒於這么多的冗余結構,因此,可以采用適當的優化來提高io的性能。主要的優化方法包括:
(1)采用virtio驅動代替ide驅動,目前kvm使用的就是virtio
(2)禁用host層的page cache
(3)開啟huge page,開啟大頁內存
(4)禁用ksm

 

virtio半虛擬化I/O設備框架,標准化guest與host之間數據交換接口,簡化流程,減少內存拷貝,提升虛擬機I/O效率


3. host層對kvm image文件io的cache方式
kvm通過三個參數來制定host對image文件的io cache方式:none,writeback和writethrough,下圖詳細的闡述了三種不同的cache方式的區別

從圖中可以清晰的看到,writeback采用了guest和host兩層的page cache,也就是說同一個文件會存在兩份cache,這基本是沒有必要的。

none和writethrough都會繞過host層的page cache。kvm默認的cache方式是writethrouh,這種方式不會是最安全的,不會造成數據的不一致性,但是性能也是最差的。綜合數據的安全性和性能,建議選擇none模式。
但是,隨着barrier passing技術的出現,writeback也能保證數據的一致性,所以,如果采用raw格式的image,建議選擇none,如果采用qcow2格式的image,建議選擇writeback。

 

詳細了解也可以參照下面博文

http://blog.sina.com.cn/s/blog_5ff8e88e0101bjmb.html

http://chuansong.me/n/2187028




  

關於IO的調度算法的優化

如果你的磁盤是ssd的話,一定要設置noop
noop就是為了緩存,閃存設備配置的

現在有3種,在centos7默認是deadline

[root@data-1-1 ~]#  cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 
[root@data-1-1 ~]# 

 可以通過下面方式修改的調度算法

[root@data-1-1 ~]# echo noop > /sys/block/sda/queue/scheduler
[root@data-1-1 ~]# cat /sys/block/sda/queue/scheduler 
[noop] deadline cfq 
[root@data-1-1 ~]# echo deadline > /sys/block/sda/queue/scheduler
[root@data-1-1 ~]# cat /sys/block/sda/queue/scheduler 

deadline算法
centos7默認的算法
讀多寫少,對數據庫支持好,但是只要使用ssd,設置為noop即可

深入了解調度算法,可以參照下面博文

http://www.cnblogs.com/kongzhongqijing/articles/5786002.html

 

 

 

 

結尾部分


 修改橋接為永久生效的,上述橋接操作,讓宿主機的eth0橋接到br0上是臨時生效的,加入重啟宿主機,就失效了。

之前使用的brctl命令來自於下面包

[root@data-1-1 network-scripts]# which  brctl
/usr/sbin/brctl
[root@data-1-1 network-scripts]# rpm -qf /usr/sbin/brctl
bridge-utils-1.5-9.el7.x86_64
[root@data-1-1 network-scripts]# 

創建了一個ifcfg-br0文件,然后更改eth0的配置文件,橋接上去

我如下修改之后,重啟network服務,發現無法登錄,ip ad看到ip地址沒生效,重啟機器才可以連接,再次遠程登錄,重啟network服務沒出現過連接不上的情況,后面需要留意下

下面是改動的地方配置情況

[root@data-1-1 network-scripts]# rpm -qf /usr/sbin/brctl
bridge-utils-1.5-9.el7.x86_64
[root@data-1-1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@data-1-1 network-scripts]# cat ifcfg-eth0 
TYPE=Ethernet
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
[root@data-1-1 network-scripts]# cat ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.145.133
NETMASK=255.255.255.0
GATEWAY=192.168.145.2
NAME=br0
[root@data-1-1 network-scripts]# 

  

關於網卡橋接

[root@data-1-1 network-scripts]# virsh start CentOS-7-x86_64
Domain CentOS-7-x86_64 started

[root@data-1-1 network-scripts]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29a71724	no		eth0
							vnet0
virbr0		8000.5254002430ec	yes		virbr0-nic
[root@data-1-1 network-scripts]# 

  

 

知識補充

1、kvm的autostart,設置虛擬機隨着宿主機開機啟動的方法

[root@data-1-1 network-scripts]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     CentOS-7-x86_64                running

[root@data-1-1 network-scripts]# virsh autostart CentOS-7-x86_64
Domain CentOS-7-x86_64 marked as autostarted

[root@data-1-1 network-scripts]# 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM