KVM 入门教程
by The Burn
QQ:584158868
一些原理什么的大家可以上网搜索,我又不出书,没必要占那么多的篇幅讲原理,最后会给连接,大家直接上网看好了。
?写在前面
本篇文章是在FC12下完成的,如果是其他发行版的linux请自己根据实际情况进行操作。
本篇文章中有些东西并非本人原创,一些资料是从网上搜索的,还有一些是朋友帮忙解释以及Man文档中的东西,但是基本上我都是操作过,做过实验的。
?硬件支持:
查看自己的CPU是否支持虚拟化技术
Inter:
cat /proc/cpuinfo | grep vmx
AMD :
cat /proc/cpuinfo | grep svm
看看flag有没有上面的vmx或者是svm,有的话就是支持的。
?安装KVM:
方式一:源代码编译
qemu-kvm-release.tar.gz
这个包是主程序,必须安装。
1.tar xzf qemu-kvm-release.tar.gz
2.cd qemu-kvm-release
3../configure –prefix=/usr/local/kvm
4.make
5.sudo make install
6.sudo /sbin/modprobe kvm-intel#这个是Inter
7.sudo /sbin/modprobe kvm-amd #这个是AMD
如果modprobe时有出错要装下面这个包。
qemu-img:qemu磁盘文件程序,主要用来创建、检查、转换等。creat:创建一个新的磁盘文件。
-f:指定磁盘文件的格式类型
?qcow2:这个是qemu的镜像格式,用的最普遍的格式。使用他可
以有较小的镜像文件,且如果你的虚拟机系统不支持holes的话,如fat32,那么使用这个格式还是有用的,另外它还支持可选的
A ES加密,基于Z lib的压缩和支持多种VM的快照。
?holes解释:比如你建立一个10m的文件,直接从4m开始写文件。那 么支持holes的文件系统会假设4m之前是全0.
但这4m部分不实际在硬盘 分配空间,这就是所谓的holes.
如果是win,那么前4m会实际占用4m的磁盘空间的。换句话
说,支持hole的文件系统对于有大量连续0的文件能起到
节省磁盘空间的作用。实际就是数据结构中的稀疏矩阵。比
如数组a[10]={0,0,0,0,0,0,0,0,0,3};win上就是这样存储。
unix上可以直接存a[3]={-1,9,3};-1作为标志,表示接下
来的一个数据是0的个数。这样就比win节省了7字节的空
间。(感谢Michael的帮助,原封不动抄过来的)?raw:raw磁盘镜像格式,这个格式的优势在于可以简单容易的输
出到任意其他的模拟器,如果你的文件系统支持holes,那么被
写过的扇区将会预留一些空间。
?qcow:旧版的qemu镜像格式。
?cow:user-mode linux copy on write镜像格式,曾经是qemu 唯一的可扩展的 镜像格式,仅能与之前的版本兼容,且不能工作在windows上。
?Copy on write解释:在复制一个对象时并不是真的在内存中把原来对象的数据复制一份到另外一个地址,而是在新对
象的内存映射表中指向同原对象相同的位置,并且把那块内
存的 Copy-O n-W rite 位设为 1。在对这个对象执行读操作
的时候,内存数据没有变动,直接执行就可以。在写的时候,
才真正将原始对象复制一份到新的地址,修改新对象的内存
映射表到这个新的位置,然后往这里写。
?vmdk: vmware的镜像格式。
?cloop:linux coppressed loop 镜像,只能使用在完全压缩的CD-ROW镜像上.
其实讲了那么多,大家只要使用qcow2就好了,如果使用dd命令也是可以创建的,不过要注意selinux。
filename:你想要的镜像文件名,为了方便识别用虚拟机系统标识,并加上img的后缀。
size:所创建的镜像文件的大小。
2.安装操作系统
为了以后方便修改,我使用脚本进行安装,以后安装其他操作系统的时候,只需要修改一些参数即可。
?脚本如下:
#!/bin/bash
setenforce 0
/usr/bin/qemu-kvm -M pc-0.11 -cpu core2duo -m 512 -boot d
-hda /VM/W indows_X P/W indows_X P.img -cdrom
/home/smile/I SO/W I N D OWSX P.iso -net
nic,macaddr=52:54:00:33:66:01,vlan=0 -net
tap,vlan=0,ifname=tap3,script=/opt/KVM/net/Bridge/kvm-ifup
-usb -k en-us -vga cirrus -soundhw es1370 -localtime
setenforce 1
?参数解释:
1.setenforce 0:由于selinux的关系我这个linux版本使用KVM
会有些问题,所以我安装的时候需要关闭selinux,大家用的时
候可以根据自己的情况删除或保留。
2./usr/bin/qemu-kvm:使用kvm命令。
3.-M:选择模拟的机器的类型。pc-0.11这个是默认的,可以使用
qemu-kvm -M ?进行查看。
4.-cpu:需要模拟cpu的类型,当然也可以使用qemu-kvm -cpu ?
进行查看。
5.-m:虚拟机使用的内存,默认是128M。
6.-boot d:表示从光驱启动。c为从硬盘启动。
7.-hda:是选择第一块硬盘,你可以选择多个,hdb,hdc的往后
面扩展。后面跟着的是上一步建立的磁盘文件的路径。
8.-cdrom:使用的光盘镜像文件,如果使用的是物理光驱安装,
则把镜像文件名替换为/dev/cdrom。
9.-net nic,macaddr=52:54:00:33:66:01,vlan=0:给虚拟
机指定网卡的MAC地址以及所属V L A N。
10.-net
tap,vlan=0,ifname=tap3,script=/opt/KVM/net/Bridg
e/kvm-ifup :这个参数的作用是将虚拟机的网卡桥接到本地,
这样可以获得和本地同网段的IP。实现方式就在后面的script
中。
11.-usb:开启U S B设备 。
12.-k en-us :键盘为美式。
13.-vga cirrus:显卡是cirrus,还有其他的可以man qemu来看。
14.-soundhw es1370:声卡是es1370。可以使用qemu-kvm
-soundhw ?来查看所支持的声卡类型。
15.-localtime:使用本地时间同步虚拟机的时间。
?S cript解释
KVM默认的script为/etc/qemu-ifup和/etc/qemu-ifdown,不过即使装好了KVM,脚本也是需要自己写的,而且没必要在默认的下面,我就放在/opt/KVM/net/Bridge下面,分别为kvm-ifup和kvm-
ifdown(名字自己定没有关系)。这样即使我开了多个虚拟机,也不会因为关了一个虚拟机导致KVM启动qemu-ifdown脚本,而影响其他虚拟机的使用。
这里的script的目的是让虚拟机桥接到本地,可以理解为VMware中的Bridge模式,而且KVM也可以使用host和N AT模式,不过我几乎不用,所以就只写了Bridge模式的脚本,其他两种模式,
google上搜一下,很多。
?Kvm-ifup脚本内容:
#!/bin/bash
#获得本机IP
IP=`ifconfig eth0|grep "inet addr"|awk '{print $2}'|sed
's/addr://'`
#获得本机网关
GAT EW A Y=`route -n|grep ^0.0.0.0|awk '{print $2}'`
B R IDG E=br0
E T H D E V=eth0
LO G="/opt/KVM/net/Bridge/output/kvm-ifup.log"
echo "=====<<`date +%F--%X`>>=====">>"$LO G" 2>&1
# 删除eth0的IP地址
/sbin/ip addr del $IP dev $E T H D E V >>"$LO G" 2>&1
#创建tap接口,并激活
setenforce 0
/usr/sbin/tunctl -p -u smile -t $1 >>"$LO G" 2>&1
/sbin/ifconfig $1 up >>"$LO G" 2>&1
setenforce 1
# 添加网桥接口,并将eth0加入到网桥
if [[`ifconfig | grep "^br0" | awk '{print $1}'` == ""]] then
/usr/sbin/brctl addbr $B R IDG E>>"$LO G" 2>&1
/usr/sbin/brctl addif $B R IDG E$E T H D E V >>"$LO G" 2>&1
fi
# 将tap加入网桥,这里面的$1为ifname的值
/usr/sbin/brctl addif $B R IDG E$1 >>"$LO G" 2>&1
# 设置IP地址,启动网桥
/sbin/ifconfig $B R IDG E$IP up >>"$LO G" 2>&1
# 添加默认路由
/sbin/route add default gw $GAT EW A Y>>"$LO G" 2>&1
echo -e "\n\n\n">>"$LO G" 2>&1
?kvm-ifdown脚本内容:
#!/bin/bash
#获得本机IP
IP=`ifconfig br0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
#获得本机网关
GAT EW A Y=`route -n|grep ^0.0.0.0|awk '{print $2}'`
E T H D E V=eth0
B R IDG E=br0
LO G="/opt/KVM/net/Bridge/output/kvm-ifdown.log"
echo "=====<<`date +%F--%X`>>=====">>"$LO G" 2>&1
# 删除br0的IP地址
/sbin/ip addr del $IP dev $B R IDG E>>"$LO G" 2>&1
# 禁用br0
/sbin/ip link set $B R IDG E down >>"$LO G" 2>&1
# 删除网桥
/usr/sbin/brctl delbr $B R IDG E>>"$LO G" 2>&1
/sbin/ifconfig $E T H D E V $IP up >>"$LO G" 2>&1
/sbin/route add default gw $GAT EW A Y>>"$LO G" 2>&1
echo -e "\n\n\n">>"$LO G" 2>&1
#下面的代码我是在做测试时用到的,目的是删除tap地址,如果真的开虚拟机,tap地址会随着虚拟机的关闭而消失,所以下面的代码可加可不加。
setenforce 0
ifconfig | grep tap | awk '{print $1}'> TAPFI LE
while read line
do
tunctl -d $line >>"$LO G" 2>&1
done < TAPFI LE
rm -rf TAPFI LE
setenforce 1
如何安装系统这个我就不讲了,不会的话……诶,我想不会装系统的话,估计也没耐心看到这里了吧!
3.启动虚拟机
#!/bin/bash
setenforce 0
/usr/bin/qemu-kvm -M pc-0.11 -cpu core2duo -m 512 -boot c -hda /VM/W indows_X P/W indows_X P.img -net
nic,macaddr=52:54:00:33:66:01,vlan=0 -net
tap,vlan=0,ifname=tap3,script=/opt/KVM/net/Bridge/kvm-ifup -usb -k en-us -vga cirrus -soundhw es1370 -localtime
setenforce 1
和上面安装的参数几乎是一致的,只不过-boot的参数变成了c,然后去掉了光驱的参数。
启动后设置相应的IP地址就可以和互联网以及主机通信了,实验么,想怎么做就怎么做,当然硬件要支持那么多虚拟机!
?一些问题
1.虚拟机使用U S B存储设备
先将U S B设备和主机连接
然后将控制界面切换到虚拟机(其实就是在虚拟机中点一下鼠标)然后同时按下ctrl+alt+2进入qemu的控制台,输入info
usbhost,如下图所示:
看到最后一个S ATA B R IDG E设备就是我的移动硬盘,然后再输入usb_add host:14cd:6116具体的看自己设备的device信息。
然后你会发现主机的移动设备的logo消失了,再按ctrl+alt+1回到虚拟机的系统界面,打开我的电脑这样就有了移动硬盘。如下图所示:
移除设备这个就不用说了吧!
2.声音问题
声音这个问题一开始我一直没搞定,linux虚拟机倒也算了,反正我连图形都没装,有没有声音都无所谓,但是windows虚拟机没有声音很不爽,毕竟某些exe程序还是需要声音支持的,网上我也搜了好多资料,都说是加个-soundhw all就可以了,我试了几次,无论X P 还是2003或者是win7都是没有声音,后来我自己选了个es1370的声卡,然后在win7中开机后发现新硬件,选择从internet上自动搜索,大概过个半分钟就找到了驱动,然后重新启动就听到了声音,win2003也是同样的方法。而X P安装完成后就有声音了,无须额外装驱动。
3.Ghost的问题
Ghost我自己也试过几个不同的版本,方法也试过蛮多的,有从P E环境安装的,有直接选择ghost到第一个分区等等。只有P E环境是ghost完成,但是随后重启后没有任何的反应,而其他我试过的ghost 方法均是在我选择后就一直黑屏,毫无反应,这个问题我在google上搜索了很多,仍然没有解决诶,希望有人知道的话和小弟说一下。
4.Vmware文件使用
我有很多vmdk的文件,比如FC12,windows 2003等,我不想重装,所以我直接那过来用kvm启动,发现FC12的vmdk文件可以不用任何改动直接可以用,而windows启动后让我选择,安全模式,最后一次正确的配置等等这些。无论选择哪个都是蓝屏,如下所示:
而后KVM官网的方法我使用过,就是挂载后xcopy然后修复boot,接着repair,发现repair怎么进入重装了,试过几次都是进入重装,直接无语,后来发现一个老外写的文章,是从VM迁移到X en的,其中说到有个hal.dll需要替换掉,我也试过了,不蓝屏了,提示缺少D LLS,让我与管理员联系。这个弄了两晚上,windows虚拟机迁移到Kvm还是没有什么比较好的方法,网上很多人说的方法我都常试过,我这里都是失败。希望有人实战成功后告诉我一声,小弟不胜感激!
5.-no-acpi的问题
我在很多网页上搜索问题时发现很多参数中都加了这个参数,但是我加了这个windows虚拟机就启动不了。