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对于INTEL的CPU还需要选中下面的项:
CONFIG_KVM_INTEL
AMD的CPU需选中下面的项:
CONFIG_KVM_AMD
创建磁盘映像文件操作系统总是要安装在磁盘上的,KVM通过磁盘映像文件来提供一个虚拟的磁 盘。创建磁盘映像文件的命令如下:
qemu-img create
例如下面的命令创建了一个5G大小的磁盘映像文件 os.img:
qemu-img create os.img 5G
注意:目前KVM中此命令已更名为kvm-img
安装操作系统创建完磁盘映像文件后就可以在其上安装操作系统了,下面是一个例子:
kvm -hda os.img \这个命令在磁盘映像文件os.img上安装fedora.iso操作 系统。选项-boot d表示从光驱来引导系统,这里用选项-cdrom fedora.iso指定了光驱中的内容就是光盘镜像文件 fedora.iso。
启动磁盘映像文件中安装的系统命令与前面安装系统的命令类似,只不过不需要指定选项-cdrom和 选项-boot d。此时,KVM从硬盘映像文件中进行系统的引导,例如:
kvm -hda os.img \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上面的命令先将网卡eth0置于监听模式且不赋予其IP地址,创建了 一个网桥设备br0,最后将网卡eth0接到网桥上。网桥的配 置详见网桥配置指南。
简单地讲,TAP设备就是一个虚拟的网卡,其输入输出不是经过实际的网线而 是注册它的用户程序。用户程序向TAP中写入以太网数据帧,然后内核对其传递 ;来自于网络的以太网数据帧经内核处理后成为用户程序从TAP中读入的数据。 关于TAP的详细的说明参见TUN/TAP。
KVM打开TAP设备以实现与宿主的网络通信,KVM还可以在虚拟的客户机中虚拟 出一个网卡,它将这个虚拟的网卡收到的来自客户系统的数据都写入到TAP设备 中,同时也将从TAP中读入的数据转给客户机中的这个虚拟网卡。这样就实现了 虚拟机与主机的网络通讯。如果要让虚拟机直接参与宿主机所在的网络进行通信 ,我们可以通过将TAP设备所注册的网卡接到宿主机的网桥上。
下面是一个例子:
kvm -hda os.img \选项-net nic表示要在客户机中虚拟出一个网卡,选项-net tap,ifname=tap0,script=no,downscript=no表示在宿主机中使用 TAP设备,其注册的网卡名为tap0,并且在启动关闭虚拟机是不执行系 统脚本。
在上面的命令执行后,虚拟机开始启动,这时我们还需要在宿主机中对TAP设 备进行配置,并将其接到网桥上。相关命令如下:
ifconfig tap0 up 0.0.0.0KVM启动时加入选项-snapshot就得到了一个快照系统,对这个 系统的任何修改在系统关闭后自动消失。这个功能有点像硬盘保护卡,在系统关 闭时所有的对文件磁盘驱动器的写操作均消失。
通过使用snapshot选项你就获得了一个不怕攻击的系统,系统有了问题只要 重启就又回到了原来的样子。
但有时你希望某些修改被保留下来,这是你可以在monitor中使用commit命令来将此 时驱动器的状态保留下来,也就是真正地写入到驱动器中。例如:
commit相应的驱动器可由命令info block得到。
在monitor中先确定光驱的设备,然后在将其指向系统的文件或者光驱设备, 例如:
info block要让虚拟机有声音,需要做两方面的工作:指定宿主机声音系统、指定虚拟 机的虚拟声卡类型。
我们可以通过特定的环境变量来告诉KVM宿主机的声音系统的种类。我用 的是ALSA系统,使用混音器来实现多个程序的声音同时输出,所以在执行KVM命 令前要进行如下的环境变量导出:
export QEMU_AUDIO_DRV=alsa这里我不需要声音的输入,所以模数转换(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用户在组usb中对于正常使用需要写权限的usb设备很重要,否 则就会出现下面的错误:
Could not add USB devic但对于鼠标这类只需要读权限的usb设备,则并不需要用户在usb组 中。实际上,这是由系统的usb设备的节点访问属性决定的,例如:
$ ls -l /dev/bus/usb/001/当然这设备的访问属性可以通过udev来进行设置 ,所以理论上将用户也可以不在usb中!