关于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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐