LinuxSir.cn,穿越时空的Linuxsir!

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

qemu安装及配置网络

[复制链接]
发表于 2006-8-2 14:37:31 | 显示全部楼层 |阅读模式
最近改一些客户端的项目,测试的时候需要使用windows,因为是windows的客户软件,所以不得不使用windows, 原来总是在我的debian上安装vmware, 自从升级内核到2.6.17后,发现怎么安装vmware都有问题, 就比较烦,原来看到过华华说过qemu,0.8.1的时候安装过一次,感觉不是太理想,尤其是sdl的屏幕造成鼠标拖动很慢, 去主战的forum里看了看,发现这个已经被patch掉了。
而且kqemu又到了pre9了。正好试一下。

说一下目的:
安装qemu和kqemu, 配好网络。实现virtual machine 和 host 能够互通,也就是不是使用默认的user模式。 而改使用tun/tap的模式。

这里有两个要求:
第一:内核要支持network filter.  尤其要用到的是nat.
第二:内核要支持tun/tap模块。

我的是debian,自己编译的内核,所以在编译的时候就已经弄好了,由于我从来不用官方的内核,所以我就不知道debian的管方内核是不是已经有了。
不过可以自己看一下。
iptables的支持是不用问的,一般都是内置的。
就是tun/tap设备的支持。 这一点,可以这样看一下:
modprobe tun, lsmod 看一下有没有tun 如果成功,就是支持的, 而且是被编译成了模块,如果没有,可以看一下:/dev/net/,看看是不是存在tun这样一个文件,如果存在就是内核内置的,没有编译成模块,另外, 如果编译成了模块,也要注意是否有这个文件存在。不在的话,得自己建了。
mknode /dev/net/tun, 一般现在的发行版都会在你modprobe tun时自动帮你弄好,所以不用担心这个。

好了。我们开工了。

从主站上下载回来qemu的源码:
tar zxvf qemu-0.8.2.tar.gz
cd qemu-0.8.2
gcc -v
这里看一下gcc的版本。
qemu目前只能用gcc3来编译。如果你的是gcc4,
就su - 一下,到root, 然后到/usr/bin/
看一下有没有gcc3
有的话,看看原来的gcc是链接还是一个文件。如果是一个文件,就备份一下,呆会恢复。 如果是链接就不用管它了。看它指向哪一个gcc, 记得呆会儿要恢复过来的。 链接的做法简单了: ln -s gcc-3.3 gcc
就这样的。 备份就更简单了。mv gcc gcc.bak

回到我们刚才的目录里。
运行:  
./configure
make
make install
这样就装好了qmeu,

现在我们需要使用kqemu模块来加速了。
下载回来kqemu-1.3.0pre9.tar.gz.
解开后。
tar zxvf kqemu-1.3.0pre9.tar.gz
然后进入到目录里。这个时候有两件事要注意:
1. 需要有你现在所用的内核的内核头文件。
2. gcc的版本要和你的内核编译的gcc版本一致。一搬来说就是你刚才改过的哪个了。恢复回来就好了。
好了。
./configure && make && make install
就好了。

我们已经就装好了所有的软件。
但是有时候我们需要一些设置才能工作。

1. modprobe kqemu
2. 看看/dev/kqemu 字符文件是否存在。
3. /dev/kqemu 文件的权限要是0666的。

做好这些后就可以开始安装你的虚拟机了,
安装好,我们再设置你的网络

退出你的root, 然后
cd ~ 进入你的home directory
mkdir qemu
cd qemu
qemu-img create win2k.img 2G
建立一个硬盘文件。然后我们就可以在这个上面安装win2000了。

可以使用iso文件, 也可以使用光盘。

我们这里使用光盘来安装。
qemu -hda win2k.img -cdrom /dev/cdrom -boot d -localtime -m 256 -win2k-hack

这样就可以开始安装2000了。解释一下这里的选项:
-hda 指定第一个硬盘。
-cdrom 指定你的cdrom 后面的文件可以是一个iso文件
-boot d 从光盘启动,如果从你的硬盘启动,就-boot c,  -localtime使用本机的时间。 -m 就是设定内存的大小。默认是128,  注意可以设得大一点的内存,但是需要你的/dev/shm足够大。
-win2k-hack, 在安装2000的时候会有一个问题,它会提示你磁盘空间不够,加上这个参数就可以了。

好了。
安装完成了之后,就可以启动来看一把了。
启动如下:
qemu -hda win2k.img -boot c -localtime -m 256. 这样就默认使用了kqemu

现在应该也可以上网了,但是注意虚拟机使用的是dhcp的方式来上网的。
而且不能ping通你的本机,我想这个可能是大多数人不想要的,所以下面我们来配置网络。 通过tun/tap, 有点象vmware里的host-only

要配置host-only(tun/tap)这样的网络,我们上面已经讲过了两个要求,现在我们来做更多的事:

1、 建立一个文件 /etc/qemu-ifup
内容很简单:
#!/bin/sh
sudo /sbin/ifconfig $1 192.168.0.1 netmask 255.255.255.0

然后chmod a+x /etc/qemu-ifup

注意这里的192.168.0.1是你的tun/tap网卡的地址,一定要注意:不能和你的实际的网卡在同一个网段。 也就是如果tun/tap是192.168.2.0.0/24, 那么你的时间网卡就不能在这个网段。

然后写一个小的脚本:
userinit 这个是文件名:
文件内容如下:

#!/bin/bash

case "$1" in
   start)
      [ ! -e /dev/kqemu ] && mknod -m 666 /dev/kqemu c 250 0
      echo 1024 > /proc/sys/dev/rtc/max-user-freq
      echo 1 > /proc/sys/net/ipv4/ip_forward
      /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
      ;;
   stop)
   ;;
esac

然后:chmod a+x userinit

再:mv userinit /etc/init.d/
再: update-rc.d userinit start 25 2 3 .

要注意的是这个操作是在debian 下面的做法。
如果是在其他发行版:比如Fedora, 你可以直接写这样的script在你的/etc/rc.local文件里

      [ ! -e /dev/kqemu ] && mknod -m 666 /dev/kqemu c 250 0
      echo 1024 > /proc/sys/dev/rtc/max-user-freq
      echo 1 > /proc/sys/net/ipv4/ip_forward
      /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

编辑你的/etc/modules. 加上: kqemu (如果你的tun被编译成了模块,也加上tun)

最后还有一点。大家一定注意到了一个问题: 就是qemu-ifup脚本哩使用了sodu, 所以如果想普通用户能用,那么就配一下sudoer.
这个好配极了。 编辑:/etc/sudoers
你的用户名   ALL=(ALL):ALL NOPASSWD:ALL
这样就可以不用输入密码了。

现在我们可以开始启动你的虚拟机了。
要象这样启动:

qemu -hda win2k.img -boot c -localtime -m 256 -net nic,vlan=0 -net tap,vlan=0

如果嫌麻烦,
就干脆写一个一句话的脚本:
#!/bin/bash
qemu -hda win2k.img -boot c -localtime -m 256 -net nic,vlan=0 -net tap,vlan=0

存储为win2k, 加上x的权限,然后放置到/usr/bin, 或者是/usr/local/bin下
以后直接运行win2k, 就可以启动2000了。
同理也可以安装多个系统,写多个脚本启动。
这样比较的酷!

发表于 2006-8-3 00:12:46 | 显示全部楼层
楼主好文!

不知道楼主有没试过通过qemu运行硬盘上已经安装的系统?上次尝试失败了,还望楼主能指点一二 :ask
回复 支持 反对

使用道具 举报

发表于 2006-8-3 03:54:03 | 显示全部楼层
黄叶兄写的很详细。这个是我写的,大家可以交叉参考。
http://www.linuxsir.cn/bbs/showthread.php?t=253080

我想问的是:
-net nic,vlan=0 -net tap,vlan=0
这一段的意思是什么?能稍微解释一下不?

谢谢。
回复 支持 反对

使用道具 举报

发表于 2006-8-3 03:55:34 | 显示全部楼层
Post by manphiz
楼主好文!

不知道楼主有没试过通过qemu运行硬盘上已经安装的系统?上次尝试失败了,还望楼主能指点一二 :ask

我觉得是系统本身的问题,比如Win的验证机制等。

我用来启动已存在的Linux系统,没问题的说。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-3 13:47:16 | 显示全部楼层
Post by manphiz
楼主好文!

不知道楼主有没试过通过qemu运行硬盘上已经安装的系统?上次尝试失败了,还望楼主能指点一二 :ask

没有试过。

我就是新装的一个系统。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-3 13:52:32 | 显示全部楼层
Post by 终极幻想
黄叶兄写的很详细。这个是我写的,大家可以交叉参考。
http://www.linuxsir.cn/bbs/showthread.php?t=253080

我想问的是:
-net nic,vlan=0 -net tap,vlan=0
这一段的意思是什么?能稍微解释一下不?

谢谢。

这个参数的问题。
可以看一下帮助。
-net nic[,vlan=n][,macaddr=addr][,model=type]
                create a new Network Interface Card and connect it to VLAN 'n'

建立一个网卡,然后连接到vlan上去。

-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]
                connect the host TAP network interface to VLAN 'n' and use
                the network script 'file' (default=/etc/qemu-ifup);

连接到你的vlan 到主机的tun/tap上去。
感觉就是这个vlan做中间的媒介
回复 支持 反对

使用道具 举报

发表于 2006-8-3 22:30:15 | 显示全部楼层
Post by 终极幻想
我觉得是系统本身的问题,比如Win的验证机制等。

我用来启动已存在的Linux系统,没问题的说。

嗯,刚刚想起来可能是因为win装在ntfs分区的原故……
不知道等ntfs-3g稳定后有没有可能成功,哈哈。
回复 支持 反对

使用道具 举报

发表于 2006-8-4 17:35:23 | 显示全部楼层
和ntfs有关系?
回复 支持 反对

使用道具 举报

发表于 2006-8-4 23:17:55 | 显示全部楼层
内核支持的ntfs驱动不是不能改变文件的大小吗?难道在ntfs分区上的win也可以用qemu虚拟?

恳请楼上指点!:ask
回复 支持 反对

使用道具 举报

发表于 2006-8-5 11:38:16 | 显示全部楼层
我个人认为,虚拟机中的windows和实际中的windows是“一样”的,只是硬件变了,变成虚拟机软件提供的“硬件”。所以对于ntfs的操作除了开始的引导外应该都是由windows完成的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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