操作系统虚拟化之KVM

KVM(Kernel-based Virtual Machine)是一个全虚拟化的解决方案,它自2.6.20以后正式成为Linux内核的一部分,也就是说,它是Linux内核官方支持的一个虚拟化方案。KVM的硬件需求是CPU必须支持虚拟化,对于Intel CPU来说是Intel VT,AMD CPU则是 AMD-V。如何确定你的CPU支持硬件虚拟化呢?

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

vmx是Intel CPU的,svm则是AMD CPU的。我的CPU返回如下:

flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 
clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs 
bts rep_good pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 
xsave lahf_lm ida tpr_shadow vnmi flexpriority
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 
clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs 
bts rep_good pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 
xsave lahf_lm ida tpr_shadow vnmi flexpriority

在Ubuntu下面需要安装下面的软件:

sudo apt-get install kvm qemu-kvm

加入个人用户到kvm组,以保证个人用户可以读写/dev/kvm,否则,以个人用户无法运行kvm:

sudo adduser $USER kvm

如果想使用物理磁盘,则需要加个人用户到disk组:

sudo adduser $USER disk

现在最好重启一下计算机!

下面开始安装操作系统,我安装了Windows XP和Windows 7,下面以Windows XP为例开始安装。

先准备好一个磁盘文件,有2种常用的格式,一个是qemu的qcow2格式,一个是raw格式,前者是可以增长的文件格式,后者实际是磁盘上一个连续区域。

qcow2:

qemu-img create -f qcow2 winxp.img 10G

Raw:

dd if=/dev/zero of=winxp.img bs=1024K count=10000

下面开始安装,准备好安装光盘文件winxp.iso,下面是安装的指令:

kvm -m 1024 -cdrom=winxp.iso winxp.img -boot d -localtime

XP安装很快,20分钟左右就可以安装好,Win 7大约需要40分钟。下面开始以下后面的工作,会涉及更多的参数。

配置硬盘和网络的virtio模式,virtio是个半虚拟化的模式,速度比传统方式还要快些,根据Using virtio_net For The Guest NIC一文的测试,virtio还是很有优势的。

在虚拟机里面下载virtio windows guest驱动: Storage driverNetwork driver,其中已经包含了xp、win7等的驱动。

根据boot from virtio block device一文的介绍,用以下方式进行安装驱动。

建一个临时的磁盘文件:

qemu-img create -f qcow2 fake.img 1G

启动虚拟机:

kvm -drive file=winxp.img,if=ide,boot=on -drive file=fake.img,if=virtio -m 1024 
-localtime -net nic,model=virtio -net user -usb -usbdevice tablet

在启动的虚拟机里,会找到virtio设备,然后安装这两个驱动。安装完毕后,关机。以下面方式重新启动:

kvm -drive file=winxp.img,if=virtio,boot=on -m 1024 -net nic,model=virtio -net user 
-usb -usbdevice tablet -soundhw es1370

下面配置远程桌面对Windows的访问,首先需要在虚拟机的Windows里面开启远程桌面,而且必须给用户加上密码,Windows XP和Windows 7需要是Professional以上版本。然后运行mmc继续配置远程桌面访问参数。

打开mmc后,“添加/删除管理单元“ -> “添加” -> “组策略对象编辑器” -> “本地计算机”。在里面配置:“计算机配置” -> “管理模板” -> “Windows 组件” -> “终端服务” -> “限制最大颜色深度”,设置为24位,原来默认是16位。

关机,重新以可以以新的模式后台运行:

kvm -M pc -drive file=winxp.img,if=virtio,boot=on -localtime -m 1024 -soundhw es1370 
-net nic,model=virtio -net user -vnc 127.0.0.1:0 -daemonize -redir tcp:3389::3389 
-name WindowsXP -usb -usbdevice tablet

-vnc 127.0.0.1:0表示以vnc模式运行,-daemonize表示kvm以后台运行,-redir tcp:3389::3389表示将虚拟机的3389端口映射为宿主机的3389端口上,这样rdesktop本机就可以进行远程桌面访问了。如果想实时查看状态,可以使用vncviewer或者vinagre查看。

现在可以rdesktop进行访问了,下面是rdesktop的参数:

rdesktop localhost -u username -p password -f -D -z -P -r sound:local -clipboard

这里-z参数可以保证鼠标运行速度不缓迟,-f表示全屏。

虚拟机如何使用USB设备呢,首先要保证用户可以访问USB设备,qemu支持usb设备在虚拟机里面的拔插,在qemu界面里(或者vnc访问的界面里),Ctrl+Alt+2进入qemu monitor命令行控制模式,然后

usb_add host:vid:pid

查看usb设备:

info usb

Windows 7的运行和访问参数与Windows XP类似。

下面是我的一些截屏:

Windows XP:

Windows 7:

rdesktop 启用Windows 7字体平滑功能

rdesktop 连接上Windows 7以后,一般是不开启字体平滑功能,因此,字体不是特别好看,可以通过加入下面的参数来连接,就启用字体平滑功能了,而且原来的Win 7桌面也保留了,不像之前连接后出现的黑色桌面,还需要自己再设置下。

rdesktop localhost -x 0x80 -u username -p password -f -D -z -P -r sound:local -clipboard

主要是加入 -x 0x80 选项。