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相关工具包,他们可以帮助管理系统上的虚拟机
#
下面是系统上将要安装的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服务器(exceed
、reflectionX
或其它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