可以从深度商店安装qemu-kvm,命令kvm-ok查看kvm安装情况。注意:kvm命令=qemu-system-x86_64命令,kvm-img命令(没有)=qemu-img命令
用wget从alt.fedoraproject.org下载virtio驱动,我下载的是virtio-win-0.1-81.iso
创建qcow2/raw格式的磁盘镜像:
qemu-img create -f qcow2 win7lite.img 20G
qemu-img create -f raw win7lite.img 20G
启动带virtio驱动的光驱的kvm虚拟机:
sudo kvm -m 2048 -cdrom win7安装盘.iso -drive file=win7lite.img,if=virtio -drive file=virtio-win-0.1-81.iso,index=3,media=cdrom
(带选项 -nographic -vnc :5 可以不显示kvm虚拟机GUI,改为从vnc登录,:0对应5900端口,以此类推:5对应5905端口,可以用Deepin的远程桌面工具选VNC虚拟计算来登录)
在win7安装中,一开始是无法认到硬盘的,但带virtio驱动的光驱应该能认到,这时先从光驱安装virtio驱动,然后就可以识别硬盘了并安装系统了。(装UbuntuKylin 14.10反而没那么麻烦,因为不需要考虑virtio驱动)
带多个iso的例子:sudo kvm -m 2048 -cdrom win8_PE_x64_x86.iso -hda win7_x86_jsjxjf.qcow2 -boot d -drive file=virtio-win-0.1-81.iso,index=1,media=cdrom -drive file=win7-jsjxjf-wim.iso,index=3,media=cdrom -net nic -net user -nographic -vnc :5
经过上述步骤,win7系统可用,但网络无法连接。关闭kvm虚拟机,接着考虑将网卡桥接到宿主机eth0:
从深度商店安装桥接工具:bridge-utils(如果已经安装可忽略)
从深度商店安装TAP界面工具:uml-utilities
修改网络界面配置文件:sudo gedit /etc/network/interfaces ,加入以下内容
auto eth0
iface eth0 inet dhcp
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user hp
auto br0
iface br0 inet dhcp
bridge_ports eth0 tap0
激活tap0和br0(我试验不需要重新启动OS,用ifconfig进行查验):
sudo /sbin/ifup tap0
sudo /sbin/ifup br0
使用sudo kvm -m 2048 -hda /media/hp/win7-in-320G/win7lite.img -localtime -net nic,vlan=0,macaddr=52-54-00-12-34-02 -net tap,vlan=0,ifname=tap0,script=no -boot c -smp 2 -clock rtc
重新启动kvm虚拟机,客户机内网卡已经桥接到外部宿主机pci网卡,获得了动态地址并可以ping通内网机器了
备注:上述配置中,客户机可以连接外网,但存在宿主机不能联通外网问题。经过试验,发现因为eth0和br0都采用了DHCP动态分配IP地址,结果route显示结果中默认路由(带UG标志)对应设备为eth0,而实际此时宿主机和客户机的网卡应该都是在br0逻辑网段的。使用以下命令可以手动修正:
sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 当前网段网关机器IP地址 metric 0 br0
(或者sudo route add default gw 网关ip地址 br0)
网络知识了解有限,没想到如何能够在配置文件中在开机时解决这一问题。为了方便在不同网段使用机器,没有进行静态配置,而是写了如下简单脚本(因为所有网段都是规律的):
#!/bin/bash
#
# mynetwork.sh: start my network for kvm bridge 0, just add default route as br0
if [ $# -gt 2 ] ; then
printf "%s\n" "Type $0 for office or $0 [mm=5] nn for mm nn network segment."
exit 33
fi
if [ $# -eq 0 ] ; then
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.5.21.254 metric 0 br0
else
if [ $# -eq 2 ] ; then
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.$1.$2.254 metric 0 br0
else
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.5.$1.254 metric 0 br0
fi
fi
用sudo chmod +x ~/mynetwork.sh添加执行权限,每次使用时用sudo ~/mynetwork.sh修正。
通过试验发现,如果没有在配置中进行网桥设置,也可以通过下述命令一步步手动配置:
sudo brctl addbr br0
sudo tunctl -t tap0 -u hp 类似可以添加tap1等
sudo brctl addif br0 eth0
sudo brctl addif br0 tap0 类似处理tap1
sudo ifconfig br0 原eth0 IP
sudo ifconfig eth0 0.0.0.0 promisc
sudo ifconfig tap0 up 类似激活tap1等
sudo route add -net 0.0.0.0 netmask 0.0.0.0 gw 网关机器IP地址 metric 0 br0
经过试验,该windows 7 x86镜像可以用dashboard上传后使用。UbuntuKylin 14.10镜像也可以使用。和网上很多参考资料不同的是,我的windows 7镜像安装时默认总是有开头的100M主分区,使用没有问题。UbuntuKylin 14.10镜像中也包含了swap分区,也没有问题。而且,两个系统都不存在剥离开头的扇区数据的情况(实际试验,按网上的参考资料剥离UbuntuKylin 14.10镜像开头的2048个扇区,反而使镜像在openstack中不可用)。