2008-12-19

Ubuntu KVM 安装windows xp && 解决上网问题

  KVM是一款很不错的虚拟机,它能够很好的利用虚拟化技术。不管怎么样,常用linux的人也是有必要弄一个windows虚拟机用着的。。。


安装KVM:


首先确定你的cpu是否支持虚拟化技术:
egrep '(vmx|svm)' /proc/cpuinfo
如果出现svm 或者 vmx 代表支持虚拟化技术,前者是amd-v 后者是intel的vt,另外注意主板是否开启这些选项。

在确认cpu支持之后就可以开始编译安装了:
http://kvm.qumranet.com/kvmwiki 此处下载最新源代码。
回来之后只需要用普通的./configure --prefix=/usr/local/kvm即可。这个kvm会自己编译安装qemu的。所以不劳我们费心。

kvm主要有2个ko,kvm-intel.ko,kvm-amd.make install 会自动加载,如果用apt装可能需要手动加载一下:
sudo modprobe kvm
sudo modprobe kvm-amd

记得每次重启你真的主机之后都需要重复一遍这两个命令,否则会提示找不到/dev/kvm
这样基本就算装完了。接下来只需要装系统配置windows了。

配置客户机
首先是装系统:
先配置一个虚拟磁盘:
sudo qemu-img create -f qcow2 winxp.img 10G
-f 就是创建的虚拟磁盘的格式,最后那个指定的是初始大小,貌似虚拟磁盘的大小能够自动增加。
之后启动系统开始安装:
sudo qemu-system-x86_64 -hda winxp.img -cdrom /home/test/xpimg.iso -boot d -m 384 -no-acpi -smp 2 -clock rtc -localtime
启动虚拟机用的就是这个qemu-system-x86_64,不管你是32位还是64位
-hda指定虚拟磁盘文件,当然也可以有-hdb -hdc了。
-cdrom 指定的是作为光盘加载的文件,也可以直接加载光盘.
-boot指定启动类型,d是从光盘启动,c是从硬盘启动
-m指定内存多少以m为单位
-no-acpi之所以要用是因为kvm对它支持不好,似乎会使系统很慢。
-smp指定cpu个数,有几核用几个才是上上之选。
-clock rtc指定使用rtc时钟。据说不开这个xp很慢。。。
-localtime使用本地时间,不开的话可能虚拟机时间有问题。



接下来配置网络,我用桥接模式,这样设置:
sudo apt-get install bridge-utils
sudo apt-get install uml-utilities

sudo vi /etc/network/interfaces

按照下面的范例自己配置:
auto eth0
iface eth0 inet static \
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

#######################Setting for KVM Guest Machine#######################
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user kyo

auto br0
iface br0 inet static
bridge_ports eth0 tap0
address 192.168.1.134
netmask 255.255.255.0
network 192.168.1.1
broadcast 192.168.1.255
gateway 192.168.1.1
###########################################################################


之后
sudo ifup tap0
sudo ifup br0

如果出错重启试试

都起来之后
sudo brctl addif br0 tap0
sudo brctl addif br0 eth0

这个命令就是把这两块网卡桥接起来。。。

配置好之后以后启动虚拟机用这个命令:
sudo qemu-system-x86_64 -hda winxp.img -boot c -m 512 -no-acpi -smp 2 -clock rtc -localtime -net nic,vlan=0,macaddr=01-02-03-04-05-06 -net tap,vlan=0,df=h,ifname=tap0,script=no -no-acpi
-net后面的参数表示:使用网络,并连接到一个存在的网络设备tap0,这里的mac地址是自己乱编的。

如果你按照我上面的设置设置好了的话,启动到虚拟机有八成你还是联不上网。为什么?因为一个常识问题:
Note: Make sure the first octet in your MAC address is EVEN (eg. 00:) as MAC addresses with ODD first-bytes (eg. 01:) are reserved for multicast communication and can cause confusing problems for you. For instance, the guest will be able to receive ARP packets and reply to them, but the reply will confuse other machines.
所以,最后,我可以上网的启动命令是这样的:

sudo qemu-system-x86_64 -m 512 -hda /home/kyo/KVM/winxp.img -localtime -net nic,macaddr=00-02-03-04-04-05 -net tap,ifname=tap0,script=no -boot c -smp 2 -clock rtc -no-acpi

自己研究了几个小时才真正成功,也就是一个常识匮乏导致的问题。最后总结下这种虚拟机桥接上网的模型:
简单来说:就是我们的虚拟机通过使用tap0这个虚拟网卡桥接到了主机上。对外主机的ip就是192.168.1.10而那个eth0就不再有ip地址了。逻辑上的连接就是图中蓝色的线。虚拟机也可以通过向网络发起起请求连接到主机。

最后记得一点就是:
官方提供了一个叫kvm-guest-drivers-windows的网卡驱动,据说相当不错,如果用bridge模式的话一定要装。不过注意的是,用了这个以后你需要在虚拟机的启动参数那里加上model=virtio这个参数 。
此外,如果有鼠标移动问题或者vnc下鼠标异常奇怪的问题就加上一个参数:-usbdevice tablet,要使用超过1024分辨率需要增加-vga std


参考资料:
https://help.ubuntu.com/community/KVM
http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=154792&start=0
http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=130210
http://linux.chinaunix.net/bbs/viewthread.php?tid=788174
http://kvm.qumranet.com/kvmwiki/Networking

没有评论: