OpenNebula可以管理众多虚拟资源,包括镜像库(datastore)、镜像(image)、虚拟网(vnet)、主机(host)、虚拟机(vm)。
我们先对各虚拟资源进行简单介绍。
镜像库:镜像库是用来存放镜像的一个文件夹,我们会把这个文件夹注册到OpenNebula中,以作后用。
镜像:一个文件,类似于压缩包一样的容器。镜像中可能是一个操作系统,也可能是一些数据。
虚拟网:为虚拟机准备的网络资源池,用于分配虚拟机网络资源。
主机:云中的物理主机,上面运行着虚拟化软件,用来部署虚拟机。
虚拟机:就是虚拟机了,没啥好说的。
现在,我们先确立一个目标,那就是在host上运行起一个虚拟机。要达到这个目标,我们需要做下面几步。
为了让OpenNebula管理和利用这些虚拟资源,我们需要对OpenNebula进行一些配置。
OpenNebula的配置文件位于/srv/cloud/one/etc/oned.conf中。
下面,我们就该文件中几个关键配置说明一下。
(1)DATASTORE_LOCATION
DATASTORE_LOCATION = /srv/cloud/one/var/datastores
该选项配置了镜像库的基础路径。
(2)IM_MAD
IM_MAD = [
name = "im_kvm",
executable = "one_im_ssh",
arguments = "-r 0 -t 15 kvm" ]
IM_MAD = [
name = "im_xen",
executable = "one_im_ssh",
arguments = "xen" ]
IM_MAD配置了OpenNebula的Information Driver,Information Driver是用来对物理主机上的虚拟化进行监控的一些驱动(其实是一些脚本)。IM_MAD中有以下几个了选项:name表示了驱动的名字,executable指定了驱动对应的脚本文件的位置,而arguments则是脚本文件所需要的参数。
oned.conf中预定义了很多IM_MAD,分别对应了不同的监控方式:kvm,xen,vmware,ec2,ganglia等等。因为我们的物理主机上运行的是xen虚拟化,我们就直接用xen的监控方式。oned.conf中默认开户的是KVM的IM_MAD,xen的IM_MAD是被注释掉的。开启xen的IM_MAD的方法,就是把前面的注释去掉。
(3)VM_MAD
VM_MAD = [
name = "vmm_kvm",
executable = "one_vmm_exec",
arguments = "-t 15 -r 0 kvm",
default = "vmm_exec/vmm_exec_kvm.conf",
type = "kvm" ]
VM_MAD = [
name = "vmm_xen",
executable = "one_vmm_exec",
arguments = "-t 15 -r 0 xen",
default = "vmm_exec/vmm_exec_xen.conf",
type = "xen" ]
VM_MAD定义了OpenNebula的Virtualization Driver,Virtualization Driver是对物理机上的虚拟机进行管理(创建、删除、迁移等等)的驱动(其实就是些脚本)。VM_MAD中有以下几个了选项:name表示了驱动的名字,executable指定了驱动对应的脚本文件的位置,而arguments则是脚本文件所需要的参数。
针对不同的虚拟化环境,OpenNebula同样定义了多种VM_MAD:kvm,xen,vmware,ec2。我们要用到xen对应的VM_MAD,开启的方式就是把注释去掉。
(4)TM_MAD
TM_MAD = [
executable = "one_tm",
arguments = "-t 15 -d dummy,lvm,shared,qcow2,ssh,vmfs,iscsi" ]
TM_MAD定义了Transfer Manager,即OpenNebula与物理主机之间传输镜像的方式,有lvm,shared,qcow2,ssh,vmfs,iscsi等等。这里我们不用改。
(5)DATASTORE_MAD
DATASTORE_MAD = [
executable = "one_datastore",
arguments = "-t 15 -d fs,vmware,vmfs,iscsi,lvm"
]
DATASTORE_MAD定义了管理datastore的方式。这里同样不用改。
根据以上的配置说明,修改完oned.conf后,使用以下命令重启一下opennebula,使配置生效。
$ one stop
$ one start
Datastore是用来存放镜像的一个存储仓库,它有以下几种类型,参考2.1(5)。
System:比较特殊的一种类型,只用来存放正在运行的虚拟机(running vm)的镜像。
File-system:以普通文件的方式存放镜像。
iSCSI/LVM:以块设备的方式存放镜像。
VMware:以vmdk的格式存放镜像,对为了支持VMware。
vmfs:以VMFS的格式存放镜像,也是为了支持VMware。
简单起见,我们就使用File-system的方式。
因为host只有获取了镜像才能部署虚拟机,所以,我们要用一定的机制将镜像传送到Host。这个机制就是datastore的另一个属性,即Transfer Manager,它定义了OpenNebula与物理主机之间传输镜像的方式,参考2.2(5),即:
shared:将datastore里的镜像以文件共享的方式挂载到host上,这样host就可以像访问本地文件一样访问datastore里的镜像。常见的文件共享方式有NFS。
ssh:这个方法比较笨重,就是将镜像通过scp传送到host上。
iscsi:通过iSCSI的方式分享镜像,与shared方式有点像。
vmfs:通过VMware的工具vmkfstools去传输镜像(具体不详)。
qcow:通过qemu-qcow的形式传输镜像,据说它的快照功能很好(具体不说)。
简单起见,我们选用shared方式。
现在,我们选用了file-system和shared,我们就用onedatastore create命令创建一个datastore。
首先,我们需要写一个datastore配置文件,比方说叫ds.conf
NAME = cloud
DS_MAD = fs
TM_MAD = shared
然后,
$ onedatastore create ds.conf
就可以了。
可以用onedatastore list查看一下。
ID NAME CLUSTER IMAGES TYPE TM
0 system - 0 - shared
1 default - 1 fs shared
100 cloud - 0 fs shared
其中的100号就是我们刚刚创建的。
现在,我们有了datastore,就可以注册镜像了。
我们有一个ubuntu12.04的镜像存放在/home/ubuntu2.img,我们要将其注册到opennebula中,以做后用。
其实,所说的注册,原理很简单,就是把/home/ubuntu2.img拷贝一份,放到datastore中,并把这个镜像注册到OpenNebula的数据库中,被OpenNebula管理起来。
镜像可分为Persistent和non-persistent两种。persistent表示虚拟机直接从该镜像启动,虚拟机启动后操作所引起的变动都会保留在镜像中,即使虚拟机关闭了,变动也是会保存在镜像中的。而non-persistent表示这个镜像相当于一个master镜像,每启动一个虚拟机,都需要从该master镜像拷贝一个复本,然后从复本启动虚拟机。虚拟机关闭后,该复本会被删除,虚拟机的操作变动不会被保存。
persistent镜像只可以启动一个虚拟机,而non-persistent镜像可以启动多个虚拟机。道理其实很简单,你自己想想吧。
我们先注册一个persistent的镜像。 同2.2一样,我们首先需要一个配置文件,比方说叫image.conf
NAME = ubuntu12.04
PERSISTENT = YES
PATH = "/home/ubuntu2.img"
TYPE = OS
DESCRIPTION = "ubuntu12.04"
然后用oneimage create命令注册,并且,我们需要-d参数指定datastore。
$ oneimage create image.conf –d 100
然后,用oneimage list查看该镜像
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS
4 root oneadmin ubuntu12.04 cloud 20G OS Yes rdy 0
我们再写一个镜像配置文件,注册一个Non-persistent的镜像。
NAME = ubuntu12.04-np
PERSISTENT = NO
PATH = "/home/ubuntu2.img"
TYPE = OS
DESCRIPTION = "ubuntu12.04"
$ oneimage create image.conf –d 100
然后,用oneimage list查看该镜像
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS
4 root oneadmin ubuntu12.04-3 cloud 20G OS Yes rdy 0
5 root oneadmin ubuntu12.04-3-np cloud 20G OS No rdy 0
我们看到,4号是persistent的,5号是non-persistent的。
现在,我们有镜像了,我们离目标越来越近了。但是,有了镜像好像还不太够,我们还需要为虚拟机准备一下网络。
vnet分为两种,fixed和ranged。顾名思义,fixed vnet用来给虚拟机提供固定的ip地址,而ranged vnet则定义了一个地址范围,虚拟机可以从这个地址范围里取地址用。
这很好理解,我们不必细说,直接看一个fiexed vnet的配置文件的例子。
NAME = "Cloud"
TYPE = FIXED
# We have to bind this network to ''virbr1'' for Internet Access
BRIDGE = br0
LEASES = [IP=192.168.0.1]
LEASES = [IP=192.168.0.2, MAC=50:20:20:20:20:21]
LEASES = [IP=192.168.0.3]
LEASES = [IP=192.168.0.4]
# Custom Attributes to be used in Context
GATEWAY = 192.168.0.1
DNS = 10.10.0.21
其中的TYPE字段表示该vnet的类型,BRIDGE字段定义了该虚拟网绑定的网桥(注:虚拟机是通过物理主机上的网桥组成一个局域网的)。LEASES字段可以有多个,定义了可用的IP,GATEWAY和DNS分别定义了网关和域名服务器。
下面再看一个ranged vnet的配置文件,文件名字叫range.net
NAME = "Cloud"
TYPE = RANGED
BRIDGE = br0
NETWORK_ADDRESS = 10.214.1.0
IP_START = 10.214.1.155
IP_END = 10.214.1.160
NETWORK_MASK = 255.255.255.0
DNS = 10.10.0.21
不同的是,现在没有了LEASES字段,而通过NETWORK_ADDRESS,IP_START,IP_END定义了一个IP地址范围。
因为我们有一个10.214.1.155到10.214.1.160的地址范围可用,我们就用range.net这个配置文件成一个名叫cloud的ranged vnet吧。我们要用到onevnet create命令。
onevnet create range.net
再用onevnet list查看一下,查询到如下结果
ID USER GROUP NAME CLUSTER TYPE BRIDGE LEASES
0 root oneadmin Cloud - R br0 1
现在,我们有了镜像,有了网络,是不是就可以创建虚拟机了?错,不能忘了最重要的一环,那就是虚拟机需要运行在安装着虚拟化的物理主机上。我们需要将这些物理机注册到OpenNebula中,以作后用。
比方说,现在我们有一个物理机,它的IP是10.214.1.152,安装的ubuntu-server 12.04,它上面运行着xen hypervisor,安装的方法很多,但不在本文的讨论范围。
OpenNebula自己准备了很多ruby脚本,这些脚本会被传送到10.214.1.152上,用来控制它上面的xen hypervisor。所以,10.214.1.151必须有ruby(版本必须大于1.8.7)的运行环境。所以,我们要用以下命令安装ruby。
$ apt-get install ruby1.9.1 #我直接安装了一个最新的版本
另外,host上面需要一个网桥br0,用以连接host上运行的虚拟机。
我们通过修改/etc/network/interfaces文件来创建网桥。
auto lo
iface lo inet loopback
auto br0 eth0
allow-hotplug eth0
iface br0 inet static
bridge_ports eth0
address 10.214.1.151
netmask 255.255.255.0
gateway 10.214.1.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 10.10.0.21
然后,重启一下网络就可以了。
$ /etc/init.d/networking restart
可以用brctl show查看一下
bridge name bridge id STP enabled interfaces
br0 8000.e0db5507e3a0 no eth0
OpenNebula与host之间还需要有以下几个关系:
(1) OpenNebula可以免密钥访问host——参考1.4,1.5
(2) OpenNebula的/etc/hosts文件中,有host的IP与主机名的定义。比方说我们的10.214.1.151的主机名就是xen1-yq(以后,我们就这样叫它)。
现在,我们可以用onehost create命令注册host到OpenNebula中了。
$ onehost createxen1-yq -i im_xen -v vmm_xen -n dummy
这里有好多参数,我们需要解释一下。
create后面直接跟的host的主机名。
-i:IM_MAD
-v:VMM_MAD
-n:网络驱动
2.1中我们已经介绍过IM_MAD和VMM_MAD,就不赘述了。
网络驱动是OpenNebula定义的一系列提高网络配置能力的驱动,有很多选择(802.1Q VLAN, Ebtables, Open vSwitch, VMware Networking,FileWall等),而我们用到的dummy,就是“空”的意思,表示不使用以上选择,就使用2.4中简单的网桥方式。所以,never mind,你就用dummy就可以了。
好了,host注册成功了。我们用onehost list查看一下。
ID NAME CLUSTER RVM ALLOCATED_CPU ALLOCATED_MEM STAT
15 xen1-yq - 0 100 / 2400 (4%) 1024M / 64G (1%) on
终于看到曙光了。
现在,我们经过不懈的努力,准备好了镜像(image)、网络(vnet)、物理主机(host)。
万事俱备,只欠东风。
我们需要先起草一个vm的配置文件,然后从该配置文件启动虚拟机。我们废话不多说,直接上配置文件,比方说名字叫vm.conf。
CPU = 0.1
MEMORY = 1024
DISK = [
image_id = 4,
target = xvda,
driver = "file:",
clone = "no",
readonly = "no"
]
OS = [
# KERNEL="/image-pool/kernel/vmlinuz-3.2.0-32-generic",
# INITRD="/image-pool/kernel/initrd.img-3.2.0-32-generic",
BOOTLOADER= /usr/local/bin/pygrub,
ROOT = "xvda"
]
NIC = [
NETWORK_ID = 0
]
#GRAPHICS = [
# type = vnc,
# vncunused = 1
#]
CONTEXT = [
driver = "file:",
hostname = "$NAME",
ip = "$NIC[IP]",
netmask = "$NETWORK[NETWORK_MASK,NETWORK_ID=0]",
dns = "$NETWORK[DNS,NETWORK_ID=0]",
files = "/image-pool/template/vm/init.sh /image-pool/template/vm/id_rsa.pub",
target = "xvdb"
]
有点长,不急,我们慢慢来解释一下。
可以看到,配置文件里有以下几个配置项:
(1)CPU:表示虚拟分配到的host的CPU的百分比。
(2)MEMORY:内存大小。
(3)DISK:汉语意思是盘,你可以把它理解成虚拟机的硬盘。这个硬盘绑定了一个镜像(image_id = 4)。还记得2.3中我们创建的4号镜像吗?对,就是它。我们要用这个镜像当我们虚拟机的操作系统盘。
target=xvda表示该盘在操作系统中绑定的块设备是xvda。
driver=”file:”表示块设备的类型就是普通文件。
clone=”no”表示该盘不能被克隆。
readonly=”no”表示这个盘是可写的。
(4)OS:定义了虚拟机的启动方式。可以是内核,也可以是bootloader的方式。
(5)NIC:指定虚拟机使用的网络。还记得2.4中我们创建的0号虚拟网吗,对,就是它。这个设置项会帮助虚拟机从0号网络的IP地址范围(10.214.1.155-10.214.1.160)中挑选一个可用的IP。
(6)GRAPHIC:这是虚拟机的远程控制的设置,还不是很懂,先略过了。
(7)CONTEXT:是Contextualization的简写,可以理解为“初始化”的意思。这是OpenNebula中很有意思的一个机制。虚拟启动之后,需要在经过一些初始化工作之后,才能正常为用户工作,比如说:设置IP地址、netmask、gateway、dns,修改主机名,设置无密钥ssh等等。然而,设置这些东西,就需要我们事先将一些变量和文件传到虚拟机的镜像中,然后用脚本调用这些变量和文件去设置。CONTEXT就是为完成这个工作而生。
CONTEXT有三个固定配置项,driver和target同(3),file定义了欲传到虚拟机中的文件。
其它的配置项hostname,ip,netmask,dns都是我们自定义的变量(你可以根据自己的需要定义更多的变量)。这些变量会被放到一个文件context.sh中,同file定义的文件一起,被生成为一个iso文件,绑定到target上。
然后呢,绑定到target上又如何?你如何去使用这些变量和文件呢?当然有办法。我们只要修改虚拟机镜像中的/etc/rc.local,在其中写一些设置脚本,这样,虚拟机启动之后,就会自动执行/etc/rc.local中的脚本。我们来看一下/etc/rc.local中的脚本:
mount -t iso9660 /dev/xvdb /mnt
if [ -f /mnt/init.sh ]; then
. /mnt/init.sh
fi
umount -l /mnt
脚本先把/dev/xvdb挂载到/mnt下面,这样,/mnt下面就有了三个文件(context.sh, init.sh, id_rsa.pub),然后执行/mnt/init.sh脚本。init.sh执行了一系列的初始化工作。我们再看一下init.sh的具体内容:
if [ -f /mnt/context.sh ]; then
. /mnt/context.sh
fi
if [ -n "$HOSTNAME" ]; then
echo $HOSTNAME > /etc/hostname
hostname $HOSTNAME
fi
if [ -n "$IP" ]; then
ifconfig eth0 $IP
fi
if [ -n "$NETMASK" ]; then
ifconfig eth0 netmask $NETMASK
fi
# NETMASK = "255.255.128.0"
# ifconfig eth0 netmask 255.255.128.0
if [ -n "$DNS" ]; then
ifconfig eth0 dns-nameservers $DNS
fi
if [ -f /mnt/id_rsa.pub ]; then
cat /mnt/id_rsa.pub > /root/.ssh/authorized_keys
fi
这段脚本,相信有一定LINUX背景的看官都能理解,我就不废话了。
对了,我觉得大家可能会好奇context.sh里到底有什么内容,我不防贴出来看看。
DISK_ID="1"
DNS="10.10.0.21"
DRIVER="file:"
FILES="/image-pool/template/vm/init.sh /image-pool/template/vm/id_rsa.pub"
HOSTNAME="one-25"
IP="10.214.1.155"
NETMASK="255.255.255.0"
TARGET="xvdb"
—————————————分水岭———————————————————————
好了,vm的配置文件说完了,我们可以创建虚拟机了。
我们要用到onevm create命令
$ onevm create vm.conf
成功了,我们先用onevm list看一下
IDUSER GROUP NAME STAT UCPU UMEM HOST TIME
25 root oneadmin one-25 pend 0 1024M - 0d 01h58
已经有人欢呼了???
先别急,我们只是注册了一个虚拟机,还没有运行起来。要运行虚拟机,我们得指定一个host才行,就用2.5中注册的xen1-yq吧,它的ID号是15。我们用onevm deploy命令来启动一个虚拟机。
$ onevm deploy 25 15
后面分别是虚拟机和host的ID号。
好了,等个一小会,虚拟机的状态就变成running了。
$ onevm list
IDUSER GROUP NAME STAT UCPU UMEM HOST TIME
25 root oneadmin one-25 runn 0 1024M xen1-yq 0d 02h04
既然创建成功了,我们不防ssh进去玩玩。我们首先需要知道它的IP地址。
$ onevm show 25
VIRTUAL MACHINE 25 INFORMATION
ID : 25
NAME : one-25
USER : root
GROUP : oneadmin
STATE : ACTIVE
LCM_STATE : RUNNING
RESCHED : No
HOST : xen1-yq
START TIME : 11/07 14:03:00
END TIME : -
DEPLOY ID : one-25
VIRTUAL MACHINE MONITORING
NET_TX : 2.8M
USED CPU : 0
USED MEMORY : 1024M
NET_RX : 90K
PERMISSIONS
OWNER : um-
GROUP : ---
OTHER : ---
VIRTUAL MACHINE TEMPLATE
CONTEXT=[
DISK_ID="1",
DNS="10.10.0.21",
DRIVER="file:",
FILES="/image-pool/template/vm/init.sh /image-pool/template/vm/id_rsa.pub",
HOSTNAME="one-25",
IP="10.214.1.155",
NETMASK="255.255.255.0",
TARGET="xvdb" ]
CPU="1"
DISK=[
CLONE="NO",
DATASTORE="cloud",
DATASTORE_ID="100",
DEV_PREFIX="hd",
DISK_ID="0",
DRIVER="file:",
IMAGE="ubuntu12.04-3",
IMAGE_ID="4",
PERSISTENT="YES",
READONLY="NO",
SAVE="YES",
SOURCE="/srv/cloud/one/var/datastores/100/a82229efdf6fecc286509492fb614f7b",
TARGET="xvda",
TM_MAD="shared",
TYPE="FILE" ]
MEMORY="1024"
NAME="one-25"
NIC=[
BRIDGE="br0",
IP="10.214.1.155",
MAC="02:00:0a:d6:01:9b",
NETWORK="Cloud",
NETWORK_ID="0",
VLAN="NO" ]
OS=[
BOOTLOADER="/usr/local/bin/pygrub",
ROOT="xvda" ]
VMID="25"
VIRTUAL MACHINE HISTORY
SEQ HOST REASON START TIME PROLOG_TIME
0 xen1-yq none 11/07 14:03:02 0d 02h08m12s 0d 00h00m05s
好大一砣!不用管它,找到其中的ip就行了,是10.214.1.155,然后,我们冷酷地在命令行输入
ssh 10.214.1.155
行了,居然不用输入密码!!!对,要的就是这个效果。
尽情地在这个小虚拟机里面遨游吧!
作者:BugTeaser
转载请注明出处