KVM - 虚拟化解决方案

简介

KVM(Kernel-based Virtual Machine 基于内核的虚拟机) 是具备Intel VT或 AMD-V功能的 x86 平台全虚拟化解决方案,它包含一个为处理器提供底层虚拟化可加载的核心模块kvm.ko (kvm-intel.ko或kvm-AMD.ko)。仅有KVM模块是远远不够的, KVM内核模块本身只能提供CPU和内存的虚拟化,用户无法直接控制内核模块去作事情,KVM还需要一个经过修改的 Qemu 软件作为虚拟机上层控制,才能构成一个完成的虚拟化技术。 Qemu 也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出可运行在Power上的程序。

安装

apt-get install qemu-kvm libvirt-bin [1]

KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具 QEMU-KVM。 [2] QEMU-KVM 通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。KVM 实现了cpu和内存的虚拟化,qemu模拟IO设备。

QEMU-KVM 工具效率不高,不易于使用,RedHat 为 KVM 开发了更多的辅助工具,比如 libvirt

libvirt 是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持 Xen 等其他虚拟机,而且一些常用的虚拟机管理工具(如 virshVirt-install 、virt-manager等)和云计算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。

为了方便管理虚拟机,应该把当前的操作用户加入 kvm 与 libvirt 组。这样就可以使用 virsh 命令了。

使用

设置桥接网络

默认情况下,Qemu 会给 客户机提供 NAT 网络,这种情况下主机和客户机访问不到对方。为了给客户机提供完整的网络访问权限,应该创建网桥。 [3]

apt-get install bridge-utils

修改 /etc/network/interfaces文件,让网桥br0代理eth0。配置完成后,在客户机中使用网桥接口。

# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto br0
iface br0 inet static
  address 10.10.10.70
  netmask 255.255.255.0
  gateway 10.10.10.10
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0

创建新的主机

virtinst 提供命令行 Virt-install 来创建虚拟机。

apt-get install virtinst

virt-install
  --connect qemu:///system \
  --virt-type kvm \
  --name demo \
  --memory 500 \
  --disk size=20 \
  --cdrom /var/lib/libvirt/boot/debian-8.5.0-amd64-netinst.iso \
  --os-variant debianwheezy \
  --network bridge=br0 \
  --noautoconsole \
  --graphics vnc,password=XYZ12345,listen=0.0.0.0

创建成功后使用 virsh -c qemu:///system list –all 查看虚拟机状态,running 状态表示创建启动成功,使用 VNC 客户端连接服务器即可完成安装。

如果需要预置自动安装请参考 preseed [4] .

启动与停止

在登录常规用户的情况下 libvirt 默认情况会使用 qemu:///session 域,添加 -c qemu:///system 选项可使用 qemu:///system 域。

查看客户机列表

virsh -c qemu:///system list --all

停止一个客户机

virsh -c qemu:///system shutdown demo

如果停止失败,可以强制停止

virsh -c qemu:///system destroy demo

启动客户机

virsh -c qemu:///system start demo

设置虚拟机开机启动

virsh autostart alice

参考文献

[1]KVM-Debian Wiki
[2]虚拟化之QEMU与KVM
[3]BridgeNetworkConnections
[4]preseed