基于内核的虚拟机KVM(Kernel-basedVirtualMachine)是linux平台上的全虚拟化解决方案KVM需要包含虚拟化支持的x86硬件,intelVT或者AMD-V。KVM使用修改后的QEMU作为前端工具,QEMU通过/dev/kvm设备与KVM交互。自kernel版本2.6.20KVM随主线内核一起发
基于内核的虚拟机KVM(Kernel-based Virtual Machine)是linux平台上的全虚拟化解决方案
KVM需要包含虚拟化支持的x86硬件,intel
VT或者AMD-V。KVM使用修改后的QEMU作为前端工具,QEMU通过/dev/kvm设备与KVM交互。自kernel版本2.6.20
KVM随主线内核一起发行。
前提条件(prerequisite)
可以使用KVM的前提条件是CPU支持虚拟化技术,Intel VT或者AMD-V
$egrep ‘(svm|vmx)’ /proc/cpuinfo
如果有输出则说明CPU支持硬件虚拟化,SVM(Secure Virtual Machine)是AMD
CPU支持硬件虚拟化的标志,VMX是INTEL CPU支持硬件虚拟化的标志
egrep '(svm|vmx)' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx constant_tsc arch_perfmon bts aperfmperf pni monitor vmx est tm2 xtpr pdcm
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx constant_tsc arch_perfmon bts aperfmperf pni monitor vmx est tm2 xtpr pdcm
KVM安装
sudo apt-get install qemu-kvm
从squeeze开始KVM的包名改为qemu-kvm,kvm只是个占位dummy包
安装qemu-utils(ubuntu 10.04 不需要这一步)
sudo apt-get install qemu-utils
This package provides QEMU related utilities:
* qemu-img: QEMU disk image utility
* qemu-io: QEMU disk exerciser
* qemu-nbd: QEMU disk network block device server
创建vdisk
sudo qemu-img create winxp.img 20G
创建一个20G的raw格式的(默认)虚拟磁盘文件,更多参数见man qemu-img
虚拟机磁盘位置/home/wiloon/vm/winxp.img
分区格式:Ext4; (不要把硬盘文件放在btrfs分区上, 磁盘性能会超级差)
qemu-img create winxp.img 20G
Formatting 'winxp.img', fmt=raw size=10737418240
网桥配置:
1. 是否加载tun模块?
lsmod | grep tun
2. 检查/dev/net/tun的权限
ls -l /dev/net/tun
3. 检查/etc/qemu-ifup的权限
当前用户需要有可执行权限
4. 检查是否已经安装bridge-utils软件包
rpm -qa | grep bridge
来查询,如果没有就请安装bridge-utils包,主要是脚本中一般需要用到brctl这个命令的。
#eth0
auto eth0
iface eth0 inet manual
address 192.168.1.192
netmask 255.255.255.0
gateway 192.168.1.1
#tap0, for the vm
auto tap0
iface tap0 inet manual
tunctl_user youeusername
#wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "XXXX"
wpa-psk "XXXX"
#br0
auto br0
iface br0 inet dhcp
bridge_ports wlan0 tap0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
bridge_ports wlan0 tap0,此处将主机的bonding接口wlan0, tap0加入网络桥.
将youeusername改为你登陆主机的用户名
手动配置网络之后就不再需要随系统启动的network manager. 可以在sysv-rc-conf里把network
manager 禁用掉.http://www.wiloon.com/wordpress/?p=2278
使用桥接网络,客户机必须使用主机的一个tap设备将客户机的网络接口连接到主机的网络桥,tap设备可以用两种方式来设置
一种是静态方式,直接把tap设备的配置写道/etc/network/interfaces文件中,并将tap接口加入网络桥.
增加更多的tap接口依次类推
被桥接的网卡会开启混杂模式!!,据说无线网卡没有对应的”混杂模式”一说……,但是流量监控还是能看到其它计算机的流量,…这个还要继续google…..
如果启动tap0时报错:tap0: ERROR while getting interface flags: No such
device, 安装uml-utilities, 并重启系统.
设置ebtables…
sudo ebtables -t nat -A POSTROUTING -o wlan0 -j snat --to-src 00:1b:77:05:aa:4f --snat-arp --snat-target ACCEPT
sudo ebtables -t nat -A PREROUTING -p IPv4 -i wlan0 --ip-dst 192.168.1.199 -j dnat --to-dst 52:54:00:12:34:02 --dnat-target ACCEPT
sudo ebtables -t nat -A PREROUTING -p ARP -i wlan0 --arp-ip-dst 192.168.1.199 -j dnat --to-dst 52:54:00:12:34:02 --dnat-target ACCEPT
#00:1b:77:05:aa:4f 无线网卡也是网桥的物理地址.
#192.168.1.199 虚拟机的IP.
#52:54:00:12:34:02 虚拟机的物理地址.
半虚拟化驱动Virtio
Virtio是KVM/Linux的I/O虚拟化框架,以增强KVM的IO效率,是与其他虚拟化平台的半虚拟化(Paravirtualized)类似的东西,主要应用于磁盘设备和网络接口设备。主流的linux发行版已经默认支持Virtio,如果客户机是linux则无需其他设置,直接可以使用Virtio设备,但是如果客户机是windows,则需要在客户机安装Virtio设备驱动,甚至在windows开始安装之前需要提前加载块设备驱动。windows
Virtio驱动可从这里下载http://www.linux-kvm.com/ (磁盘驱动:
virtio-win-1.1.16.vfd,网卡驱动: virtio-win-0.1-15.iso)
KVM主机端设置完毕后,开始安装客户机,我的客户端版本是Windows XP SP3 x32,
因为主机是32位的(IBMX60s/CPU L2400)客户机只能选32位。
因为要使用半虚拟化(Paravirtualized)驱动virtio,但是当前的Debian
Stable版本也就是squeeze发行版的kvm并不支持从virtio驱动器启动(seabios
0.5.1-3),所以需要更新一下seabios,从Debian官方sid源下载seabios
0.6.3-2,然后手动安装该包seabios_1.6.3-2_all.deb
http://packages.debian.org/sid/all/seabios/download
$sudo dpkg -i seabios_1.6.3-2_all.deb
KVM核心参数 http://www.wiloon.com/wordpress/?p=1711
sudo apt-get install seabios
sudo apt-get install ebtables
安装windows XP SP3 x32客户机
首先从http://www.linux-kvm.com/下载virtio
for windows驱动,使用如下脚本启动虚拟安装
#!/bin/sh
sudo kvm -bios /usr/share/seabios/bios.bin -smp 1 -m 512 -rtc base=localtime,clock=host -boot order=d -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap0,script=no,downscript=no -drive file=/home/wiloon/vm/winxp.img,if=virtio,index=0,media=disk,format=raw,cache=writeback -drive file=/media/M_DEV/Tools/win/system/windows_xp_professional_SP3_x86.iso,index=2,media=cdrom -fda /home/wiloon/tools/kvm/virtio-win-1.1.16.vfd
安装开始后记得按F6安装磁盘的virtio驱动
安装网卡驱动
#!/bin/sh
sudo kvm -bios /usr/share/seabios/bios.bin -smp 1 -m 512 -rtc base=localtime,clock=host -boot order=d -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap0,script=no,downscript=no -drive file=/home/wiloon/vm/winxp.img,if=virtio,index=0,media=disk,format=raw,cache=writeback -drive file=/home/wiloon/tools/kvm/virtio-win-0.1-15.iso,index=2,media=cdrom
—
桥接后,br0的IP就是宿主机的IP,而虚拟机的IP需要在虚拟机内设定。至于是动态IP还是静态IP,需要根据使用者的需要来设定。因为虚拟
机桥接接入局域网以后,虚拟机就相当于是局域网内的一台实体计算机,与宿主机平行,所以IP的设定要谨慎一些。如果宿主机是静态IP,而虚拟机是动态
IP,那么请确保局域网内有一台DHCP服务器来分配IP。
设定虚拟机IP的时候,请不要跟br0的IP相同,否则会造成IP冲突,导致宿主机或虚拟机不能连接网络。
如果出现虚拟机、宿主机和网关能够互相ping通,但虚拟机不能浏览网络等情况,请检查虚拟机的DNS设置。如果出现宿主机或虚拟机断开网络,请检查桥接网络中网桥是否连接好,网关是否设置好.