当前位置: 首页 > 工具软件 > OpenNebula > 使用案例 >

OpenNebula使用文档

米承嗣
2023-12-01

OpenNebula可以管理众多虚拟资源,包括镜像库(datastore)、镜像(image)、虚拟网(vnet)、主机(host)、虚拟机(vm)。

我们先对各虚拟资源进行简单介绍。

镜像库:镜像库是用来存放镜像的一个文件夹,我们会把这个文件夹注册到OpenNebula中,以作后用。

镜像:一个文件,类似于压缩包一样的容器。镜像中可能是一个操作系统,也可能是一些数据。

虚拟网:为虚拟机准备的网络资源池,用于分配虚拟机网络资源。

主机:云中的物理主机,上面运行着虚拟化软件,用来部署虚拟机。

虚拟机:就是虚拟机了,没啥好说的。

 

现在,我们先确立一个目标,那就是在host上运行起一个虚拟机。要达到这个目标,我们需要做下面几步。

2.1 OpenNebula基本配置

为了让OpenNebula管理和利用这些虚拟资源,我们需要对OpenNebula进行一些配置。

OpenNebula的配置文件位于/srv/cloud/one/etc/oned.conf中。

下面,我们就该文件中几个关键配置说明一下。

1DATASTORE_LOCATION

DATASTORE_LOCATION = /srv/cloud/one/var/datastores

该选项配置了镜像库的基础路径。

2IM_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配置了OpenNebulaInformation DriverInformation Driver是用来对物理主机上的虚拟化进行监控的一些驱动(其实是一些脚本)。IM_MAD中有以下几个了选项:name表示了驱动的名字,executable指定了驱动对应的脚本文件的位置,而arguments则是脚本文件所需要的参数。

oned.conf中预定义了很多IM_MAD,分别对应了不同的监控方式:kvmxenvmwareec2ganglia等等。因为我们的物理主机上运行的是xen虚拟化,我们就直接用xen的监控方式。oned.conf中默认开户的是KVMIM_MADxenIM_MAD是被注释掉的。开启xenIM_MAD的方法,就是把前面的注释去掉。

3VM_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定义了OpenNebulaVirtualization DriverVirtualization Driver是对物理机上的虚拟机进行管理(创建、删除、迁移等等)的驱动(其实就是些脚本)。VM_MAD中有以下几个了选项:name表示了驱动的名字,executable指定了驱动对应的脚本文件的位置,而arguments则是脚本文件所需要的参数。

针对不同的虚拟化环境,OpenNebula同样定义了多种VM_MADkvmxenvmwareec2。我们要用到xen对应的VM_MAD,开启的方式就是把注释去掉。

4TM_MAD

TM_MAD = [

    executable = "one_tm",

    arguments  = "-t 15 -d dummy,lvm,shared,qcow2,ssh,vmfs,iscsi" ]

TM_MAD定义了Transfer Manager,即OpenNebula与物理主机之间传输镜像的方式,有lvmsharedqcow2sshvmfsiscsi等等。这里我们不用改。

5DATASTORE_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

2.2 管理镜像库(datastore

Datastore是用来存放镜像的一个存储仓库,它有以下几种类型,参考2.1(5)

System比较特殊的一种类型,只用来存放正在运行的虚拟机(running vm)的镜像。

File-system以普通文件的方式存放镜像。

iSCSI/LVM以块设备的方式存放镜像。

VMwarevmdk的格式存放镜像,对为了支持VMware

vmfsVMFS的格式存放镜像,也是为了支持VMware

简单起见,我们就使用File-system的方式。

 

因为host只有获取了镜像才能部署虚拟机,所以,我们要用一定的机制将镜像传送到Host。这个机制就是datastore的另一个属性,即Transfer Manager,它定义了OpenNebula与物理主机之间传输镜像的方式,参考2.2(5),即:

shareddatastore里的镜像以文件共享的方式挂载到host上,这样host就可以像访问本地文件一样访问datastore里的镜像。常见的文件共享方式有NFS

ssh这个方法比较笨重,就是将镜像通过scp传送到host上。

iscsi通过iSCSI的方式分享镜像,与shared方式有点像。

vmfs通过VMware的工具vmkfstools去传输镜像(具体不详)。

qcow通过qemu-qcow的形式传输镜像,据说它的快照功能很好(具体不说)。

 

简单起见,我们选用shared方式。

 

现在,我们选用了file-systemshared,我们就用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号就是我们刚刚创建的。

 

2.3 管理镜像(image

现在,我们有了datastore,就可以注册镜像了。

         我们有一个ubuntu12.04的镜像存放在/home/ubuntu2.img,我们要将其注册到opennebula中,以做后用。

         其实,所说的注册,原理很简单,就是把/home/ubuntu2.img拷贝一份,放到datastore中,并把这个镜像注册到OpenNebula的数据库中,被OpenNebula管理起来。

镜像可分为Persistentnon-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的。

2.4 管理虚拟网(vnet

         现在,我们有镜像了,我们离目标越来越近了。但是,有了镜像好像还不太够,我们还需要为虚拟机准备一下网络。

         vnet分为两种,fixedranged。顾名思义,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字段可以有多个,定义了可用的IPGATEWAYDNS分别定义了网关和域名服务器。

下面再看一个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_ADDRESSIP_STARTIP_END定义了一个IP地址范围。

因为我们有一个10.214.1.15510.214.1.160的地址范围可用,我们就用range.net这个配置文件成一个名叫cloudranged vnet吧。我们要用到onevnet create命令。

onevnet create range.net

再用onevnet list查看一下,查询到如下结果

 ID USER         GROUP        NAME            CLUSTER      TYPE BRIDGE   LEASES

  0 root         oneadmin       Cloud           -               R    br0      1

2.5 管理物理主机(host

         现在,我们有了镜像,有了网络,是不是就可以创建虚拟机了?错,不能忘了最重要的一环,那就是虚拟机需要运行在安装着虚拟化的物理主机上。我们需要将这些物理机注册到OpenNebula中,以作后用。

         比方说,现在我们有一个物理机,它的IP10.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

 

OpenNebulahost之间还需要有以下几个关系:

(1)   OpenNebula可以免密钥访问host——参考1.41.5

(2)    OpenNebula/etc/hosts文件中,有hostIP与主机名的定义。比方说我们的10.214.1.151的主机名就是xen1-yq(以后,我们就这样叫它)。

         现在,我们可以用onehost create命令注册hostOpenNebula中了。

$ onehost createxen1-yq  -i im_xen -v vmm_xen -n dummy

这里有好多参数,我们需要解释一下。

         create后面直接跟的host的主机名。

-iIM_MAD

-vVMM_MAD

-n:网络驱动

2.1中我们已经介绍过IM_MADVMM_MAD,就不赘述了。

网络驱动是OpenNebula定义的一系列提高网络配置能力的驱动,有很多选择(802.1Q VLAN, Ebtables, Open vSwitch, VMware NetworkingFileWall等),而我们用到的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

2.6 管理虚拟机

         终于看到曙光了。

         现在,我们经过不懈的努力,准备好了镜像(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"

]

         有点长,不急,我们慢慢来解释一下。

         可以看到,配置文件里有以下几个配置项:

         1CPU:表示虚拟分配到的hostCPU的百分比。

         2MEMORY:内存大小。

         3DISK:汉语意思是盘,你可以把它理解成虚拟机的硬盘。这个硬盘绑定了一个镜像(image_id = 4)。还记得2.3中我们创建的4号镜像吗?对,就是它。我们要用这个镜像当我们虚拟机的操作系统盘。

target=xvda表示该盘在操作系统中绑定的块设备是xvda

driver=”file:”表示块设备的类型就是普通文件。

clone=”no”表示该盘不能被克隆。

readonly=”no”表示这个盘是可写的。

         4OS:定义了虚拟机的启动方式。可以是内核,也可以是bootloader的方式。

         5NIC:指定虚拟机使用的网络。还记得2.4中我们创建的0号虚拟网吗,对,就是它。这个设置项会帮助虚拟机从0号网络的IP地址范围(10.214.1.155-10.214.1.160)中挑选一个可用的IP

         6GRAPHIC:这是虚拟机的远程控制的设置,还不是很懂,先略过了。

         7CONTEXT:是Contextualization的简写,可以理解为“初始化”的意思。这是OpenNebula中很有意思的一个机制。虚拟启动之后,需要在经过一些初始化工作之后,才能正常为用户工作,比如说:设置IP地址、netmaskgatewaydns,修改主机名,设置无密钥ssh等等。然而,设置这些东西,就需要我们事先将一些变量和文件传到虚拟机的镜像中,然后用脚本调用这些变量和文件去设置。CONTEXT就是为完成这个工作而生。

CONTEXT有三个固定配置项,drivertarget同(3),file定义了欲传到虚拟机中的文件。

其它的配置项hostnameipnetmaskdns都是我们自定义的变量(你可以根据自己的需要定义更多的变量)。这些变量会被放到一个文件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

后面分别是虚拟机和hostID号。

好了,等个一小会,虚拟机的状态就变成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

转载请注明出处

 类似资料: