服务器在线 - 服务器软件 - 网站地图 服务器在线,专注于服务器技术!

当前位置:主页 > 云和虚拟化 > Kvm > 正文

KVM --- kernel based virtual machine

时间:2015-01-06    来源:服务器在线    投稿:泡泡    点击:

KVM是一种基于内核的虚拟机,它利用了现代的CPU提供的硬件虚拟化技术( 在Intel称为VT,在AMD称为AMD-V)。KVM非内核部分是基于QEMU实现的,因此其 使用上与QEMU基本一致。

http://www.linux-kvm.org/


要使用KVM,你的CPU必须支持硬件虚拟化技术。查找/proc/cpuinfo中的 flags字段,如果其中含有vme或者svm标志则表示你的系统支持硬件虚拟化技术 ,否则你就需要看一下是你的CPU压根就不支持硬件虚拟化还是在BIOS中把它关 闭了。也可使用下面的命令查看:

grep -e "(vme|svm)" /proc/cpuinfo | head -n 1
配置内核

内核中需要以下选项被启用:

CONFIG_VIRTUALIZATION
CONFIG_KVM

对于INTEL的CPU还需要选中下面的项:

CONFIG_KVM_INTEL

AMD的CPU需选中下面的项:

CONFIG_KVM_AMD

创建磁盘映像文件

操作系统总是要安装在磁盘上的,KVM通过磁盘映像文件来提供一个虚拟的磁 盘。创建磁盘映像文件的命令如下:

qemu-img create <filename.img>
<size>

例如下面的命令创建了一个5G大小的磁盘映像文件 os.img

qemu-img create os.img 5G

注意:目前KVM中此命令已更名为kvm-img

安装操作系统

创建完磁盘映像文件后就可以在其上安装操作系统了,下面是一个例子:

kvm -hda os.img \
-cdrom fedora.iso \
-usb -usbdevice tablet \
-localtime \
-m 256 \
-boot d

这个命令在磁盘映像文件os.img上安装fedora.iso操作 系统。选项-boot d表示从光驱来引导系统,这里用选项-cdrom fedora.iso指定了光驱中的内容就是光盘镜像文件 fedora.iso

启动磁盘映像文件中安装的系统

命令与前面安装系统的命令类似,只不过不需要指定选项-cdrom和 选项-boot d。此时,KVM从硬盘映像文件中进行系统的引导,例如:

kvm -hda os.img \
-usb -usbdevice tablet \
-localtime \
-m 256

KVM的monitor就是一个虚拟机的控制台,在这里你可以查看虚拟机的状态, 执行虚拟机的控制命令等。在虚拟机启动后,同时按下Ctrl+Alt+2即 可进入monitor。在monitor中可以使用help来查看其所支持的命令,通常情况下 help会输出很多行以致于我们无法看到所有的输出,此时可以按组合键 Shift+PageUp来向上翻页。要返回客户机中,可以同时按下 Ctrl+Alt+1来进行切换。

默认情况下KVM虚拟机的网络连接是通过其内置的NAT和DHCP服务器来形成了 一个私有的局域网,这种方式使得虚拟机在宿主主机的网络中不可见。但有时我 们可能就是希望这个虚拟机在宿主主机的网络系统中看起来就是一***立的主机 ,这事就需要采用网桥和TAP的方式进行连接。

首先,宿主主机的网络必须采用桥接的方式连接到其所在的网络中。例如:

ifconfig eth0 up prmisc 0.0.0.0 
brctl addbr br0
brctl addif eth0

上面的命令先将网卡eth0置于监听模式且不赋予其IP地址,创建了 一个网桥设备br0,最后将网卡eth0接到网桥上。网桥的配 置详见网桥配置指南。

简单地讲,TAP设备就是一个虚拟的网卡,其输入输出不是经过实际的网线而 是注册它的用户程序。用户程序向TAP中写入以太网数据帧,然后内核对其传递 ;来自于网络的以太网数据帧经内核处理后成为用户程序从TAP中读入的数据。 关于TAP的详细的说明参见TUN/TAP。

KVM打开TAP设备以实现与宿主的网络通信,KVM还可以在虚拟的客户机中虚拟 出一个网卡,它将这个虚拟的网卡收到的来自客户系统的数据都写入到TAP设备 中,同时也将从TAP中读入的数据转给客户机中的这个虚拟网卡。这样就实现了 虚拟机与主机的网络通讯。如果要让虚拟机直接参与宿主机所在的网络进行通信 ,我们可以通过将TAP设备所注册的网卡接到宿主机的网桥上。

下面是一个例子:

kvm -hda os.img \
-usb -usbdevice tablet \
-localtime \
-m 256 \
-net nic -net tap,ifname=tap0,script=no,downscript=no

选项-net nic表示要在客户机中虚拟出一个网卡,选项-net tap,ifname=tap0,script=no,downscript=no表示在宿主机中使用 TAP设备,其注册的网卡名为tap0,并且在启动关闭虚拟机是不执行系 统脚本。

在上面的命令执行后,虚拟机开始启动,这时我们还需要在宿主机中对TAP设 备进行配置,并将其接到网桥上。相关命令如下:

ifconfig tap0 up 0.0.0.0
brctl addif br0 tap0

KVM启动时加入选项-snapshot就得到了一个快照系统,对这个 系统的任何修改在系统关闭后自动消失。这个功能有点像硬盘保护卡,在系统关 闭时所有的对文件磁盘驱动器的写操作均消失。

通过使用snapshot选项你就获得了一个不怕攻击的系统,系统有了问题只要 重新启动就又回到了原来的样子。

但有时你希望某些修改被保留下来,这是你可以在monitor中使用commit命令来将此 时驱动器的状态保留下来,也就是真正地写入到驱动器中。例如:

commit <device>

相应的驱动器可由命令info block得到。

在monitor中先确定光驱的设备,然后在将其指向系统的文件或者光驱设备, 例如:

info block
change ide1-cd0 /dev/cdrom

要让虚拟机有声音,需要做两方面的工作:指定宿主机声音系统、指定虚拟 机的虚拟声卡类型。

我们可以通过特定的环境变量来告诉KVM宿主机的声音系统的种类。我用 的是ALSA系统,使用混音器来实现多个程序的声音同时输出,所以在执行KVM命 令前要进行如下的环境变量导出:

export QEMU_AUDIO_DRV=alsa
export QEMU_ALSA_DAC_DEV=dmix
export QEMU_ALSA_ADC_DEV=null

这里我不需要声音的输入,所以模数转换(ADC)设备变量 指定为null

虚拟机的虚拟声卡可以通过kvm的命令行选项soundhw来指定,例如 :

kvm -soundhw es1370

使用overlay

通过对一个磁盘映像文件创建overlay,我们可以让所有的写操作均作用到 overlay上,从而保持原映像文件的不变。这在我们配置好了一个基本系统想保 持其不变时很有用。

下面的命令为磁盘映像文件os.img创建了一个大小为2G 的overlay os.img.ovl

qemu-img create -b os.img -f qcow2 os.img.ovl
2G

注意:不能使用默认的raw格式,所以必须加-f选项。

用户的组属性

用户必须在组kvm中,如果要使用KVM的 usb_add功能,也就是要对usb设备进行写入操作,那么用户还必 须在组usb中。

可通过下面的命令添加用户到这两个组中去:

usermod -a -G usb,kvm <username>

用户在组usb中对于正常使用需要写权限的usb设备很重要,否 则就会出现下面的错误:

Could not add USB devic

但对于鼠标这类只需要读权限的usb设备,则并不需要用户在usb组 中。实际上,这是由系统的usb设备的节点访问属性决定的,例如:

$ ls -l /dev/bus/usb/001/
total 0
crw-rw-r-- 1 root usb 189, 0 May 23 14:34 001
crw-rw-r-- 1 root usb 189, 6 May 27 14:19 007

当然这设备的访问属性可以通过udev来进行设置 ,所以理论上将用户也可以不在usb中!

如果您的问题仍未解决,还可以加入服务器在线技术交流QQ群:8017413寻求帮助。


相关内容
最新热点内容