打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[一真一虚]配置双系统同时工作
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下是软肋,也可以临时换到视窗下搞定。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
终于成功KVM ON KVM
KVM: 安装Windows virtio半虚拟化驱动
KVM安装2003问题
虚拟机体验之 VirtualBox 篇
KVM系统之间通过KVM IP网关实现KVM系统的互联互通
爱快KVM虚拟化安装Openwrt虚拟机配置教程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服