關於kvm輕度使用的一些總結

關於kvm輕度使用的一些總結

  1. 關於kvm和qemu和virt-tools、libvirt

  2. 如何安裝虛擬機和簡單使用

  3. trouble-shooting

1. 關於kvm、qemu、virt-tools、libvirt

什麼是 KVM ?

kVM 是指基於 Linux 內核的虛擬機(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的Qumranet 組織開發的一種新的“虛擬機”實現方案。 2007 年 2 月發佈的 Linux 2.6.20 內核第一次包含了 KVM 。增加 KVM 到 Linux 內核是 Linux 發展的一個重要里程碑,這也是第一個整合到 Linux 主線內核的虛擬化技術。

KVM 在標準的 Linux 內核中增加了虛擬技術,從而我們可以通過優化的內核來使用虛擬技術。在 KVM 模型中,每一個虛擬機都是一個由 Linux 調度程序管理的標準進程,你可以在用戶空間啓動客戶機操作系統。一個普通的 Linux 進程有兩種運行模式:內核和用戶。 KVM 增加了第三種模式:客戶模式(有自己的內核和用戶模式)。

什麼是libvirt?

Libvirt是庫,是一種實現 Linux 虛擬化功能的 Linux® API,它支持各種虛擬機監控程序,包括 Xen 和 KVM,以及 QEMU 和用於其他操作系統的一些虛擬產品。

他提供一個命令和一個穩定的層來管理node上的域,甚至乎遠程管理。 libvirt提供所有API來做管理,例如提供,創建,修改,監控,控制,遷移,和停止域。

他的構成是這樣的:

  • a node is a single physical machine
  • an hypervisor is a layer of software allowing to virtualize a node in a set of virtual machines with possibly different configurations than the node itself
  • a domain is an instance of an operating system (or subsystem in the case of container virtualization) running on a virtualized machine provided by the hypervisor


libvirt把物理機叫節點node,將虛擬客戶機比作域domain,還有一個hypervisor的軟件負責虛擬化的(負責通訊和處理api請求等)

其實他的架構師這樣的:


從另外一個層面來看是這樣的


引用參考:

  1. http://www.ibm.com/developerworks/cn/linux/l-libvirt/
  2. http://en.wikipedia.org/wiki/Libvirt
  3. http://libvirt.org/goals.html

什麼是qemu

表格一解釋了qemu就是面向各種架構的平臺仿真器.

QEMU是一套由Fabrice Bellard所編寫的模擬處理器的自由軟件。它與Bochs,PearPC近似,但其具有某些後兩者所不具備的特性,如高速度及跨平臺的特性。經由kqemu這個開源的加速器,QEMU能模擬至接近真實電腦的速度。

進一步理解的話,kvm只能虛擬x86平臺的虛擬機,而qemu就可以虛擬arm,mips平臺的虛擬機,這就是他們最大的區別。

引用參考:

  1. http://wiki.qemu.org/Main_Page
  2. http://zh.wikipedia.org/wiki/QEMU

什麼是virt-tools

virt-tools是管理libvirt的工具,例如virt-install virsh等工具

引用參考:

  1. http://libvirt.org/virshcmdref.html

表格一是列出各種不同的虛擬機程序的區別:

虛擬機監控程序 描述
Xen 面向 IA-32,IA-64 和 PowerPC 970 架構的虛擬機監控程序
QEMU 面向各種架構的平臺仿真器
Kernel-based Virtual Machine (KVM) Linux 平臺仿真器
Linux Containers(LXC) 用於操作系統虛擬化的 Linux(輕量級)容器
OpenVZ 基於 Linux 內核的操作系統級虛擬化
VirtualBox x86 虛擬化虛擬機監控程序
User Mode Linux 面向各種架構的 Linux 平臺仿真器
Test 面向僞虛擬機監控程序的測試驅動器
Storage 存儲池驅動器(本地磁盤,網絡磁盤,iSCSI 卷)

2. 如何安裝虛擬機和簡單使用

CentOS6.5 x64上安裝KVM功能模塊步驟

操作都以root用戶進行。

  • 檢查CPU信息

    KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安裝 KVM 之前檢查一下 CPU 是否提供了虛擬技術的支持。 基於 Intel 處理器的系統,運行 grep vmx /proc/cpuinfo 查找 CPU flags 是否包括 vmx 關鍵詞。

    Shell

    # grep vmx /proc/cpuinfo
     flags : fpu vme de pse tsc msr pae mce
     cx8 apic sep  mtrr pge mca cmov pat 
     pse36 clflush dts acpi mmx 
     fxsr sse sse2 ss ht tm pbe syscall nx lm
     constant_tsc arch_perfmon pebs bts 
     rep_good pni monitor ds_cpl 
     vmx est tm2 ssse3 cx16 xtpr lahf_lm ida 
     flags : fpu vme de pse tsc msr pae mce 
     cx8 apic sep mtrr pge mca cmov pat 
     pse36 clflush dts acpi mmx fxsr sse sse2
     ss ht tm pbe syscall nx lm constant_tsc
     arch_perfmon pebs bts rep_good pni 
     monitor  ds_cpl vmx est tm2 ssse3 cx16  xtpr lahf_lm ida

    # grep vmx /proc/cpuinfo

    flags : fpu vme de pse tsc msr pae mce

    cx8 apic sep   mtrr pge mca cmov pat

    pse36 clflush dts acpi mmx

    fxsr sse sse2 ss ht tm pbe syscall nx lm

    constant_tsc arch_perfmon pebs bts

    rep_good pni monitor ds_cpl

    vmx est tm2 ssse3 cx16 xtpr lahf_lm ida

    flags : fpu vme de pse tsc msr pae mce

    cx8 apic sep mtrr pge mca cmov pat

    pse36 clflush dts acpi mmx fxsr sse sse2

    ss ht tm pbe syscall nx lm constant_tsc

    arch_perfmon pebs bts rep_good pni

    monitor   ds_cpl vmx est tm2 ssse3 cx16   xtpr lahf_lm ida

    基於 AMD 處理器的系統,運行 grep svm /proc/cpuinfo 查找 CPU flags 是否包括 svm 關鍵詞

    Shell

    # grep svm /proc/cpuinfo

    # grep svm /proc/cpuinfo

    注 : 一些廠商禁止了機器 BIOS 中的 VT 選項 , 這種方式下 VT 不能被重新打開。 注意:/proc/cpuinfo 僅從 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 開始顯示虛擬化方面的信息。請使用 uname -r 命令查詢您的內核版本。如有疑問,請聯繫硬件廠商。

  • 檢查BIOS,確保BIOS裏開啓VT選項:

    Intel(R) Virtualization Tech [Enabled] 如有必要,還需在BIOS中開啓VT並重啓機器。

  • 關掉networkmanager,因爲這個會導致虛擬網卡配置衝突

    Shell

    service NetworkManager stop
    
    chkconfig --del NetworkManager

    service NetworkManager stop

    chkconfig -- del NetworkManager

  • 關掉selinux

    Shell

    修改/etc/selinux/config 文件
    將SELINUX=enforcing改爲SELINUX=disabled
    
    setenforce 0

    修改 / etc / selinux / config 文件

    將 SELINUX = enforcing 改爲 SELINUX = disabled

    setenforce 0   

  • 安裝軟件 其中一種安裝都可以

    Shell

    yum -y install kvm python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v

    yum - y install kvm python - virtinst libvirt tunctl bridge - utils virt - manager qemu- kvm - tools virt - viewer virt - v2v

    Shell

    yum install kvm virt-* libvirt

    yum install kvm virt - * libvirt

    Shell

    yum groupinstall Virtualization 'Virtualization Client'
    yum install libvirt

    yum groupinstall Virtualization 'Virtualization Client'

    yum install libvirt

    安裝完成後需要重啓服務器

    Shell

    service libvirtd start
    chkconfig --level 3 libvirtd on

    service libvirtd start

    chkconfig -- level 3 libvirtd on

    檢查是否可以使用kvm模塊

    Shell

    lsmod | grep kvm
    kvm_intel              54285  9 
    kvm                   333172  1 kvm_intel

    lsmod | grep kvm

    kvm _ intel                54285    9

    kvm                    333172    1 kvm _ intel

  • 配置網卡

    進入網卡配置目錄

    Shell

    cd /etc/sysconfig/network-scripts/
    cp ifcfg-eth0 ifcfg-br0

    cd / etc / sysconfig / network - scripts /

    cp ifcfg - eth0 ifcfg - br0

    將eth0的網卡配置和br0的網卡配置修改爲如下內容:

    Shell

    [root@test02 network-scripts]# cat ifcfg-eth0 
    DEVICE=eth0
    HWADDR=BC:EE:7B:9A:5E:91
    TYPE=Ethernet
    UUID=a257d75d-072c-4eac-8daa-b131324fff52
    ONBOOT=yes
    NM_CONTROLLED=yes
    #BOOTPROTO=static
    #IPADDR=192.168.0.12
    #NETMASK=255.255.255.0
    #GATEWAY=192.168.0.1
    DNS1=8.8.8.8
    
    BRIDGE=br0
    [root@test02 network-scripts]# cat ifcfg-br0 
    DEVICE=br0
    HWADDR=BC:EE:7B:9A:5E:91
    UUID=a257d75d-072c-4eac-8daa-b131324fff52
    ONBOOT=yes
    TYPE=Bridge
    NM_CONTROLLED=yes
    BOOTPROTO=static
    IPADDR=192.168.0.12
    NETMASK=255.255.255.0
    GATEWAY=192.168.0.1
    DNS1=8.8.8.8

    [ root @ test02 network - scripts ] # cat ifcfg-eth0

    DEVICE = eth0

    HWADDR = BC : EE : 7B : 9A : 5E : 91

    TYPE = Ethernet

    UUID = a257d75d - 072c - 4eac - 8daa - b131324fff52

    ONBOOT = yes

    NM_CONTROLLED = yes

    #BOOTPROTO=static

    #IPADDR=192.168.0.12

    #NETMASK=255.255.255.0

    #GATEWAY=192.168.0.1

    DNS1 = 8.8.8.8

    BRIDGE = br0

    [ root @ test02 network - scripts ] # cat ifcfg-br0

    DEVICE = br0

    HWADDR = BC : EE : 7B : 9A : 5E : 91

    UUID = a257d75d - 072c - 4eac - 8daa - b131324fff52

    ONBOOT = yes

    TYPE = Bridge

    NM_CONTROLLED = yes

    BOOTPROTO = static

    IPADDR = 192.168.0.12

    NETMASK = 255.255.255.0

    GATEWAY = 192.168.0.1

    DNS1 = 8.8.8.8

    配置完成後 執行

    service network restart 即可看到效果

    評論:

    1. DNS服務器配置隨意
    2. br0是虛擬網卡, libvirt 是安裝這個軟件後出來的
    3. 實體網卡去掉相關ip屬性,如 BOOTPROTO IPADDR NETMASK GATEWAY ,虛擬網卡將這些屬性補充到自己的網卡配置文件裏面去,但其他配置一律不變動,相當於br0變成實體網卡了,但只是相當於而已。
    4. 虛擬網卡需要將TYPE改爲Bridge,證明是使用橋接模式。

安裝虛擬機

  • 創建虛擬機磁盤鏡像文件

    創建磁盤文件不能太小,不然會coredump。

    qcow2格式是kvm支持的標準格式,raw格式爲虛擬磁盤文件通用格式。有測試數據表明raw格式的I/O性能略高於qcow2格式,但是在加密,容量,快照方面qcow2格式有優勢

    Shell

    qemu-img create -f qcow2 test.qcow2 20G  //建立qcow2格式磁盤文件
    qemu-img create -f raw test.raw 20G      //建立raw格式磁盤文件
    qemu-img info test.qcow2                 //查看已經創建的虛擬磁盤文件

    qemu - img create - f qcow2 test .qcow2 20G    / / 建立 qcow2 格式磁盤文件

    qemu - img create - f raw test .raw 20G        / / 建立 raw 格式磁盤文件

    qemu - img info test .qcow2                  / / 查看已經創建的虛擬磁盤文件

  • 創建並安裝虛擬機 以下是ubuntu爲例,ubuntu 14

    Shell

    cat vir_ubuntu.sh 
    #!/bin/bash
    virt-install --name ubuntu \
    --boot network,cdrom,menu=on \
    --ram 512 --vcpus=1 \
    --os-variant=generic \
    --cdrom=/app/ftp_data/team/public/system_iso/ubuntu-14.04-desktop-i386.iso \
    --disk path=/app/kvm/images/centos.qcow2,size=10,format=qcow2,bus=virtio \
    --bridge=br0,model=virtio --keymap=en-us \
    --vnc --vncport=5910 --vnclisten=0.0.0.0

    cat vir_ubuntu .sh

    #!/bin/bash

    virt - install -- name ubuntu \

    -- boot network , cdrom , menu = on \

    -- ram 512 -- vcpus = 1 \

    -- os - variant = generic \

    -- cdrom = / app / ftp_data / team / public / system_iso / ubuntu - 14.04 - desktop- i386 .iso \

    -- disk path = / app / kvm / images / centos .qcow2 , size = 10 , format = qcow2 ,bus = virtio \

    -- bridge = br0 , model = virtio -- keymap = en - us \

    -- vnc -- vncport = 5910 -- vnclisten = 0.0.0.0

    以下是centos 6.5爲例

    Shell

    cat vir_centos.sh 
    #!/bin/bash
    virt-install --name centos6.5x64 \
    --boot network,cdrom,menu=on \
    --ram 512 --vcpus=1 \
    --os-variant=generic \
    --cdrom=/app/ftp_data/team/public/system_iso/CentOS-6.5-x86_64-bin-DVD1.iso \
    --disk path=/app/ftp_data/team/public/system_iso/another_CentOS-6.5-x86_64-bin-DVD1.iso,device=cdrom \
    --disk path=/app/kvm/images/centos.qcow2,size=10,format=qcow2,bus=virtio \
    --bridge=br0,model=virtio --keymap=en-us \
    --vnc --vncport=5911 --vnclisten=0.0.0.0

    cat vir_centos .sh

    #!/bin/bash

    virt - install -- name centos6 . 5x64 \

    -- boot network , cdrom , menu = on \

    -- ram 512 -- vcpus = 1 \

    -- os - variant = generic \

    -- cdrom = / app / ftp_data / team / public / system_iso / CentOS - 6.5 - x86_64 -bin - DVD1 .iso \

    -- disk path = / app / ftp_data / team / public / system_iso / another_CentOS - 6.5- x86_64 - bin - DVD1 .iso , device = cdrom \

    -- disk path = / app / kvm / images / centos .qcow2 , size = 10 , format = qcow2 ,bus = virtio \

    -- bridge = br0 , model = virtio -- keymap = en - us \

    -- vnc -- vncport = 5911 -- vnclisten = 0.0.0.0

    評論:

    1. os-variant是指支持什麼虛擬機,以下是支持的類型,按需選擇即可 
      ~~~ 
      win7 : Microsoft Windows 7 
      vista : Microsoft Windows Vista 
      winxp64 : Microsoft Windows XP (x86_64) 
      winxp : Microsoft Windows XP 
      win2k8 : Microsoft Windows Server 2008 
      win2k3 : Microsoft Windows Server 2003 
      freebsd8 : FreeBSD 8.x 
      generic : Generic 
      debiansqueeze : Debian Squeeze 
      debianlenny : Debian Lenny 
      fedora16 : Fedora 16 
      fedora15 : Fedora 15 
      fedora14 : Fedora 14 
      mes5.1 : Mandriva Enterprise Server 5.1 and later 
      mandriva2010 : Mandriva Linux 2010 and later 
      rhel6 : Red Hat Enterprise Linux 6 
      rhel5.4 : Red Hat Enterprise Linux 5.4 or later 
      rhel4 : Red Hat Enterprise Linux 4 
      sles11 : Suse Linux Enterprise Server 11 
      sles10 : Suse Linux Enterprise Server 
      ubuntuoneiric : Ubuntu 11.10 (Oneiric Ocelot) 
      ubuntunatty : Ubuntu 11.04 (Natty Narwhal) 
      ubuntumaverick : Ubuntu 10.10 (Maverick Meerkat) 
      ubuntulucid : Ubuntu 10.04 (Lucid Lynx) 
      ubuntuhardy : Ubuntu 8.04 LTS (Hardy Heron) 
      ~~~
    2. disk屬性就是指虛擬機使用哪一個磁盤鏡像文件作爲存儲地方,指定剛纔創建的鏡像文件位置即可,size=10,format=qcow2,bus=virtio分別是指大小,格式(跟鏡像格式一致),磁盤總線類型(指Value can be ’ide’, ’scsi’, ’usb’, ’virtio’ or ’xen’,virtio是專門爲kvm制定的bus,比較常用),大小需要比鏡像文件大小要小,相當於鏡像是容器,這個disk是裏面的水,水太多就溢出了。
    3. bridge=br0,model=virtio –keymap=en-us分別指網卡使用,網卡模式即驅動模式,和鍵盤制式,橋接模式都使用br0,而虛擬機需要使用virtio這個驅動才能使用虛擬網卡,這個虛擬網卡驅動在linux下支持很好,在windows下支持一般,鍵盤制式如果不指定的話會出現鍵位錯亂的情況,一般我們使用英式
    4. 安裝centos6.5的時候我使用了2次disk,原因是因爲centos6.5的安裝盤啓動引導安裝有問題,會出現無法查找到安裝源的情況,所以特地加載多一個iso,一個作爲啓動使用,一個作爲安裝源使用,作爲安裝源使用的時候是使用磁盤格式存儲
    5. vnc相關配置,這個vnc如果配置了的話是virt-tools組件自帶的,無需要額外安裝vnc服務端,默認綁定127.0.0.1,這裏將其改爲 0.0.0.0 以便可以通過外部連接,每一臺的虛擬機的端口都不能一致,一致就會衝突而造成無法啓動安裝。
    6. 如果無須使用圖形界面安裝,virt-install默認是支持文本模式安裝的。

3. trouble-shooting

  • 默認情況下virsh工具不能對linux虛擬機進行關機操作,linux操作系統需要開啓與啓動acpid服務。在安裝KVM linux虛擬機必須配置此服務。

Shell

# chkconfig acpid on   
# service acpid restart

# chkconfig acpid on  

# service acpid restart

  • 關於安裝windows虛擬機問題

xp是可以安裝成功的,但win2008r2安裝失敗,我提了http://stackoverflow.com/questions/25662436/can-not-install-windows-2008-r2-in-kvm 和 http://segmentfault.com/q/1010000000659199 但依然沒有高手能幫忙到,不過在安裝winxp的過程中我總結了一下經驗:

  1. kvm其實對windows系列支持並不是太好,雖然補充了兼容windows的磁盤驅動和網卡驅動,但給我的感覺並不大氣,不過我也想了一下,其實也沒有必要使用kvm去虛擬windows,也有vmware這種大鱷可以做,而且服務器一般是linux,所以其實用的不多。
  2. windowsxp的安裝樣例我也給出來,可以做實驗之用。

Shell

cat vir_xp2.sh 
virt-install \
--name=xp2 \
--ram 256 \
--vcpus=1 \
--disk path=/app/kvm/images/xp2.img,size=10 \
--cdrom=/app/ftp_data/team/public/system_iso/zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso \
--vnc --vncport=5913 --vnclisten=0.0.0.0 \
--network bridge=br0,model=virtio \
--noautoconsole \
--os-variant=winxp \
--keymap=en-us

cat vir_xp2 .sh

virt - install \

-- name = xp2 \

-- ram 256 \

-- vcpus = 1 \

-- disk path = / app / kvm / images / xp2 .img , size = 10 \

-- cdrom = / app / ftp_data / team / public / system_iso / zh -hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14 - 74070.iso \

-- vnc -- vncport = 5913 -- vnclisten = 0.0.0.0 \

-- network bridge = br0 , model = virtio \

-- noautoconsole \

-- os - variant = winxp \

-- keymap = en - us   

需要注意的是安裝磁盤驅動是在安裝程序出現尋找磁盤時選擇加載驅動


網卡驅動安裝參考:

http://lvii.github.io/system/2013/11/15/xp-sp3-kvm-network-virtio-install-failed

官方磁盤和網卡驅動下載:

http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/

  • 關於磁盤在線擴容和熱插拔

    磁盤在線擴容和熱插拔磁盤的時候會報錯

Shell

error: this function is not supported by the hypervisor: disk bus 'ide' cannot be hotplugged.

error: Requested operation is not valid: cannot attach device on inactive domain

error: Failed to attach device from /gfs1/disk2tovm2.xml
error: this function is not supported by the hypervisor: disk bus 'ide' cannot be hotplugged

error : this function is not supported by the hypervisor : disk bus 'ide' cannot behotplugged .

error : Requested operation is not valid : cannot attach device on inactive domain

error : Failed to attach device from / gfs1 / disk2tovm2 .xml

error : this function is not supported by the hypervisor : disk bus 'ide' cannot behotplugged

原因是ide驅動的磁盤不支持熱插拔,需要使用 SCSI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章