KVM(全称是Kernel-based Virtual Machine)是Linux下x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块kvm.ko提供和虚拟化核心架构和处理器规范模块。
使用KVM可允许多个包括Linux和Windows每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等。自Linux 2.6.20之后集成在Linux的各个主要发行版本中,它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己到进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列也是基于软件模拟的Para-Virtualization。
KVM原理图
一个典型的 KVM 安装包括以下部件:
- 一个管理虚拟硬件的设备驱动,这个驱动通过一个字符设备 /dev/kvm 导出它的功能。通过 /dev/kvm 每一个客户机拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的客户机相分离。
- 一个模拟硬件的用户空间部件,它是一个稍微改动过的 QEMU 进程。从客户机操作系统执行 I/O 会拥有 QEMU 。 QEMU 是一个平台虚拟化方案,它允许整个 PC 环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的 I/O 请求都被拦截,并被路由到用户模式用以被 QEMU 过程模拟仿真。
检查CPU
和 Xen 不同,KVM 需要有 CPU 的支持(IntelVT 或 AMD SVM),在安装 KVM之前检查一下CPU是否提供了虚拟技术的支持:
# grep -E --color 'vmx|svm' /proc/cpuinfo
flags :fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dtsacpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmonpebs bts rep_good aperfmperf pni dtes64 monitor ds_cplvmxest tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm tpr_shadow vnmi flexpriority
flags :fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dtsacpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmonpebs bts rep_good aperfmperf pni dtes64 monitor ds_cplvmxest tm2 ssse3 cx16 xtpr pdcm xsave lahf_lm tpr_shadow vnmi flexpriority
RHEL6系列安装虚拟化工具可以在安装系统的时候选择安装(这里不作介绍),这里主要介绍的是系统安装之后使用YUM安装虚拟化工具的过程。
yum安装虚拟化
为了在RHEL6上使用虚拟化至少要安装qemu-kvm和qemu-img包。这些安装包提供用户级别的KVM模拟器和RHEL6系统主机磁盘镜像管理。
# yum install qemu-kvm qemu-img
其他一些额外
# yum install virt-managerlibvirt libvirt-python python-virtinst libvirt-client virt-viewer
virt-manager: virt-manager, also known as Virtual Machine Manager, provides agraphical tool for administering virtual machines. It uses libvirt-clientlibrary as the management API.
libvirt: he libvirt package provides the server and host side librariesfor interacting with hypervisors and host systems. The libvirt package providesthe libvirtd daemon that handles the library calls, manages virtualized guestsand controls the hypervisor.
libvirt-python:The libvirt-python package contains a module thatpermits applications written in the Python programming language to use theinterface supplied by the libvirt API.
python-virtinst:Provides the virt-install command for creatingvirtual machines.(提供virt-install命令安装虚拟机)
libvirt-client:The libvirt-client package provides theclient-side APIs and libraries for accessing libvirt servers. Thelibvirt-client package includes the virsh command line tool to manage andcontrol virtualized guests and hypervisors from the command line or a specialvirtualization shell.
virt-viewer:开启图形控制台安装虚拟客户机需要
也可以使用 yum groupinstall
# yum groupinstall -y Virtualization "Virtualization Client""Virtualization Platform" "Virtualization Tools"
birdge networking 桥接网络
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xxxxxxxxx
ONBOOT=yes
BRIDGE=br0
# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.1.1.X
NETMASK=255.255.255.0
GATEWAY=x.x.x.x
# service network restart
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.b8975a004d66 no eth0
virbr0 8000.52540077cd54 yes virbr0-nic
如果设置了防火墙,则使用以下命令放行
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
# service iptables save
# service iptables restart
# /etc/init.d/libvirtd restart
正在关闭libvirtd 守护进程: [确定]
启动libvirtd 守护进程: [确定]
# chkconfig libvirtd on
安装可以使用命令行实现,也可以使用KVM管理器安装,这里只介绍命令行的一般安装方法
# virt-install --name=rhel6-1 --disk path=/kvm/rhel6-1/rhel6.img,size=10,sparse=true --graphics=vnc --network bridge=br0 --os-type=linux --os-variant=rhel6 --ram=1024 --cdrom=/media/rhel-server-6.1-i386-dvd.iso //本地安装
# virt-install \ --name=rhel6-2 \ --file=/kvm/rhel6-2/rhel6-2.img \ --file-size=10 \ --nonsparse --graphics spice \ --vcpus=2 --ram=2048 \ --location=http://example1.com/installation_tree/RHEL6.1-Server-x86_64/os \ --network bridge=br0 \ --os-type=linux \ --os-variant=rhel6-2 //http方式安装
网络安装方法
# virt-install --name=rhel6-3 --disk path=/kvm/rhel6-3/rhel6.img,size=10,sparse=true \--graphics=vnc --vcpus=1 --ram=1024 --network bridge=br0 --os-type=linux \
--os-variant=rhel6 --location=nfs:10.1.1.1:/share/rhel6.1 --extra-args "ks=ftp://cs:cs@10.1.1.10/my.cfg"
参考:红帽虚拟化官方文档
terry技术博客