如何更换 OpenStack 默认的 Hypervisor

我们的云计算头节点这周到货了,采用的是 Dell PowerEdge R710,Intel Xeon CPU E5645 @2.40GHz (12 Cores), 4x300GB SAS (15K), 96GB 内存。这样的配置对于我们的头节点来说过于强大,我们可能考虑用 VMware ESXi 虚拟后用其中的一台虚拟机做 OpenStack/OpenNebula 头节点,用 VMware ESXi 有个问题,免费版本的 VMware ESXi 5.0 虚拟出来的单台虚拟机最多只能支持8核心,而这台服务器逻辑上有24核心,有点浪费。图片最上面的是头节点(Dell PowerEdge R710),中间的是计算节点(Dell PowerEdge M710HD),最下面的是存储。

dell poweredge r710

OpenStack 几乎支持现在所有主流的虚拟技术和 Hypervisor,如 KVM, Hyper-V, LXC, QEMU, UML, VMWare ESX/ESXi, Xen/XenServer 等,未来还会支持 OpenVZ 和 VirtualBox. 不过 OpenStack 首选的 Hypervisor 是 KVM,OpenStack 安装后默认使用的是 KVM (–libvirt_type=kvm),不需要特别配置。如果由于某种原因,比如服务器 CPU 不支持 Intel VT-x/AMD-V 不能使用 KVM 或者想简单尝试一下另外一种 Hypervisor 怎么办呢?方法很容易,1、更改 OpenStack Nova 的配置文件(–libvirt_type);2、给所有的 Compute 结点装上相应的 Hypervisor 就可以了。以下以 LXC 为例来说明如何更换 OpenStack Nova 的 Hypervisor,LXC 使用的是与 Xen 和 KVM 完全不同的虚拟技术,和 OpenVZ 的容器技术有点类似。

首先在所有 openstack nova compute 结点上替换现有的 nova-compute-kvm 到 nova-compute-lxc:

$ sudo apt-get install nova-compute-lxc

LXC 使用 cgroup 文件系统来限制资源和进程,libvirt 需要 cgroup 文件系统来运行 LXC,我们只要在 nova compute 上创建一个 ctroups 目录并且在 /etc/fstab 最后加上 none /cgroups cgroup cpuacct,memory,devices,cpu,freezer,blkio 0 0 这行就可以了,别忘了重启系统:

$ sudo mkdir /cgroups

$ vi /etc/fstab
none /cgroups cgroup cpuacct,memory,devices,cpu,freezer,blkio 0 0

$ sudo reboot

重启后可以看到 /cgroups 下面多了很多东西:

$ ls /cgroup/
blkio.io_merged                   cpu.shares
blkio.io_queued                   devices.allow
blkio.io_service_bytes            devices.deny
blkio.io_serviced                 devices.list
blkio.io_service_time             libvirt
blkio.io_wait_time                memory.failcnt
blkio.reset_stats                 memory.force_empty
blkio.sectors                     memory.limit_in_bytes
blkio.throttle.io_service_bytes   memory.max_usage_in_bytes
blkio.throttle.io_serviced        memory.memsw.failcnt
blkio.throttle.read_bps_device    memory.memsw.limit_in_bytes
blkio.throttle.read_iops_device   memory.memsw.max_usage_in_bytes
blkio.throttle.write_bps_device   memory.memsw.usage_in_bytes
blkio.throttle.write_iops_device  memory.move_charge_at_immigrate
blkio.time                        memory.numa_stat
blkio.weight                      memory.oom_control
blkio.weight_device               memory.soft_limit_in_bytes
cgroup.clone_children             memory.stat
cgroup.event_control              memory.swappiness
cgroup.procs                      memory.usage_in_bytes
cpuacct.stat                      memory.use_hierarchy
cpuacct.usage                     notify_on_release
cpuacct.usage_percpu              release_agent
cpu.rt_period_us                  tasks
cpu.rt_runtime_us

修改 OpenStack Nova 配置,将 nova-compute.conf 里面的 –libvirt_type=kvm 改成 lxc:

$ sudo vi /etc/nova/nova-compute.conf
--libvirt_type=lxc

$ sudo restart nova-compute

重启所有 nova compute 结点上的 nova-compute 服务,有必要的话重启所有 nova compute 结点。

那镜像怎么办呢?以前为 KVM 上传的镜像也可以用在 LXC 上吗?嗯,可以。下载 oneiric-server-cloudimg-amd64.tar.gz 解压并镜像到 OpenStack:

$ wget http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
$ tar zxvf oneiric-server-cloudimg-amd64.tar.gz

$ euca-bundle-image -i oneiric-server-cloudimg-amd64.img 
$ euca-upload-bundle -b oneiric -m /tmp/oneiric-server-cloudimg-amd64.img.manifest.xml 
$ euca-register oneiric/oneiric-server-cloudimg-amd64.img.manifest.xml

$ euca-describe-images 
IMAGE	ami-00000001	oneiric/oneiric-server-cloudimg-amd64.img.manifest.xml		available	private		x86_64	machine	 	 	instance-store

$ euca-run-instances -k vpsee -t m1.tiny ami-00000001

$ euca-describe-instances 
RESERVATION	r-4bbu7bd7	sanbi	default
INSTANCE	i-00000001	ami-00000001	172.16.39.6	172.16.39.6	running	vpsee (vpseecloud, node00)	0		m1.tiny	2012-01-20T08:04:05Z	nova	ami-00000000	ami-00000000

需要注意的是,OpenStack 目前不支持混合 Hypervisor,也就是说所有 nova compute 结点上必须使用同一种 Hypervisor,不过支持混合 Hypervisor 的 OpenStack 正在计划开发中。

Xen 支持的虚拟机类型

我们都知道 Xen 支持两种虚拟机类型:半虚拟化(paravirtualization)和全虚拟化(full virtualization),我们也知道 Xen 支持32位的和64位的虚拟机。决定 Xen 服务器是否能支持半虚拟化、全虚拟化、32位和64位的关键因素是处理器,即 CPU 的类型。

当 Xen 虚拟机运行在不支持虚拟化的硬件上的时候(CPU 不支持虚拟化),所有的内核和虚拟机(domains)都必须使用相同类型内存模型和指令大小。比如,如果使用的是 64位的 hypervisor 和 domain0,那么上面所有的 domainU 都必须是64位的或32位 PAE 的;同样,如果使用的是32位(带 PAE 内存扩展)的 xen 内核的话,那么所有在上面运行的 domainU 也都必须是32位(带 PAE 内存扩展)的。

当 Xen 虚拟机运行在支持虚拟化的硬件上、有了硬件的支持的时候(CPU 支持虚拟化),上面的限制就变得宽松多了,可支持的虚拟机类型范围要大多了。1个32位带 PAE 支持的 Xen 内核可以在上面运行1个不带 PAE 支持、全虚拟出来的 domainU;1个64位的 Xen 系统可以运行任何32位的 Linux domainU(包括半虚拟的 domainU 和全虚拟的 domainU);但是1个32位的 Xen 系统可以运行32位半虚拟的 domainU 而不能运行64位半虚拟的 domainU 了。所以 Xen 是向前兼容的,64位的 Xen 内核可以兼容运行32位PAE、纯32位的 domainU,但是不能反过来,32位的 Xen 内核不能运行64位的 domainU 等。

如果觉得上面的文字说明看得有点头昏,VPSee 整理了一个表格:

Hypervisor domain0 domainU (PV) domainU (HVM)
32bit 32bit 32bit 32bit
32bit PAE 32bit PAE 32bit PAE 32bit or 32bit PAE
64bit 64bit 64bit or 32bit PAE 32bit, 32bit PAE or 64bit

Intel VT(Virtualization Technology)和 AMD SVM(Secure Virtual Machine)是两大处理器生产商为了迎合虚拟化发展的趋势而在自己的处理器里直接增加对虚拟化技术的硬件支持。辨别自己的 CPU 是否支持虚拟技术很简单,只需要检查 cpuinfo 里面是否带有虚拟化标志,如果使用的是 Intel CPU,那么 flags 里应该有 vms 字样;如果使用 AMD CPU,那么 flags 里应该可以找到 svm,下面是 VPSee 在一台 SUN Fire X2100 服务器上打印的结果:

# cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov 
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy

注意:如果已经启动到 Xen 系统中, cat /proc/cpuinfo | grep flags 将在默认情况下不会显示 vmx 或 svm 标志位,只有在安装 Xen 前的纯 Linux 内核下才可以看到。还有就是,确定 BIOS 中打开了 Intel VT 或 AMD SVM 虚拟化的支持。

通常安装完 Xen 后,Xen 就能自动识别出系统支持哪几种虚拟机类型。只需要简单打印出 Xen 虚拟机的兼容名单就可以看出来:

# cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64

上面打印出来的内容表示这个系统可以运行 64位 domains(xen-3.0-x86_64)、32位带 PAE 的 domains(xen-3.0-x86_32p)、32位全虚拟化 domains(hvm-3.0-x86_32)、32位带 PAE 全虚拟化 domains(hvm-3.0-x86_32p)、64位全虚拟化 domains(hvm-3.0-x86_64).

在普通 Linux 下面的 /proc 里包含了一些运行时的 Linux 内核参数可以查看和修改,和 /proc 的作用类似,在 Xen 里面 /sys 里包含了 xen hypervisor 的一些参数。如果在你的 Xen 系统上没有发现 /sys/hypervisor,多半时因为在配置 Xen 内核的时候没有选择上 XEN_SYSFS,重新配置、编译和安装 带 Xen 的 Linux 内核就可以了。

在自己的 IT 环境里部署 Xen 虚拟化前需要了解一下自身 IT 环境的一些特点,比如:用户的使用类型(将在虚拟机上干什么?),需要运行的应用(是否某应用程序必须运行在老的32位的系统上?)等,这样方便选购服务器、迁移平台和应用以及部署虚拟化。