当前的虚拟化产品有 vmware vsphere ,Hyper-v,xen,kvm。vmware的虚拟化所占的市场有目共睹,Hyper-V是windows平台下的虚拟化,而Xen就属于一个半虚拟化产品。kvm就是我们今天所介绍的对象。

(kvm是kernel virtual module的简写)kvm是红帽公司5.4版本后所推出的最新虚拟化技术产品。它和vpc,virtual  box都属于完全虚拟化产品,而Xen是属于半虚拟化产品。

虽说kvm是完全虚拟化,但在关键的硬盘和网卡上支持半虚拟化virtio,在很大程度上提高了性能,kvm是轻量级虚拟化的代表,也需要硬件vt技术的支持,另外从操作界面上看,xenkvm都是用virt-manager工具,差别不是很大,但不可以在同一台机器上同时安装且运行XenKVM;另外kvm在只能运行在红帽企业版64位系统上,同时需要关闭selinux

KVM是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。增加 KVM 到 Linux 内核是Linux 发展的一个重要里程碑,这也是第一个整合到 Linux 主线内核的虚拟化技术。

KVM所使用的方法是通过简单地加载内核模块而将 Linux 内核转换为一个系统管理程序。这个内核模块导出了一个名为 /dev/kvm 的设备,它可以启用内核的客户模式(除了传统的内核模式和用户模式)。有了 /dev/kvm 设备,VM 使自己的地址空间独立于内核或运行着的任何其他 VM 的地址空间。设备树(/dev)中的设备对于所有用户空间进程来说都是通用的。但是每个打开 /dev/kvm 的进程看到的是不同的映射(为了支持 VM 间的隔离)。KVM安装 KVM 之后,您可以在用户空间启动客户操作系统。每个客户操作系统都是主机操作系统(或系统管理程序)的一个单个进程。

1KVM 虚拟机的管理工具

准确来说,KVM仅是Linux 内核中的一个模块。管理和创建完的 KVM 虚拟机,需要更多的辅助工具。QEMU-KVM:在 Linux 系统中,首先我们可以用 modprobe 命令加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 QEMU。QEMU 是一个强大的虚拟化软件,它可以虚拟不同的 CPU 构架。比如说在 x86 的 CPU 上虚拟一个Power的CPU,并利用它编译出可运行在 Power 上的程序。KVM使用了QEMU的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具QEMU-KVM。所以 Linux 发行版中分为 内核部分的 KVM 内核模块和 QEMU-KVM 工具。这就是 KVM 和 QEMU 的关系。 Libvirt、virsh、virt-manager:尽管 QEMU-KVM 工具可以创建和管理 KVM 虚拟机,RedHat 为 KVM 开发了更多的辅助工具,比如 libvirt、libguestfs 等。原因是 QEMU 工具效率不高,不易于使用。Libvirt 是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持 Xen 等其他虚拟机。使用 libvirt,你只需要通过 libvirt 提供的函数连接到 KVM 或 Xen 宿主机,便可以用同样的命令控制不同的虚拟机了。Libvirt 不仅提供了 API,还自带一套基于文本的管理虚拟机的命令 virsh,你可以通过使用 virsh 命令来使用 libvirt 的全部功能。但最终用户更渴望的是图形用户界面,这就是 virt-manager。他是一套用 python 编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。Virt-manager 就是利用 libvirt 的 API 实现的。

2、kvm虚拟机的安装

(一)安装之前先要开启cpu的虚拟化功能,如果是物理机直接进入BIOS中就该虚拟化选项开启,如果是

  vmware worksation 如图:

Centos6.7_KVM安装配置使用_第1张图片

如果是vSphere 的话也是在设置中找到cpu的设置去开启虚拟化支持。

 设置好之后检查虚拟化是否成功支持:

#egrep "(vmx|svm)" /proc/cpuinfo

flags          : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov patpse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc uparch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperfunfair_spinlock pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnttsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dts tpr_shadowvnmi ept vpid

(二)kvm软件的安装

# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt -y

 # service libvirtd start

 # service libvirtd status

 libvirtd (pid  1818) ...

 # chkconfig libvirtd on

说明:

kvm为linux内核的一个模块,模块不需要安装,只需要加载

virt-manageer 为kvm的管理包

libvirt 为创建虚拟机的工具包

qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的)
       qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

(三)检查模块的正确安装

       使用lsmod来检查模块安装

# lsmod | grep kvm

kvm_intel             55656  0

kvm                  345460  1 kvm_intel

(四)检查KVM是否成功安装

#virsh -c qemu:///system list

备注:初次安装横线下面没有属于正常。另外如果报错的话检查上面的服务是否正常启动。

3、kvm的网络配置

一种是default,它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。

默认的网络连接是virbr0,它的配置文件在

#cat /var/lib/libvirt/network/default.xml

 default

 36ec31bf-a7fa-4b61-90a8-2b46aed90518

 

 

 

 

   

     

   

 

另外一种方式是bridge方式,可以使用虚拟机成为网络中具有独立IP的主机。

我这里是使用第二种网络配置:

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=none

#BROADCAST=10.0.0.255

HWADDR=00:0C:29:92:B5:37

#IPADDR=10.0.0.61

#NETMASK=255.255.255.0

#GATEWAY=10.0.0.254

ONBOOT=yes

BRIDGE="br0"

#vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

TYPE=Bridge

BOOTRPOTO=static

IPADDR=10.0.0.85

NETMASK=255.255.255.0

GATEWAY=10.0.0.254

ONBOOT=yes

#service network restart

说明:

现在使用10.0.0.85连接宿主机

#ifconfig

br0       Link encap:Ethernet  HWaddr 00:0C:29:92:B5:37 

          inet addr:10.0.0.85  Bcast:10.0.0.255  Mask:255.255.255.0

          inet6 addr:fe80::20c:29ff:fe92:b537/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

          RX packets:420 errors:0 dropped:0overruns:0 frame:0

          TX packets:235 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:33439 (32.6 KiB)  TX bytes:29623 (28.9 KiB)

eth0      Link encap:Ethernet  HWaddr 00:0C:29:92:B5:37 

          inet6 addr:fe80::20c:29ff:fe92:b537/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

          RX packets:4299 errors:0 dropped:0overruns:0 frame:0

          TX packets:2822 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:384854 (375.8 KiB)  TX bytes:300481 (293.4 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:92:B5:41 

          inet addr:192.168.3.150  Bcast:192.168.3.255  Mask:255.255.255.0

          inet6 addr:fe80::20c:29ff:fe92:b541/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

          RX packets:1175 errors:0 dropped:0overruns:0 frame:0

          TX packets:304 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:76602 (74.8 KiB)  TX bytes:22635 (22.1 KiB)

          Interrupt:16 Base address:0x2000

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536 Metric:1

          RX packets:618 errors:0 dropped:0overruns:0 frame:0

          TX packets:618 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:73375 (71.6 KiB)  TX bytes:73375 (71.6 KiB)

virbr0    Link encap:Ethernet  HWaddr 92:66:C3:69:F0:D9 

          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0

          inet6 addr:fe80::9066:c3ff:fe69:f0d9/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1

          RX packets:0 errors:0 dropped:0overruns:0 frame:0

          TX packets:81 errors:0 dropped:0overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 b)  TX bytes:12603 (12.3 KiB) 

     注:网桥模式需要在真机eth0配置文件中添加 BRIDGE="br0",否则真机与虚拟机无法互通.

     配置完毕后eth0口则不会显示地址信息,新配置的br0口会代替eth0口成为真机网口,装好的虚拟机eth0口将于真机br0口互通.

 

4、创建虚拟机

(一)使用virt-manager建立一个KVM虚拟机

virt-manager是基于libvirt的图像化虚拟机管理软件,请注意不同的发行版上 virt-manager的版本可能不同,图形界面和操作方法也可能不同。本文使用了红帽6企业版的virt-manager-0.9.0-31。创建KVM虚拟机最简单的方法是通过virt-manager接口。从控制台窗口启动这个工具,从root身份输入virt-manager命令,点击file菜单的"新建"选项virt-manager接口界面

#virt-manager  //图形化界面安装虚拟机

(二)使用virt-install命令创建虚拟机 

//本文重点介绍virt-install命令创建虚拟机

#yum groupinstall "Virtualization tools" -y  //安装脱机虚拟机镜像管理工具

#virt-install --help

Usage: virt-install --name NAME --ramRAM STORAGE INSTALL [options]

Options:

 --version             showprogram's version number and exit

 -h, --help            show thishelp message and exit

 --connect=URI         Connect tohypervisor with libvirt URI

 通用选项:

   -n NAME, --name=NAME

                                    客户端事件名称

   -r MEMORY, --ram=MEMORY

                                    以 MB 为单位为客户端事件分配的内存

   --vcpus=VCPUS       配置来宾账户的虚拟 CPU(vcpu) 数量,如:

                        --vcpus 5

                        --vcpus 5, maxcpus=10

                        --vcpussocket=2,cores=4,threads=2

   --cpuset=CPUSET     Set which physical CPUs domain can use.

   --cpu=CPU              CPU型号及功能,如:--cpu coreduo,+x2apic

   --description=DESCRIPTION

                                   在生成的 XML 中保存的可读 VM 描述。

   --security=SECURITY

                                   设定域安全驱动器配置。

   --numatune=NUMATUNE

                                   为域进程调整 NUMA 策略。

 安装方法选项:

   -c CDROM, --cdrom=CDROM

                                  光驱安装介质

   -l LOCATION, --location=LOCATION

                             安装源(例如:nfs:host:/path、http://host/path                        ://host/path)

   --pxe                 使用 PXE 协议从网络引导

   --import            在磁盘映像中构建客体

   --init=INIT         为容器虚拟机启动二进制的路基该您。例

                        如:

                        --init /path/to/app(包含应用程序)

                        --init /sbin/init(用于所有 OS 容器)

   --livecd         将光驱介质视为 Live CD

   -x EXTRA, --extra-args=EXTRA

                        附加到使用 --location 引导的内核的参数

   --initrd-inject=INITRD_INJECTIONS

                        使用 --location 为 initrd 的 root

                        添加给定文件

   --os-type=DISTRO_TYPE

                        要安装的操作系统类型,例如:'linux'、'u

                        nix'、'windows'

   --os-variant=DISTRO_VARIANT

                        The OS variant beinginstalled guests, e.g. 'fedora6',

                        'rhel5', 'solaris10', 'win2k'

   --boot=BOOTOPTS     自选配置后安装引导顺序、菜单、永久

                        kernel 引导,等等。

 存储配置:

   --disk=DISKOPTS     Specifystorage with various options. Ex.

                        --diskpath=/my/existing/disk

                        --disk path=/my/new/disk,size=5(in gigabytes)

                        --diskvol=poolname:volname,device=cdrom,bus=scsi,...

   --nodisks           不要为该客户端设置任何磁盘。

   --filesystem=FILESYSTEMS

                            将主机目录传递给虚拟机。例如:

                        --filesystem/my/source/dir,/dir/in/guest

                        --filesystemtemplate_name,/,type=template

 联网配置:

   -w NETWORK, --network=NETWORK

                        Configure a guestnetwork interface. Ex:

                        --network bridge=mybr0

                        --networknetwork=my_libvirt_virtual_net

                        --networknetwork=mynet,model=virtio,mac=00:11...

   --nonetworks        不要为该客体创建网络接口。

 图形配置:

   --graphics=GRAPHICS

                        配置虚拟机显示设置。例如:

                        --graphics vnc

                        --graphicsspice,port=5901,tlsport=5902

                        --graphics none

                        --graphicsvnc,password=foobar,port=5910,keymap=ja

   --noautoconsole     不要自动尝试连接到客户端控制台

 设备选项:

   --serial=SERIALS           配置虚拟机串口设备

   --parallel=PARALLELS

                                         配置虚拟机并口设备

   --channel=CHANNELS  配置虚拟机沟通频道

   --console=CONSOLES  配置虚拟机与主机之间的文本控制台连接

   --host-device=HOSTDEVS

                        Configure physical hostdevices attached to the guest

   --soundhw=SOUNDHW   Configureguest sound device emulation

   --watchdog=WATCHDOG

                                   配置虚拟机 watchdog 设备

   --video=VIDEO       配置虚拟机视频硬件。

   --smartcard=SMARTCARD

                        配置虚拟机智能卡设备。例如:

                        --smartcardmode=passthrough

   --redirdev=REDIRDEV

                        Configure a guestredirection device. Ex:

                        --redirdevusb,type=tcp,server=192.168.1.1:4000

   --panic=PANIC       Configure a guest panic device. Ex:

                        --panic default

 虚拟化平台选项:

   -v, --hvm            客户端应该是一个全虚拟客户端

   -p, --paravirt      这个客户端一个是一个半虚拟客户端

   --container         This guestshould be a container guest

   --virt-type=HV_TYPE

                              要使用的管理程序名称(kvm、qemu、xen等等)

   --arch=ARCH     模拟的 CPU 构架

   --machine=MACHINE   The machinetype to emulate

   --noapic            为全虚拟客户端禁用 APIC(在 os-type/os-

                        variant db 中覆盖数值)

   --noacpi            为全虚拟客户端禁用 ACPI(在 os-type/os-

                             variant db 中覆盖数值)

   -u UUID, --uuid=UUID

                            客户端 UUID。

 其它选项:

   --autostart         引导主机时自动启动域。

   --print-xml         输出所生成域的

                        XML,而不是定义虚拟机。

   --print-step=XMLSTEP

                        输出具体安装步骤(1,2,3,all)的

                        XML

   --noreboot          完成安装后不要引导虚拟机。

   --wait=WAIT       要等待的时间(以分钟为单位)

   --dry-run             完成安装步骤,但不要创建设备或者定义

                        虚拟机。

   --force             对任意应用程序提示强制回答‘yes’,终止左右其它提示

   -q, --quiet       禁止无错误输出

   --prompt         要求用户为模糊情况或者需要的选项输入。

   -d, --debug     输入故障排除信息

# virt-install --connectqemu:///system --name kvm4 --ram 500 --disk path=/dev/sdb5 --network bridge=br0--arch x86_64 --graphics sdl --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso

开始安装......

搜索文件.treeinfo......                        |2.2 kB     00:00 ...

搜索文件vmlinuz......                          | 9.8 MB     00:00 ...

搜索文件initrd.img......                      |  73 MB     00:00 ...

ERROR    No DISPLAY environment variable set.  //出错,解决方法如下:

# export DISPLAY=guilinuxbox:0.0

# virt-install --connect qemu:///system --name kvm4 --ram 500 --diskpath=/dev/sdb5 --network bridge=br0 --arch x86_64 --graphics sdl--location=/tmp/CentOS-7-x86_64-Minimal-1511.iso

 

开始安装......

搜索文件.treeinfo......                        |2.2 kB     00:00 ...

搜索文件vmlinuz......                          | 9.8 MB     00:00 ...

搜索文件initrd.img......                      |  73 MB     00:00 ...

ERROR    unsupported configuration: sdl notsupported by '/usr/libexec/qemu-kvm' 

Domain installation does not appearto have been successful.

If it was, you can restart yourdomain by running:

 virsh --connect qemu:///system start kvm1

otherwise, please restart yourinstallation.  //出错,提示qemu-kvm没有sdl接口,因此我们换成vnc来连接虚拟机界面。解决方法如下:

# yum-y install virt-viewer

# virt-install --name CentOS-7_x86_64 --virt-type kvm --ram 1024 --disk path=/dev/sdb5 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso --force

开始安装......

搜索文件.treeinfo......                        |2.2 kB     00:00 ...

搜索文件vmlinuz......                          |9.8 MB     00:04 ...

搜索文件 initrd.img......                       |  73 MB    00:15 ...

创建域......                                     |    0 B    00:19    

'virt-viewer --help'

域安装仍在进行。您可以重新连接

到控制台以便完成安装进程。

# virsh list --all  

 Id                               

----------------------------------------------------

 8     CentOS-7_x86_64                running

# netstat -tunlp|grep kvm

tcp        0     0 127.0.0.1:5900             0.0.0.0:*                  LISTEN      5149/qemu-kvm

    虚拟机基本操作学习:

生成kvm虚拟机:virt-install
查看在运行的虚拟机:virsh list
查看所有虚拟机:virsh list –all
查看kvm虚拟机配置文件:virsh dumpxml name
启动kvm虚拟机:virsh start name
正常关机:virsh shutdown name
非正常关机(相当于物理机直接拔掉电源):virsh destroy name
删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)
根据配置文件定义虚拟机:virsh define file-name.xml
挂起,终止:virsh suspend name
恢复挂起状态:virsh resumed name

编辑kvm的xml文件,更改虚拟机CPU配置

#virsh edit CentOS-7_x86_64

1  //当前为1,自动扩容,最大为4