LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 14895|回复: 46

[LFS 幻想系列] QEMU 的安装以及使用。

[复制链接]
发表于 2006-4-17 19:40:37 | 显示全部楼层 |阅读模式
使用的原因:

  • 不想用 VMWare。
  • Xen 中不能用 VMWare。
  • VMWare 太大,而且网络设置的网桥设置很不爽,其他的方式也不喜欢。
  • VMWare-tools 太麻烦了。
  • 偶是 BT,天才 DBT。


安装中,我选用 TAP 网卡模式,如果是 user net 的话,可以忽略所有的网卡设置,包括 Bridge 等。
QEMU 支持USB(不完全支持),支持声卡。很方便。

说明一下我的配置环境:
系统:CLFS x86 32Bit
内核:Kernel 2.6.16.5
防火墙:关闭。(避免受到影响)

软件下载:
qemu-snapshot-2006-04-14_23:
http://qemu.dad-answers.com/download/qemu/

kqemu-1.3pre5:
http://fabrice.bellard.free.fr/qemu/download.html



1. 安装。

安装 qemu-
# 去掉HTML格式的帮助文件的安装。因为我没有需要的 texi2html。不过仍然可以 man qemu。
[PHP]sed -i -e '/texi2html/s:.*:\techo &:g' \
         -e '/install -m 644 qemu-doc.html/s:.*:\techo &:g' Makefile
[/PHP]
要指定 gcc 编译。因为我的 gcc 默认是 4.1.0,QEMU 不能正确得编译。
[PHP]./configure --prefix=/usr --enable-alsa --enable-system --enable-user --cc=i686-pc-linux-gnu-gcc-3.3.6  --host-cc=i686-pc-linux-gnu-gcc-3.3.6
make
make install[/PHP]

安装内核加速器 kqemu,这里不需要指定gcc,gcc 要和你编译内核的版本一样。加入加速器支持。这样可以明显加快处理速度。
[PHP]./configure && make && make install[/PHP]

2. 配置。

[PHP]内核:
        要选上 TUN/TAP 和 Bridge,以及VLAN。
        CONFIG_TUN=y
        CONFIG_BRIDGE=y       
        VLAN_8021Q=y
[/PHP]
配置加速器的设备文件:
        LFS 的:
                [PHP]
/etc/sysconfig/create 加入
    /dev/kqemu dev 0666 root users char 250 0
/etc/sysconfig/modules 加入
    kqemu[/PHP]
        其他的想办法每次启动运行以下命令:
                [PHP]modprobe kqemu
                mknod -m 666 /dev/kqemu c 250 0[/PHP]
               
sudo 设置,这个是一个非常低的安全设置,自己调整!:
        允许用户创建 tapX,visudo 后加入:
[PHP]Cmnd_Alias  QEMU=/sbin/ifconfig, /sbin/modprobe, /sbin/brctl
ALL ALL=NOPASSWDEMU[/PHP]


Bridge 的创建:
这里推荐使用 6 楼 Lolita 给出的脚本,更方便。加入那个脚本后,就可以开始 Windows 安装了。

        要先创建一个 bridge,并且设置 IP。(暂时手动进行。)
        [PHP]#!/bin/bash
        MYBR="emu0"
        MYBR_IP="192.168.0.2"
        brctl addbr $MYBR       
        brctl stp $MYBR off
        ifconfig $MYBR "${MYBR_IP}" netmask 255.255.255.0
        ifconfig $MYBR up[/PHP]

        创建 /etc/qemu-ifup,供 qemu 程序使用:
[PHP]        #!/bin/bash
        #$1 is the ethernet(usually tapX)
        MYBR="emu0"
        MYBR_IP="192.168.0.2"
        echo "Executing /etc/qemu-ifup"
        echo "Bringing up $1 for bridged mode..."       
        sudo /sbin/ifconfig $1 0.0.0.0 promisc up
        echo "Adding $1 to $MYBR..."
        sudo /usr/sbin/brctl addif $MYBR $1
        sleep 1[/PHP]
        记得执行 chmod +x /etc/qemu-ifup


2. 安装 Windows。

# 创建一个 16G 大小的硬盘,sparse的,不占用多余的硬盘空间。
qemu-img  create -f raw ~/VM_Image/qemu_Win2K 16G

安装 Windows的时候:
如果是 Win2K ,不要开加速器,不然黑屏;记得加上 -win2k-hack,XP 和 2003 都不需要这个。
如果是 WinXP,第一次重启后可以用加速器
如果是 Win2003,全程可以用加速器
如果是 Win2003,那么请用 -net nic,model=rtl8139 代替 -net nic。(感谢Lolita 提供)
如果是 XP 或者 2003,那么请用 -soundhw es1370 代替 -soundhw all。(感谢 Lolita 提供)
我的机器很奇怪,如果用256,就会死机。所以我用 -m 128。另外,64/128/192/512 等也没此问题。
如果用的是实际的 CD 安装,那么用 -cdrom /dev/hdX 就可以了。很方便。ISO 文件的话,用 -cdrom /xxx/abc.iso。


# 加速器选择参数:-no-kqemu 或者 -kernel-kqemu。

安装 Windows,用这个命令:
[PHP]qemu -no-kqemu -localtime -m 128 -k en-gb -soundhw all -usb         -net nic -net tap -cdrom /winiso/Win2000_SP4.iso -win2k-hack -boot d -hda ~/VM_Image/qemu_Win2K[/PHP]

# 第一次重启后,改变启动顺序。如果是Win2K,可以去掉 -win2k-hack了(有人反应会把虚拟磁盘占满,为了保险可以保留这个参数)。
[PHP]qemu -kernel-kqemu -localtime -m 256 -k en-gb         -soundhw all -usb         -net nic -net tap -cdrom /winiso/Win2000_SP4.iso -boot c -hda ~/VM_Image/qemu_Win2K[/PHP]

3. 运行 Windows。

#使用加速器:
[PHP]qemu -localtime -m 64 -k en-gb -soundhw all -usb -kernel-kqemu -net nic -net tap -boot c -hda VM_Image/qemu_Win2K[/PHP]

#不用加速器:
[PHP]qemu -no-kqemu -localtime -m 128 -k en-gb -soundhw all -usb         -net nic -net tap -boot c -hda qemu_Win2K[/PHP]

使用加速器后,速度快如飞!安装Win2K3,一个小时搞定。


注意事项:
1. 因使用了TAP,guest 可以很方便的使用主机上各种服务,比如 Samba / FTP / Web 代理 等。

2. 如果只有一块网卡的话,那么 Bridge 的时候有点麻烦,会断开网络的。这个要根据实际情况决定如何解决。
这里我给出一个简单的方法,虽然不一定是最好的。用 dummy 网卡模拟一个虚拟网卡,用来和主机通讯。

可以考虑把这些加入脚本,每次启动都运行。
1. 在 /etc/modprobe.conf 里边加入 alias dummy0 dummy
2. 加载模块,运行:modprobe dummy0
3. 运行 ifconfig dummy0 看看是否成功加载。
4. 把 dummy0 加入 bridge。
[PHP]ifconfig dummy0 0.0.0.0 promisc arp up
brctl addif emu0 dummy0
[/PHP]
这样的话,guest 就可以跟客户机通讯了。

LFS 的用户,可以用这个方法来修改你的网络配置,请看:
http://wiki.linuxfromscratch.org ... NetworkingUtilities
是我写的,测试通过。

3. 如果客户机需要上网,主机作 NAT 用 MASQUARADE 比较方便。也可以开代理。最简单的方法(记得把eth0 换成连接Internet 的接口):
[PHP]
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
[/PHP]
4. 如果2个实例一起开启的话,MAC 地址是一样的。启动参数中要定义 -net nic,macaddr=addr。比如:
[PHP]qemu -localtime -m 192 -k en-gb -soundhw all -usb -kernel-kqemu -net nic,macaddr=52:54:00:12:34:01,model=rtl8139 -net tap -boot c -hda VM_Image/qemu_Win2003[/PHP]

5. 内核版本有改动的时候 (如升级),一定要重新编译 kqemu,而且记得是要运行configure命令,不然一启动QEMU就死机。我的系统死了N次才发现:(。
[PHP]make clean && ./configure && make && make install && depmod -ae
rmmod kqemu && modprobe kqemu
[/PHP]

6. Udev 的设置。
如果你的系统是用 udev 来建立程序的,那么需要设置一下tun 和 kqemu的权限。
创建 /etc/udev/rules.d/98-qemu.rules 并且加入:

[PHP]
KERNEL=="tun",       NAME="net/%k", GROUP="users", MODE="0660"
KERNEL=="kqemu",  NAME="%k", GROUP="users", MODE="0660"
[/PHP]

/etc/modprobe.conf 中加入
[PHP]
options kqemu major=0
[/PHP]

然后运行 depmod -ae && rmmod qemu && modprobe qemu,看看 /dev/kqemu 文件的权限是否正确。


Changelog:
2006-04-18
--加入 2003 的声卡支持。
--加入防火墙说明。
--加入内核变动说明。
2006-04-19
--加入 udev 配置说明。
--进行整理,加强可读性。
--加入 CDROM 的访问方法。
--加入 XP 安装窍门。
2006-04-20
--改善 /etc/qemu-ifup 脚本。由 Lolita 提供,在此感谢。
--进行整理,加强可读性。
2006-04-23
--加入软件版本说明以及下载地址。感谢 utstart 指出。
--加入上网设置。用 iptables 的 MASQUARADE 方式。

转贴请保持完整。

By 终极幻想@LinuxSir.Org
发表于 2006-4-17 20:45:36 | 显示全部楼层
怒赞!真是好教材啊!

感谢终极兄手把手的教诲~
回复 支持 反对

使用道具 举报

发表于 2006-4-17 21:11:34 | 显示全部楼层
精华!非常详细啊.
回复 支持 反对

使用道具 举报

发表于 2006-4-18 18:32:07 | 显示全部楼层
Post by 终极幻想
使用的原因:

  • 不想用 VMWare。
  • Xen 中不能用 VMWare。
  • VMWare 太大,而且网络设置的网桥设置很不爽,其他的方式也不喜欢。
  • VMWare-tools 太麻烦了。
  • 偶是BT!



qemu+grdesktop , 真是棒极了,vmware+vmtools可以扔掉了。
回复 支持 反对

使用道具 举报

发表于 2006-4-18 19:21:10 | 显示全部楼层
Great!

印像中,好像哪位在软件版说个用 gcc-4 成功过。
回复 支持 反对

使用道具 举报

发表于 2006-4-20 02:23:55 | 显示全部楼层
对于用桥接(bridged)方式提供网络接口的,我写了个脚本,第一次启动qemu时将自动建立一个虚拟以太网桥并把一个以太接口接到网桥上, 之后每创建一个qemu-machine就自动生成一个以太接口并自动接入到网桥上。这样就可以省得每次手动创建了。

本脚本基于终极幻想的思路 :)

[PHP]
#!/bin/bash
# ------------------------------------------------------
# author:         Lolita@linuxsir.cn based on
#                终极幻想@linuxsir.cn 's idea
# date:                2006.04.20, small hours
# script name:         /etc/qemu-ifup
# description:        This script will be executed automatically
#                when a qemu-machine instance is created.
# note:                $1 is an ethernet interface usually tapX ,
#                where X is 0, 1, 2, etc.
# -------------------------------------------------------
# Let the fun begin ^_^
#-----------------------

echo
echo "Executing /etc/qemu-ifup ... "

virtual_bridge="vbr0"
virtual_bridge_ip="192.168.1.1"

## if a virtual bridge is not found, create it.
if [ ! "$(sudo /sbin/ifconfig | grep $virtual_bridge )" ]; then
if [   "$(sudo /sbin/ifconfig | grep $virtual_bridge_ip )" ]; then
        echo "IP $virtual_bridge_ip has been occupied by other interfaces. "
        echo "Virtual bridge cannot be created !"
        exit 1
else
        ## add a virtual bridge
        sudo /sbin/brctl addbr $virtual_bridge
               
        ## turn off the spanning tree protocol, if there is
        ## only one bridge in your net and no loop topology.
        sudo /sbin/brctl stp $virtual_bridge off
       
        ## config this bridge interface
        sudo /sbin/ifconfig $virtual_bridge $virtual_bridge_ip netmask 255.255.255.0
        sudo /sbin/ifconfig $virtual_bridge up
       
        echo "Bringing up bridge $virtual_bridge with IP $virtual_bridge_ip ... done"
        sleep 1
fi
fi


sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Bringing up ethernet interface $1 to promiscuous mode ... done"

sudo /sbin/brctl addif $virtual_bridge $1
echo "Attaching $1 to bridge $virtual_bridge ... done"

sleep 1

## end of script
[/PHP]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-20 03:51:10 | 显示全部楼层
非常感谢。:)。加入文章中。。


对了,Lolita,这样安装 XP 的话,可以用加速器,速度快很多。
[PHP]第一次重启的时候,改变启动顺序,并且加入加速器支持。这样可以明显减少所需时间(XP测试通过)
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-4-20 07:16:07 | 显示全部楼层
甚好!否则我装个XP至少3个小时,花儿都凋谢了 :S
回复 支持 反对

使用道具 举报

发表于 2006-4-22 19:33:20 | 显示全部楼层
我的系统是ubuntu-amd64位,老提示qemu: invalid option -- '-kernel-kqemu'
。难道64位的不支持kqemu吗?但是configure是提示kqemu是支持的。
回复 支持 反对

使用道具 举报

发表于 2006-4-22 20:01:19 | 显示全部楼层
好东西,一定要顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表