Chinaunix首页 | 论坛 | 博客
  • 博客访问: 488466
  • 博文数量: 51
  • 博客积分: 257
  • 博客等级: 二等列兵
  • 技术积分: 1489
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-02 18:30
个人简介

Unix/Linux, mysql, web,企业应用

文章分类

全部博文(51)

文章存档

2015年(1)

2014年(1)

2013年(48)

2012年(1)

我的朋友

分类: 虚拟化

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客户机

#!/bin/bash

sudo kvm -bios /usr/share/seabios/bios.bin -smp 16 -m 4G -rtc base=utc,clock=host       \
    -net nic,model=virtio,macaddr=52-54-00-12-34-01 -net tap,ifname=tap0                \
    -boot order=c -no-fd-bootchk                                                        \
    -drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback    \
    -drive file=debian.iso,index=2,media=cdrom                                          \
    -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驱动,使用如下脚本启动虚拟安装
#!/bin/bash

sudo kvm -bios /usr/share/seabios/bios.bin -smp 16 -m 2G -rtc base=localtime,clock=host     \
    -boot order=d                                                                           \
    -net nic,model=virtio,macaddr=52-54-00-12-34-02 -net tap,ifname=tap1                    \
    -drive file=win2k3_dns.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback  \
    -drive file=windows_2003_r2_x64_cd1.iso,index=2,media=cdrom                             \
    -fda virtio-win-1.1.16.vfd                                                              \
    -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脚本,这样就更加快捷方便了。


阅读(6269) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~