KVM是Kernel-based Virtual Machine的缩写,从名字上可以知道,KVM是在支持虚拟化硬件环境上,基于Linux操作系统内核的虚拟化技术。

其上的客户操作系统可以完全虚拟化或者半虚拟化。半虚拟化允许多个客户操作系统在一套硬件上运行,可以更有效的使用系统资源,如:内存,处理器。在半虚拟化中,客户端操作系统被修改得适合在虚拟机上运行,最小化那些不适合在虚拟环境中执行的操作的执行时间。

1. 管理VM的工具

KVM包提供特定的工具来管理虚拟机管理程序qemu-kvm

不过建议使用libvirt软件包来管理虚拟机,它相对来说更容易使用。libvirt包含了API库、守护进程libvirtd以及命令行工具virsh可以使用它来管理多种类型的虚拟机,如:KVM、Xen、VMWare ESX等。更详细的列表请参考libvirt。

下面是其他的一些可以用来管客户端虚拟机的工具:

  • vir-manager(Virtual Machine Manager):管理虚拟机的图形化工具
  • vm-install:菜单驱动的脚本工具,可以用来配置和安装客户操作系统。
  • virt-viewer:用来访问客户操作系统的X viewer工具,支持X509证书认证和SASL认证的TLS/ SSL加密。

2. 检查硬件是否支持虚拟化

使用下面命令检查迎检是否支持虚拟化:


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


如果在flags部分看到vms或者svm,那么硬件(CPU)是支持虚拟化技术的。

3. 安装KVM软件包

可以使用你Linux发行版的软件包管理工具来安装KVM(比如:debian上的apt,Redhat和CentOS上的yum)


# yum install kvm


KVM安装完成后,建议安装一下KVM相关工具包,他们可以帮助管理系统上的虚拟机

# yum install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools

下面是系统上将要安装的KVM相关软件包列表,版本号可能与你的系统略有不同


# rpm -qa | egrep "virt|kvm|qemu"python-virtinst-0.600.0-18.el6.noarchqemu-img-0.12.1.2-2.415.el6.x86_64
libvirt-0.10.2-29.el6.x86_64
virt-viewer-0.5.6-8.el6.x86_64
qemu-kvm-0.12.1.2-2.415.el6.x86_64
libvirt-python-0.10.2-29.el6.x86_64
virt-manager-0.9.0-19.el6.x86_64
virt-top-1.0.4-3.15.el6.x86_64
libvirt-client-0.10.2-29.el6.x86_64
gpxe-roms-qemu-0.9.7-6.10.el6.noarch
virt-what-1.11-1.2.el6.x86_64


所有需要的软件包安装完成后,虽然我们可以使用

modprob命令来重新加载模块,但还是推荐重启系统来加载KVM,libvirt相关的模块,

可以使用vm-install(SUSE Linux)或者virt-install(RedHat)虚拟机管理工具来安装客户操作系统。

如果你配置了X服务器(exceedreflectionX或其它X服务器),那么就可以使用图形界面来管理虚拟机,图形界面会使用向导来一步步指导你安装过程。如果没有配置X服务器比如使用ssh(没有用X11-forwarding),那么vm-install会提供命令行交互方式来配置客户操作系统。

4. 创建虚拟机的网络要求

默认情况下,虚拟机只能访问同一个Server的其他虚拟机(以及Server自己)。如果你希望虚拟机可以访问VLAN,你需要为你的主机操作系统配置一个桥接网络(Network Bridge)。

修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,增加一行 BRIDGE=br0 (确保已删除所有静态IP配置)

创建文件 /etc/sysconfig/network-scripts/ifcfg-br0 并添加下面内容:


DEVICE="br0"BOOTPROTO="static"IPADDR="xxx.xxx.xxx.xxx"NETMASK="255.255.255.0"ONBOOT="yes"TYPE="Bridge"NM_CONTROLLED="no"


你可以使用DHCP或者静态IP地址,在上面的配置中我使用的时静态IP地址。如果你的主机上配置了类似于iptables之类的防火墙,需要增加一个规则允许桥接网络的流量。

5. 其他创建虚拟机前要配置的内容

默认情况下虚拟机的镜像文件保存在/var/lib/libvirt/images,请确保那个位置有足够的空间。如果没有足够的空间,你可以在创建虚拟机时将镜像文件保存在其他位置。

/etc/sysctl.conf增加以下配置启用IP转发(IP forwarding):


inet.ipv3.ip_forward=1


修改完成后重新启动系统。

6. 使用virt-install创建虚拟机

使用virt-install工具来创建虚拟机,这个工具可以在交互或非交互模式下使用。

在下面的例子中,我提供了创建虚拟机必须的命令行参数:


# virt-install \ -n myRHELVM1 \ --description "Test VM with RHEL 6" \ --os-type=Linux \ --os-variant=rhel6 \ --ram=2048 \ --vcpus=2 \ --disk path=/var/lib/libvirt/images/myRHELVM1.img,bus=virtio,size=10 \ --graphics none \ --cdrom /var/rhel-server-6.5-x86_64-dvd.iso \ --network bridge:br0


我们逐个解释一下上面的各个参数:

  • -n: 虚拟机的名字
  • --description: 虚拟机的描述,比如:应用服务器、数据库服务器、Web服务器等
  • --os-type:操作系统的类型,可以是:Linux、Solaris、Unix或Windows
  • --os-variant:上面参数所指定的操作系统版本。比如:对于Linux有 rhel6、centos6、ubuntu14、suse11、fedora6等,对于Windows有win2k、win2k8、win8、win7
  • --ram:虚拟机的内存大小
  • --vcpu:虚拟机的处理器个数
  • --disk path:虚拟机镜像文件保存路劲,size的单位是GB。在这个例子中,镜像文件的大小是10GB。
  • --graphic none:这个参数告诉virt-install使用虚拟机的字符终端而不是用图形界面(VNC)。如果你的主机上安装了xmanager,可以忽略这个参数。
  • --cdrom:指定安装镜像的路径。除了cdrom意外也可以使用NFS或者http安装位置。比如:--location=http://www.4byte.cn/pub/rhel6/x86_64
  • --network bridge:br0:这个例子中使用桥接网络适配器br0。当然你可以使用自己的网络配置或者特定的端口来替换桥接网络。如果你计划使用NAT网络可以像这样配置:–network network=VMnetwork1。所有虚拟机的网络配置文件都保存在/etc/libvirt/qemu/networks/

7. 列出所有虚拟机

你可以在grub menu中增加console=tty0 console=ttyS0,115200 在安装过程中将控制台重定向到你的SSH窗口。另外,你也可以使用X server来显示安装过程。

下面的命令用来列出目前主机上已安装的虚拟机,可以看到当前我们已经安装了两个虚拟机:


# virsh list --all Id    Name                           State---------------------------------------------------- 1     dev-dev-vm                     running 2     myRHELVM1                      running


8. 修改虚拟机配置文件

虚拟机创建完成后,可以在下面位置找到虚拟机的配置文件,配置文件是以"虚拟机名称.xml"来命名的。


# ls -l /etc/libvirt/qemu/myRHELVM1.xml-rw-------. 1 root root 2109 Oct 15 12:30 /etc/libvirt/qemu/myRHELVM1.xml


不建议手工修改这个配置文件,应该使用virsh edit命令来修改,要修改domain(虚拟机)使用以下命令:


virsh edit myRHELVM1


9.连接虚拟机控制台

使用以下命令来连接虚拟机控制台,要退出控制台的话使用Ctrl+]


virsh console myRHELVM1


如果主机上没有安装X server并且网络也没有配置,那么只能通过连接虚拟机的串口控制来登录到虚拟机

配置虚拟机的控制台访问与配置一个物理主机没有什么区别,只需要为虚拟机增加合适的内核启动参数即可。

比如,对于一台RHEL虚拟机(或者CentOS虚拟机),增加以下内容到/etc/grub.conf文件中内核启动部分然后重启虚拟机:


console=tty0 console=ttyS0,115200


或者,也可以在/etc/grub.conf增加以下内容达到同样目的:


serial --unit=0 --speed=115200terminal --timeout=5 serial console


10.显示虚拟机信息

使用以下命令显示虚拟机的信息


# virsh dominfo myRHELVM1Id:             5Name:           myRHELVM1
UUID:           58083ae7-51db-50c3-64d8-bc4c49f642d0
OS Type:        LinuxState:          running
CPU(s):         2CPU time:       207.6sMax memory:     2097152 KiBUsed memory:    2097152 KiBPersistent:     yesAutostart:      disableManaged save:   noSecurity model: selinuxSecurity DOI:   0Security label: system_u:system_r:svirt_t:s0:c698,c788 (permissive)


11. 显示虚拟机内存和CPU使用情况

使用virt-top命令来显示虚拟机内存和CPU使用情况


# virt-topvirt-top 07:14:44 - x86_64 8/8CPU 1600MHz 32094MB3 domains, 2 active, 2 running, 0 sleeping, 0 paused, 1 inactive D:0 O:0 X:0CPU: 0.1%  Mem: 4096 MB (4096 MB by guests)   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME    5 R    0    0 1546    0  0.0  6.0   3:29.55 dev-dev-vm    8 R    0    0 1546    0  0.0  6.0   1:42.17 myRHELVM2    -

12. 启动、关闭以及重启虚拟机

使用virsh命令来启动、关闭以及重启虚拟机

使用下面命令关闭虚拟机:


# virsh shutdown myRHELVM1Domain myRHELVM1 is being shutdown


使用下面命令重启虚拟机:


# virsh reboot myRHELVM1


使用下面命令启动虚拟机,一旦虚拟机启动可以使用 virsh list –all 来查看所有运行中得虚拟机


# virsh start myRHELVM1Domain myRHELVM1 started