当前的虚拟化产品有 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技术的支持,另外从操作界面上看,xen和kvm都是用virt-manager工具,差别不是很大,但不可以在同一台机器上同时安装且运行Xen和KVM;另外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 之后,您可以在用户空间启动客户操作系统。每个客户操作系统都是主机操作系统(或系统管理程序)的一个单个进程。
1、KVM 虚拟机的管理工具
准确来说,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 如图:
如果是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
<!--
OVERWRITTEN AND LOST. Changes to thisxml configuration
should be made using:
virsh net-edit default
or other application using thelibvirt API.
-->
<network>
<name>default</name>
<uuid>36ec31bf-a7fa-4b61-90a8-2b46aed90518</uuid>
<forward mode=‘nat‘/>
<bridge name=‘virbr0‘ stp=‘on‘ delay=‘0‘ />
<mac address=‘52:54:00:B7:F4:66‘/>
<ip address=‘192.168.122.1‘ netmask=‘255.255.255.0‘>
<dhcp>
<range start=‘192.168.122.2‘ end=‘192.168.122.254‘ />
</dhcp>
</ip>
</network>
另外一种方式是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
<vcpu placement=‘static‘>1</vcpu> //当前为1,自动扩容,最大为4