Unix/Linux, mysql, web,企业应用
分类: 虚拟化
2013-01-05 15:21:18
基于内核的虚拟机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支持硬件虚拟化的标志
注意:还要确保主板BIOS已经打开CPU虚拟化选项;如果是用笔记本作为宿主机的话还要完全关机再开机(我是完全关机之后,拔掉电源线和电池,再重新插上,然后再开机)。
KVM安装
$sudo apt-get insall qemu-kvm
从squeeze开始KVM的包名改为qemu-kvm,kvm只是个占位dummy包
创建vdisk
$qemu-img create -f qcow2 debian6.img 8G
创建一个8G的qcow2格式的虚拟磁盘文件,更多参数见man qemu-img
桥接网络
KVM支持很多网络类型,但是使用最方便的还是桥接网络,设置桥接网络,系统中必须存在以下三个命令
/sbin/ip
/usr/sbin/brctl
/usr/sbin/tunctl
所以需要安装一下包
$sudo apt-get install bridge-utils uml-utilities
编辑/etc/network/interfaces文件增加网络桥,增加的网络桥接口名字为br0,将主机网络接口桥接到此网络桥
1 # This file describes the network interfaces available on your system
2 # and how to activate them. For more information, see interfaces(5).
3
4 # The loopback network interface
5 auto lo
6 iface lo inet loopback
7
8 # The primary network interface
9 # allow-hotplug eth0
10 # iface eth0 inet static
11 # address 192.168.0.18
12 # netmask 255.255.255.0
13 # network 192.168.0.0
14 # broadcast 192.168.0.255
15 # gateway 192.168.0.1
16 # # dns-* options are implemented by the resolvconf package, if installed
17 # dns-nameservers 211.137.191.26
18 # dns-search localdomain
19
20 auto bond0
21 iface bond0 inet manual
22 # address 192.168.0.18
23 # netmask 255.255.255.0
24 # network 192.168.0.0
25 # broadcast 192.168.0.255
26 # gateway 192.168.0.1
27 slaves eth0 eth1
28 bond-mode balance-rr
29 bond-miimon 100
30
31 auto br0
32 iface br0 inet static
33 address 192.168.0.18
34 netmask 255.255.255.0
35 network 192.168.0.0
36 broadcast 192.168.0.255
37 gateway 192.168.0.1
38 bridge_ports bond0
39 bridge_stp off
40 bridge_maxwait 0
41 bridge_fd 0
42
43 # auto tap0
44 # iface tap0 inet manual
45 # up ifconfig $IFACE 0.0.0.0 up
46 # down ifconfig $IFACE down
47 # tunctl_user yourusername
第38行 bridge_ports bond0,此处将主机的bonding接口bond0加入网络桥,如果没有网络接口聚合此处一般应为eth0
第47行将youeusername改为你登陆主机的用户名
使用桥接网络,客户机必须使用主机的一个tap设备将客户机的网络接口连接到主机的网络桥,tap设备可以用两种方式来设置
一种是静态方式,直接把tap设备的配置写道/etc/network/interfaces文件中,并将tap接口加入网络桥,将配置文件43-47行前的注释符#去掉,并将第38行改为如下
bridge_ports bond0 tap0
增加更多的tap接口依次类推
另一种为动态方式,网络配置文件中不写任何tap设备的配置,而由KVM的脚本/etc/kvm/kvm-ifup来动态完成tap接口的创建,以后创建客户机是会提到怎么用。
半虚拟化驱动Virtio
Virtio是KVM/Linux的I/O虚拟化框架,以增强KVM的IO效率,是与其他虚拟化平台的半虚拟化(Paravirtualized)类似的东西,主要应用于磁盘设备和网络接口设备。主流的linux发行版已经默认支持Virtio,如果客户机是linux则无需其他设置,直接可以使用Virtio设备,但是如果客户机是windows,则需要在客户机安装Virtio设备驱动,甚至在windows开始安装之前需要提前加载块设备驱动。windows Virtio驱动可从Fedora下载。
安装客户机
KVM主机端设置完毕后,开始安装客户机,这里介绍两个客户机的安装,Debian Squeeze AMD64和Windows 2003 x64
当然主机系统是64位平台,必须的。
准备
因为要使用半虚拟化(Paravirtualized)驱动virtio,但是当前的Debian Stable版本也就是squeeze发行版的kvm并不支持从virtio驱动器启动,所以需要更新一下seabios,从Debian官方sid源下载,然后手动安装该包 seabios_0.6.1.2-2_all.deb
$sudo dpkg -i seabios_0.6.1.2-2_all.deb
主机系统只安装了debian基本系统(base system),没有X,因此使用VNC来远程安装客户机,如果使用windows系统,请自行下载TightVNC Viewer。
kvm核心参数
这是只简单介绍几个主要的参数,详细的文档请见man kvm。
-bios file
指定虚拟机使用的BIOS,file指定BIOS文件路径
-smp n[,cores=cores][,threads=threads][,sockets=sockets][,maxcpus=maxcpus]
模拟一个有n个cpu的smp系统,可以简单的指定n为一个数值,或者分别指定socket数,core数/socket,线程数/core
-m megs
指定虚拟机使用的内存数量,可以使用M或G后缀
-rtc [base=utc|localtime|date][,clock=host|vm][,driftfix=none|slew]
指定虚拟机使用的时间,linux客户机使用-rtc base=utc,clock=host,windows客户机使用-rtc base=localtime,clock=host
-net nic,model=virtio,macaddr=52-54-00-12-34-01 -net tap,ifname=tap0
桥接网络,客户机网络接口通过tap接口桥接到主机网络,使用的tap接口名为tap0,由/etc/kvm/kvm-ifup来动态配置tap0接口。model=virtio指定虚拟机网卡使用半虚拟化驱动,如果有多个虚拟客户机同时运行则必须指定macaddr为一个独一无二的值,否则会出现mac地址冲突。如果通过主机的/etc/network/interfaces来静态配置tap接口,则此处应在-net tap接口处附加两个另外的参数script=no,downscript=no
-drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback
指定客户机使用的硬盘驱动器,if=virtio指定使用半虚拟化驱动,index=0指定该硬盘为接口的第一个驱动器,media=disk指定为硬盘驱动器,如果是光盘则为media=cdrom。旧式指定第一个硬盘驱动器的参数为-hda debian.img,已经不再推荐使用。
-drive file=debian.iso,index=2,media=cdrom或者-hdc debian.iso
指定光盘驱动器,debian.iso为使用的光驱映像文件
-fda file
指定软盘驱动器,file为软磁盘镜像
-no-fd-bootchk
客户机启动时不检查软盘驱动器,加速客户机启动
-boot order=c
指定引导顺序,c为第一个硬盘驱动器,d为第一个光盘驱动器
-vnc :0
将虚拟机的视频输出重定向到vnc端口,通过vnc viewer可以连接到虚拟机的视频输出
-nographic
禁止kvm虚拟机的视频输出,模拟出的虚拟机的串口会被重定向到宿主机的控制台。使用这个参数可能会导致从kvm命令返回之后,宿主机的控制台看不到用户输入的命令(但按回车键却可以执行,难道被透明化了?),可以用 -display none 参数代替此参数,就没这个问题了。具体请参看kvm man手册的 Display options部分。论坛帖子 也是类似问题和解决方法。
-daemonize
后台运行虚拟机。如果添加了此参数,则kvm命令会立即返回,虚拟机在后台运行。在宿主机用ps -ef 命令查看进程,会发现后台运行的虚拟机进程的ppid为1
安装Debian Squeeze AMD64客户机
使用一下脚本开始安装debian客户机
1 #!/bin/bash
2
3 sudo kvm -bios /usr/share/seabios/bios.bin -smp 16 -m 4G -rtc base=utc,clock=host \
4 -net nic,model=virtio,macaddr=52-54-00-12-34-01 -net tap,ifname=tap0 \
5 -boot order=c -no-fd-bootchk \
6 -drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback \
7 -drive file=debian.iso,index=2,media=cdrom \
8 -vnc :0
这里指定虚拟机使用的BIOS,这样安装完成后才能从virtio磁盘启动客户机,debian.iso为客户机安装光盘镜像,远程通过vnc viewer连接到主机开始安装客户机,Debian Squeeze内置支持virtio设备支持,因此正常安装即可。
安装完毕开启sshd后,将-vnc :0参数更换为-display none -daemonize,以后通过ssh登录即可。
安装windows 2003 R2 x64客户机
首先从Fedora下载virtio for windows驱动,使用如下脚本启动虚拟安装
1 #!/bin/bash
2
3 sudo kvm -bios /usr/share/seabios/bios.bin -smp 16 -m 2G -rtc base=localtime,clock=host \
4 -boot order=d \
5 -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap1 \
6 -drive file=win2k3_dns.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback \
7 -drive file=windows_2003_r2_x64_cd1.iso,index=2,media=cdrom \
8 -fda virtio-win-1.1.16.vfd \
9 -vnc :0
使用vnc viewer连接到主机开始安装,按F6从加载virto驱动,否则会找不到硬盘驱动器,系统安装完成后将光驱换上virtio-win-1.1.16.iso安装virtio网卡驱动,打开远程桌面后将-vnc :0替换成-display none -daemonize,然后用远程桌面管理虚拟机即可。
总结:
kvm创建虚拟机的步骤:
1,创建磁盘映像文件,命令:qemu-img
#qemu-img create -f qcow2 debian6.img 8G
2,网络设置,可以直接桥接到物理网卡,也可以采用类似VirtualBox的Host-Only的方式
3,安装虚拟机操作系统,命令:kvm
#kvm -m 384 -drive file=vms/debian6/debian6.img,media=disk -drive file=software/debian-6.0.6-amd64-CD-1.iso,media=cdrom -net nic -net tap,ifname=tap0,script=no -boot order=d -no-fd-bootchk -vnc :0
4,启动虚拟机,命令:kvm
#kvm -m 384 -drive file=vms/debian6/debian6.img,media=disk -net nic -net tap,ifname=tap0,script=no -boot order=c -no-fd-bootchk -display none -daemonize
启动虚拟机的步骤可以自己写shell脚本,这样就更加快捷方便了。