QEMU+Accelerator

QEMU刚刚发布的Accelerator带来了QEMU革命,它不再是一个性能低等的模拟器
使用Accelerator的QEMU速度一下提升了5倍之多。OSNews报道:
This means you could theoretically run Windows (or another OS) on
a Linux machine at near native speeds without buying a commercial emulator.
今天赶紧升了级,果然不同反响,安装了RHEL4,Win2k,速度很好,也没有以前版本分出大于2G空间
造成硬盘检查出错的问题了,在模拟的linux中进行危险试验爽多啦。 :)
QEMU安装也比win4lin/vmware简单,最主要QEMU是开源的,后两者都还需要序列号 :(
虽然Accelerator是专利产品,不过也是免费使用的,只是在分发上有一些限制.
总之是不错的东东喽,快试试吧!
不会装?不会用?看看我的安装,使用心得吧 ^_^
注意:该方法仅适用于2.6.x内核,2.4内核请查看QEMU安装文档。
QEMU有两种模拟方式:

1.完整的系统模拟:这种模式下,QEMU模拟一个完整的系统(比如说,整个PC),包括CPU和周边的计算机设备。你可以不必重启就可以同时运行不同的系统来调试系统代码。

2.User mode模拟(只能在Linux宿主机下使用):这种模式下,QEMU能够在Linux下运行从一个CPU到另一个CPU的编译过程。这通常可以被用来运行Wine模拟器或者是交错式的编译和调试。

这里只说模拟整个PC :)

首先先下载,编译,安装:
目前只有CVS版本的QEMU才可以使用Accelerator(加速器),所以需要编译。而其他版本的QEMU,可以直接下载binary的,在/下解压缩即可使用,十分方便。不象win4lin,vmware这些模拟器还需要给内核打补丁。而且还不是开源的,安装比较麻烦。(至少我没成功安装过它们两个)
不过目前binary还不能使用加速器,所以速度会慢很多。相信很快binary版本就会加入这个加速器啦。
毕竟加速器刚出来没几天,值得期待。。。。 ^_^
OK,言归正传,开始来编译,安装CVS版本的QEMU,并且加入Accelerator支持:
首先从 http://www.dad-answers.com/qemu/ 下载当前CVS版本的qemu
我的版本是:qemu-snapshot-2005-02-22_23.tar.bz2
再从 http://fabrice.bellard.free.fr/qemu/kqemu-0.6.2-1.tar.gz 下载回来加速器
注意:编译kqemu需要内核源码包,将与当前内核版本完全相符的源码包解压在/usr/src下
并且确保/lib/modules/uname -r/build是正确指向内核源码目录的,如下所示:
[root@LFS ~]#ls -l /lib/modules/2.6.10-lvm/build
lrwxrwxrwx 1 root root 21 Feb 22 12:50 /lib/modules/2.6.10-lvm/build -> /usr/src/linux- 2.6.10/
如果没有正确指向内核源码目录,使用ln -s 命令建立链接:
[root@LFS ~]#ln -s /usr/src/linux-2.6.10 /lib/modules/2.6.10-lvm/build
生成kqemu需要的内核源文件:
[root@LFS ~]#cd /usr/src/linux-2.6.10
/root ————> /usr/src/linux-2.6.10
[root@LFS linux-2.6.10]#make mrproper
确保内核源码纯净,保证kqemu编译出来可用。
[root@LFS linux-2.6.10]#cp /boot/config-2.6.10 .config
将当前内核配置文件复制过来
[root@LFS linux-2.6.10]#make scripts/
生成kqemu需要的东东,没有这步,编译就会出错。

做好后就可以开始编译QEMU了,使用如下命令编译,安装:
[root@LFS ~]#tar jxvf qemu-snapshot-2005-02-22_23.tar.bz2
[root@LFS ~]# tar zxvf kqemu-0.6.2-1.tar.gz -C qemu-snapshot-2005-02-22_23/
使用-C qemu-snapshot-2005-02-22_23/ 将kqemu解压到qemu的目录中,让qemu支持kqemu
[root@LFS ~]#cd qemu-snapshot-2005-02-22_23
/root ————> /root/qemu-snapshot-2005-02-22_23
[root@LFS qemu-snapshot-2005-02-22_23]#./configure
………..略
KQEMU module configuration: ———>表示加入kqemu支持
kernel sources /lib/modules/2.6.10-lvm/build
kbuild type 2.6
[root@LFS qemu-snapshot-2005-02-22_23]#make
[root@LFS qemu-snapshot-2005-02-22_23]#make install
这样,qemu就安装到了/usr/local下,所有可执行文件在/usr/local/bin下,如果想安装到/usr:
[root@LFS qemu-snapshot-2005-02-22_23]#./configure –>./configure –prefix=/usr

安装好后,kqemu模块安装在: /lib/modules/2.6.10-lvm/misc/kqemu.ko
并且安装脚本会自动在/dev/下创建一个kqemu设备:
[root@LFS linux-2.6.10]#ls -l /dev/kqemu
crw-rw-rw- 1 root root 250, 0 Feb 24 2005 /dev/kqemu
[root@LFS linux-2.6.10]#
加载kqemu模块:
[root@LFS linux-2.6.10]#modprobe kqemu
[root@LFS linux-2.6.10]#
使用lsmod命令检查:
[root@LFS linux-2.6.10]# lsmod |grep kqemu
kqemu 41864 0
[root@LFS linux-2.6.10]#

如果你发现重启后/dev/kqemu消失了,需要重新创建它:
[root@LFS linux-2.6.10]#mknod /dev/kqemu c 250 0
[root@LFS linux-2.6.10]#chmod 666 /dev/kqemu
你可以将上面两行命令加入到系统的启动脚本中,例如/etc/rc.d/rc.local
还有上面那个modprobe kqemu也一并加进去吧(如果你想每次系统启动自动加载kqemu模块)
注意的是,加到/etc/rc.d/rc.local时,命令最好写绝对路径,例如/sbin/modprobe

OK,现在QEMU,Accelerator都已经安装完成,可以开始安装OS啦。
这里我以安装RHEL4为例说一下qemu的基本用法,非常简单!

首先创建磁盘镜像文件:
[root@LFS distro]#qemu-img create redhat.img 6G
Formating ‘redhat.img’, fmt=raw, size=6291456 kB
[root@LFS distro]#
这样就创建好了一个名为redhat.img的6G磁盘镜像 。
注意:创建的磁盘镜像文件大小最好小于你实际分区剩余空间。

开始安装RHEL4:
[root@LFS ~]#qemu -boot d -cdrom /rhel4/EL_disc1.iso -hda redhat.img –enable-audio
-boot d :从光驱引导 a(软盘引导) c(硬盘引导) d(光驱引导)
-cdrom : ISO文件,也可以直接使用光驱设备(/dev/cdrom)…别忘了插入光盘 :)
-hda : 就是虚拟机里的硬盘啦,也就是刚才qemu-img创建出的东东。
-enable-audio : 声卡支持

安装过程中,要求换盘:
在qemu中按ctrl+alt+2切换到qemu monitor模式 输入?help可以查看可用命令及使用说明。
(在其他版本的qemu中,运行qemu加载OS后,这个shell就会自动变成qemu monitor模式)
change device filename – change a removable media
看来它就是用来换盘的了 : change cdrom /rhel4/EL_disc2.iso

monitor下还有几个常用的命令:
savevm filename 将整个虚拟机当前状态保存起来
loadvm filename 恢复 (最初我没用change换盘时,就是先savevm->重新运行qemu->loadvm :( )
sendkey keys 向VM中发送按键,例如你想在虚拟机里切换到另一个终端,按下了ctrl-alt-F2
不幸的是,切换的却是你的主系统,所以就需要用 sendkey了 sendkey ctrl-alt-f2
还有其他几个命令,自己看看啦。

经过N久终于装好了,现在可以启动试试:
[root@LFS distro]#qemu redhat.img -enable-audio -user-net -m 64
-user-net 相当于VMware的nat,主系统可以上,虚拟机就可以
-m 64 使用64M内存,缺省下使用128M

ctrl-alt-f 全屏
ctrl-alt 主机/虚拟机鼠标切换
qemu还有一些其他参数,输入qemu可以查看其相关说明。

Good Luck ! ^_^

相关资源:
http://fabrice.bellard.free.fr/qemu/
qemu 主页 download,doc,faq….etc
http://www.dad-answers.com/qemu/
QEMU CVS Snapshot版本和一些有用的QEMU外围支持工具
http://www.dad-answers.com/qemu-forum/
qemu论坛

QEMU网络配置

qemu两种上网方式: user mode network :
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数,虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。
tap/tun network :
这种方式要比user mode复杂一些,但是设置好后 虚拟机<–>互联网 虚拟机<–>主机 通信都很容易
这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增加一块虚拟网络设备(tun0),然后就可以象真实网卡一样配置它.
首先内核中支持tap/tuns设备:
Device Drivers —>
Networking support —>
[M] Universal TUN/TAP device driver support
如果当前内核没有支持,可以重新只编译相应模块加入,方法很简单:

将当前内核配置文件cp到内核源码目录下:
[root@LFS ~]#cp /boot/config-[kernel-version] /usr/src/linux
[root@LFS ~]#cd /usr/src/linux
配置内核,将TUN/TAP选择模块(M),如上所示:
[root@LFS ~]#make menuconfig
重新只编译模块(M),不编译核心(*)支持的东东:
[root@LFS ~]#make modules
编译好后在/usr/src/linux/drivers/net下可以找到tun.ko:
[root@LFS net]#ls -l /usr/src/linux/drivers/net/tun.ko
-rw-r–r– 1 root root 11116 Mar 23 20:29 /usr/src/linux/drivers/net/tun.ko
[root@LFS net]#
将它cp到当前内核的模块目录的相应位置:
[root@LFS net]#cp /usr/src/linux/drivers/net/tun.ko /lib/modules/uname -r/kernel/drivers/net
重新建立模块依赖关系:
[root@LFS net]#depmod
现在就可以加载它了 :
[root@LFS net]#modprobe tun
检查一下:
[root@LFS net]#lsmod |grep tun
tun 8704 0
[root@LFS net]#
OK. 成功不重新编译整个内核加入特殊模块支持 如果你的xx卡不被内核支持,又可以编译成模块,自己怕重新编译内核后出问题就可以用这个办法只编译自己需要的模块,然后手动安装到相应位置,再加载它。
这样编译速度要也比编译整个内核快,不会对系统有任何损害,就可以使用上XX卡喽。^_^
要注意三点:
1.内核源码必须与当前内核版本完全一致,否则编译出的模块是不能用的。
2.注意只make modules(编译模块),没有make modules_install(自动安装模块到/lib/modules下)
3.加载新编译的模块前必须先运行 depmod,否则modprobe找不到它
其实使用当前内核配置文件(/boot/config-[kernel-version]),只加入自己需要的模块,不做任何其他改,make modules_install应该也不会有问题的。
不过最稳妥的办法还是手动安装它,控制权在自己手里更踏实嘛 :-)

OK,转回qemu上网问题 :)

如果使用udev管理设备(通常2.6.x内核的发行版都已经使用udev),当modprobe tun后就会自动建立/dev/net目录,并创建出tun设备,做好相关链接:
[root@LFS net]#ls -l /dev/net/tun
lrwxrwxrwx 1 root root 6 Mar 25 15:35 /dev/net/tun -> ../tun
[root@LFS net]#

如果很不幸,你没看到它,就需要自己手动做这些工作了 :(
[root@LFS ~]#mkdir /dev/net
[root@LFS ~]# mknod /dev/net/tun c 10 200
OK,相关设备已经准备好了,还需要一个tun/tap的初始化脚本 :
/etc/qemu-ifup :

#!/bin/sh
/sbin/ifconfig $1 172.20.0.1
再给予qemu-ifup x执行权限放在/etc下就可以了。
这个脚本只能root用户执行,如果需要普通用户使用qemu,就需要改成sudo /sbin/ifconfig …..再设置sudo相关权限。
启动qemu后,它会在主机上增加一块虚拟网络设备(tun0):
[root@LFS ~]# ifconfig tun0
tun0 Link encap:Ethernet HWaddr 0A:D3:8A:5D:97:CD
inet addr:172.20.0.1 Bcast: 172.20.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@LFS ~]#
现在就可以启动qemu配置虚拟机网络参数了,和vmware host-only一样:
ip与tun0相同网段,gateway为tun0 ip 其余参数与tun0相同,dns与主机相同:
tun0 : ip :172.20.0.1 broadcast: 172.20.255.255 netmask :255.255.0.0
qemu : ip :172.20.0.100 broadcast:172.20.255.255 netmask :255.255.0.0 gateway:172.20.0.1

与host-only一样,这样只实现了虚拟机<—->主机间通信,还需要设置router,nat才可以连上互联网
[root@LFS ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@LFS ~]#iptables -t nat -A POSTROUTING -o eth0 -s 172.20.0.0/24 -j MASQUERADE
[root@LFS ~]#