Posted by Stephen on 5 September 2009, 2:23 pm http://lug.ustc.edu.cn/stephen/?tag=kvm
配置双系统同时工作
本文涉及的技术细节并不多,主要记录的是我在配置系统过程中各种选择的理由,还有我碰到过的问题。本文并没有给出完整的安装kvm的步骤,可以参见问候给出的参考资料,以获取更详细的信息。
选择配置方案
实验室有了新机器,配置很不错,Core2 Due E8200 CPU、4G内存、500G硬盘,现在的主流操作系统无论跑哪个都有些浪费。而且我对Windows和Linux两个系统都有需求,如果安装双系统,不仅切换麻烦,而且同时只能运行一个,同样存在上述浪费资源的问题,因此虚拟机成了最佳选择。
选择系统和虚拟机
首先是选择系统,Linux肯定首选Debian,一者我用习惯了,二者我的大研项目跟Debian有关。Windows的选择,一开始有些犹豫,想体验一下Win7,但如果双系统同时运行,Win7还是太耗资源,试用一段时间的感受是,很豪华,功能很强大,但相比xp多出的那些功能,我基本都不需要,我只要聊天软件、Office、VS就行了,因此选择了轻量级的XP。对于虚拟机的选择,以前用过VMWare和VirtualBox,qemu也用过,它们的优点是跨平台,主机可以使Win也可以是Linux,缺点是这些虚拟机本身太耗资源,而且不能后台运行,不方便。所以我选择了kvm,kvm对于图形的支持很差,但对于磁盘、内存和CPU的利用率是其他虚拟机无法比拟的。这也因此决定了我选择Debian为宿主机,而XP安装在虚拟机里。主机选择linux桌面的另一个原因是,我习惯了多虚拟桌面的工作,Windows只有一个桌面,虽然有插件可以支持多虚拟桌面,但的切换都不方便,快捷键不能自定义,这是选择Debian作为宿主机的另一个主要原因。
选择kvm的另一个主要原因是kvm可以在后台运行,如果我以Daemon方式启动kvm之后,即使我重启主机的桌面,kvm会继续在后台运行而不受影响,同时我不使用xp时,不占用我桌面空间。平时可以使用rdesktop远程连接到虚拟机中的xp进行使用,比如我现在就是远程桌面到xp,使用google doc写这篇文章。
选择虚拟机硬盘
KVM一个很强大的地方是,可以把主机硬盘给虚拟机用,比如我实验室的一个小弟机器上装了双系统,在linux下用kvm -hda /dev/sda就可以把硬盘上的xp启动起来。起初我也想这样,因为windows的分区在linux下可以自由挂载,双系统共享文件很方便。然而这样做的缺点是,分区大小固定,500G的空间无法有效的、灵活的在双系统之间分配。因此我还是选择把xp装在镜像文件中,镜像文件的好处是,用多少,就只占实际空间的多少。kvm有很多种镜像格式可选,最初我选择qcow2,因为它的大小是灵活可变的,然而发现双系统共享文件不方便,只能通过网络(samba或者rdesktop远程时附带磁盘),传输文件速度太慢,而且要共享文件,必须双系统都开着。于是改用raw格式。最初以为raw格式变的,后来发现其实是可变的,并且它的好处可以直接用mount挂载。两个磁盘镜像:
$ ls -lh *.raw
-rw-r–r– 1 stephen stephen 100G 2009-09-05 12:49 winxp.raw
-rw-r–r– 1 stephen stephen 300G 2009-09-05 12:49 xpdata.raw
虽然见到的两个镜像有400G,但实际上只占用了很小的空间。创建镜像的命令:
$ kvm-img create -f raw winxp.raw 100G
挂载镜像的命令:
#mount -o loop,offset=32256 winxp.raw /mnt
因为需要经常挂载(在win下下电影,linux下看),所以可以alias一下,在~/.bashrc中加入这一行:
alias mountraw=’sudo mount -o loop,offset=32256,uid=1000′
其中uid可以通过如下命令得到:
$ id -u
其含义为挂载为你的用户所有,这样可以直接操作该挂载目录,而不需要root。
备注:这里,我一个磁盘镜像中只分了一个分区,ntfs格式。从网上搜到的信息看,似乎这样mount只能挂载镜像中的第一个分区,我没有尝试过挂载多分区的镜像,如果读者有需求,请自行上网搜索解决方案。另外,如果镜像分区是ntfs的话,读者还需要安装ntfs-3g。
虚拟机网络选择
kvm支持多种网络模式,我主要使用了两种,NAT和桥接,NAT方式不需要额外的配置,只要在kvm的启动参数中加入:
-net nic -net user
桥接方式比较麻烦,首先是配置/etc/network/interfaces(只贴出了相关部分):
auto eth0
iface eth0 inet static
address 1.0.0.200
netmask 255.255.255.0
gateway 1.0.0.3
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user stephen #stephen为笔者的用户名
auto br0
iface br0 inet static
bridge_ports eth0 tap0
address 1.0.0.200
netmask 255.255.255.0
gateway 1.0.0.3
bridge_maxwait 0
eth0和br0都可以使用dhcp方式。
在kvm的启动参数中加入如下行:
-net nic,vlan=0,macaddr=12-65-de-ac-34-87 \
-net tap,vlan=0,df=h,ifname=tap0,script=no
其中macaddr自己随便设置。默认情况下使用tun设备需要root权限,可以把你的用户加入uml-net组即可无需root权限:
adduser `whoami` uml-net
备注:你需要安装bridge-utils和uml-utilities这两个包。
我原本使用NAT方式,因为配置方便,但缺点是此方法虚拟机中无法使用IPv6,所以我首选了桥接,只是在安装虚拟机系统时使用NAT。
使用USB设备
使用USB设备稍有些麻烦,网上查到的资料不多,只是说用-usbdevice host:xxxx:xxxx即可,然而kvm总是报告无法加载usb设备。起初没有意识到问题所在,后来想到了vbox的usb设备问题,于是尝试了同样的方法,解决了。(此法跟具体的linux发行版以及版本有关,我的是Debian Squeeze)。首先建立Usbfs组(祖名其实可以随便取),并把自己加入该组:
#groupadd usbfs
#adduser `whoami` usbfs
查看/etc/group,获得该组的gid,我的是1001,然后在/etc/fatab中加入以下这行:
none /proc/bus/usb usbfs devgid=1001,devmode=664 0 0
然后即可通过host:xxxx:xxxx挂载usb设备了,具体方法参见文后给出的参考资料。
使用虚拟机
首先给出启动虚拟机的命令:
$ kvm \
-M pc \
-localtime \
-vnc 127.0.0.1:0 \
-drive file=winxp.raw,index=0,media=disk \
-drive file=xpdata.raw,index=1,media=disk \
-usb -usbdevice tablet \
-drive file=winxp.iso,index=2,media=cdrom \
-smp 2 \
-m 1536 \
-soundhw all \
-boot c \
-daemonize \
-net nic,vlan=0,macaddr=12-65-de-ac-34-87 \
-net tap,vlan=0,df=h,ifname=tap0,script=no
其中相关参数的含义请参考man kvm-qemu,并且文后的参考资料中也都有相关的解释。
虚拟机使用daemon方式启动,在启动好之前,由于没有网络,可以用vncviewer连接操作:
vncviewer 127.0.0.1:0
启动完成后,我在虚拟机中式手工指定ip的,所以可以用rdesktop连接:
$ rdesktop 1.0.0.199 \
-a 24 \
-u stephen \
-sound:remote \
-f
其中要使用24位色连接,需要修改xp的组策略,Start–>Run–>gpedit.msc–>Administrative Templates–>Windows Components–>Terminal Services,修改右边的Limit maximum color depth。
sound使用remote,因为remote和local是在同一台电脑上,所以效果是一样的,但如果指定了local,那么把rdesktop关闭之后就没有声音了,所以选择了remote。-f是全屏,也可以使用-g 1280×800等,笔者显示器比较大,而且有一个“扩展”显示器,所以就全屏使用了。如果需要在双系统之间随时切换,而不想关闭rdesktop,可以设置一个稍小的分辨率。另外,如果要共享剪切板,读者还需要设置-clipboard参数,具体请参考man rdesktop。
最后给出我使用虚拟机的脚本(稍有修改):
$ cat .bin/vm
#! /bin/bash
## start kvm
## author : stephen
## scheme
winxp(){
cd ~/vm/winxp
DISK=”winxp.raw xpdata.raw”
CD=”winxp.iso”
LC_NET=”-net nic -net user”
BR_NET=”-net nic,vlan=0,macaddr=12-65-de-ac-34-87 -net tap,vlan=0,df=h,ifname=tap0,script=no”
NET_TYPE=”br”
SMP=2
MEM=1536
SOUNDHW=”all”
BOOT=”c”
DAEMON=”true”
USB=”tablet”
}
rdesk(){
echo “rdesktop 1.0.0.199 -a 24 -u stephen -sound:remote -f” #-g 1280×800″
nohup rdesktop 1.0.0.199 -a 24 -u stephen -sound:remote -f & #-g 1280×800 &
}
if [[ $# -eq 0 ]]; then
## default xp scheme
winxp
fi
## test if kvm and rdesktop is already started
KVM_PID=`pidof kvm`
RDESK_PID=`pidof rdesktop`
if [[ -n "$KVM_PID" ]]; then
echo “kvm already started, pid: $KVM_PID”
[[ -n "$RDESK_PID" ]] && echo “rdesktop already started, pid: $RDESK_PID” && exit 0
rdesk && exit 0
fi
KVM_PARAM=”-M pc”
KVM_PARAM=”$KVM_PARAM -localtime”
#KVM_PARAM=”$KVM_PARAM -redir tcp:3389::3389″
KVM_PARAM=”$KVM_PARAM -vnc 127.0.0.1:0″
index=0
for disk in $DISK
do
[[ $index -eq 4 ]] && echo “too many disks!” && exit 1
KVM_PARAM=”$KVM_PARAM -drive file=${disk},index=${index},media=disk”
index=$(($index + 1))
[[ $index -eq 2 ]] && [[ -n "$CD" ]] && index=3
done
[[ -n "$USB" ]] && KVM_PARAM=”$KVM_PARAM -usb”
for usb in $USB
do
KVM_PARAM=”$KVM_PARAM -usbdevice $usb”
done
[[ -n "$CD" ]] && KVM_PARAM=”$KVM_PARAM -drive file=$CD,index=2,media=cdrom”
[[ -n "$SMP" ]] && KVM_PARAM=”$KVM_PARAM -smp $SMP”
[[ -n "$MEM" ]] && KVM_PARAM=”$KVM_PARAM -m $MEM”
[[ -n "$SOUNDHW" ]] && KVM_PARAM=”$KVM_PARAM -soundhw $SOUNDHW”
[[ -n "$BOOT" ]] && KVM_PARAM=”$KVM_PARAM -boot $BOOT”
[[ $DAEMON = "true" ]] && KVM_PARAM=”$KVM_PARAM -daemonize”
[[ $NET_TYPE = "br" ]] && KVM_PARAM=”$KVM_PARAM $BR_NET” || KVM_PARAM=”$KVM_PARAM $LC_NET”
echo “kvm command:”
echo “kvm $KVM_PARAM”
kvm $KVM_PARAM
使用该脚本,调用时会自动判断kvm是否已经启动,若没有则启动kvm,若已启动,则调用rdesktop连接。当然,如果有多个虚拟机,可以通过命令行参数进行选择,相关代码读者如果有需求可以自己写,笔者的脚本已经为此预留了修改空间。
关于“扩展”显示器
其实我没有两个显示器,我指的是我的笔记本,因为笔记本显然不能作为扩展显示器用嘛,所以加上了引号。但我让它具有了相似的效果。如何使用的呢?首先由两种模式。
当我主要在Debian上工作时,就在我的笔记本上用rdesktop连接到虚拟机中的xp使用。这样双系统之间不需要切换,转个身就行了。
当我主要在winxp下工作时,就在台机上用rdesktop连接xp用,而要用其上的Debian时,并不切换系统,而是在笔记本上用XDMCP远程桌面连接到台机上的Debian。
这两种方法,我的笔记本上的系统都没有直接被使用,只不过是个底层的框子而已,所以说相当于一个“扩展”显示器。笔记本的配置实在太低,用起来太慢了……
以上基本就是我的双系统的相关配置。读者如果感兴趣,也可以尝试一下。相关的参考资料:
http://forum.ubuntu.org.cn/viewtopic.php?t=120857
http://wiki.ubuntu.org.cn/UbuntuWiki:Kvm/zh
http://wiki.ubuntu.org.cn/Kvm_网络桥接方案
笔者基本是按照上述文章进行安装盒配置,只是某些部分根据自己的实际需求进行了配置。
=======================================================
黑传说补充:
1、网络部分,可以使用vde(虚拟分布式局域网)实现多台虚拟机平行
2、虚拟机的管理,可以使用virtmanager,ovirt不知道效果如何
3、图形性能,可以使用spice加强。
4、作为桌面用户,把视窗安装到真机上是有很多好处的, 比如如果哪天想要玩视窗下的游戏,就不用重新装系统了;另外,因为数据盘已经单独分出来了,那么,视窗系统盘其实不需要那么大,也就不太需要想办法去增大或者缩小了这个硬盘分区空间大小了;还有,一些笔记本的电源管理和显卡驱动在linux下是软肋,也可以临时换到视窗下搞定。