Managing Virtual Machine Images 3.8
The Storage system allows OpenNebula administrators and users to set up images, which can be operative systems or data, to be used in Virtual Machines easily. These images can be used by several Virtual Machines simultaneously, and also shared with other users.
If you want to customize the Storage in your system, visit the Storage subsystem guide.
There are three different types of images. Using the command oneimage chtype
, you can change the type of an existing Image.
The Virtual Machines can use as many datablocks as needed. Refer to the VM template documentation for further information.
Short state | State | Meaning |
---|---|---|
lock | LOCKED | The image file is being copied or created in the Datastore. |
rdy | READY | Image ready to be used. |
used | USED | Non-persistent Image used by at least one VM. It can still be used by other VMs. |
used | USED_PERS | Persistent Image is use by a VM. It cannot be used by new VMs. |
disa | DISABLED | Image disabled by the owner, it cannot be used by new VMs. |
err | ERROR | Error state, a FS operation failed. See the Image information with oneimage show for an error message. |
dele | DELETE | The image is being deleted from the Datastore. |
This is the state diagram for persistent images:
And the following one is the state diagram for non-persistent images:
Users can manage their images using the command line interface command oneimage
. The complete reference is here.
You can also manage your images using Sunstone. Select the Images tab, and there you will be able to create, enable, disable, delete your images and even manage their persistence and publicity in a user friendly way. From Sunstone 3.4, you can also upload images directly from the web UI.
The three types of images can be created from an existing file, but for datablock images you can specify a size and filesystem type and let OpenNebula create an empty image in the datastore.
If you want to create an OS image, you need to prepare a contextualized virtual machine, and extract its disk.
Please read first the documentation about the MAC to IP mechanism in the virtual network management documentation, and how to use contextualization here.
Once you have a disk you want to upload, you need to create a new image template, and submit it using the oneimage create
command.
The complete reference for the image template is here. This is how a sample template looks like:
<xterm> $ cat ubuntu_img.one NAME = “Ubuntu” PATH = /home/cloud/images/ubuntu-desktop/disk.0 TYPE = OS DESCRIPTION = “Ubuntu 10.04 desktop for students.” </xterm>
You need to choose the Datastore where to register the new Image. To know the available datastores, use the onedatastore list
command. In this case, only the 'default' one is listed:
<xterm> $ onedatastore list
ID NAME CLUSTER IMAGES TYPE TM 1 default - 1 fs shared
</xterm>
To submit the template, you just have to issue the command <xterm> $ oneimage create ubuntu_img.one –datastore default ID: 0 </xterm>
You can also create images using just parameters in the oneimage create
call. The parameters to generate the image are as follows:
Parameter | Description |
---|---|
–name name | Name of the new image |
–description description | Description for the new Image |
–type type | Type of the new Image: OS, CDROM or DATABLOCK |
–persistent | Tells if the image will be persistent |
–prefix prefix | Device prefix for the disk (eg. hd, sd, xvd or vd) |
–target target | Device the disk will be attached to |
–path path | Path of the image file |
–driver driver | Driver to use image (raw, qcow2, tap:aio:…) |
–disk_type disk_type | Type of the image (BLOCK, CDROM or FILE) |
–source source | Source to be used. Useful for not file-based images |
–size size | Size in MB. Used for DATABLOCK type |
–fstype fstype | Type of file system to be built: ext2, ext3, ext4, ntfs, reiserfs, jfs, swap, qcow2 |
To create the previous example image you can do it like this:
<xterm> $ oneimage create –datastore default –name Ubuntu –path /home/cloud/images/ubuntu-desktop/disk.0 \
</xterm>
Existing images can be cloned to a new one. This is useful to make a backup of an Image before you modify it, or to get a private persistent copy of an image shared by other user.
To clone an image, execute <xterm> $ oneimage clone Ubuntu new_image </xterm>
You can use the oneimage list
command to check the available images in the repository.
<xterm> $ oneimage list
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS 0 oneuser1 users Ubuntu default 8M OS No rdy 0
</xterm>
To get complete information about an image, use oneimage show
, or list images continuously with oneimage top
.
The users can share their images with other users in their group, or with all the users in OpenNebula. See the Managing Permissions documentation for more information.
Let's see a quick example. To share the image 0 with users in the group, the USE right bit for GROUP must be set with the chmod command:
<xterm> $ oneimage show 0 … PERMISSIONS OWNER : um- GROUP : — OTHER : —
$ oneimage chmod 0 640
$ oneimage show 0 … PERMISSIONS OWNER : um- GROUP : u– OTHER : — </xterm>
The following command allows users in the same group USE and MANAGE the image, and the rest of the users USE it:
<xterm> $ oneimage chmod 0 664
$ oneimage show 0 … PERMISSIONS OWNER : um- GROUP : um- OTHER : u– </xterm>
oneimage publish
and oneimage unpublish
are still present for compatibility with previous versions. These commands set/unset the GROUP USE bit.
Use the oneimage persistent
and oneimage nonpersistent
commands to make your images persistent or not.
A persistent image saves back to the datastore the changes made inside the VM after it is shut down. More specifically, the changes are correctly preserved only if the VM is ended with the onevm shutdown
or onevm cancel
commands. Note that depending on the Datastore type a persistent image can be a link to the original image, so any modification is directly made on the image.
<xterm> $ oneimage list
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS 0 oneadmin oneadmin Ubuntu default 10G OS No rdy 0
$ oneimage persistent Ubuntu $ oneimage list
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS 0 oneadmin oneadmin Ubuntu default 10G OS Yes rdy 0
$ oneimage nonpersistent 0 $ oneimage list
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS 0 oneadmin oneadmin Ubuntu default 10G OS No rdy 0
</xterm>
This a simple example on how to specify images as virtual machine disks. Please visit the virtual machine user guide and the virtual machine template documentation for a more thorough explanation.
Assuming you have an OS image called “Ubuntu desktop” with ID 1, you can use it in your virtual machine template as a DISK. When this machine is deployed, the first disk will be taken from the image repository.
Images can be referred in a DISK in two different ways:
CPU = 1 MEMORY = 3.08 DISK = [ IMAGE_ID = 1 ] DISK = [ type = swap, size = 1024 ] NIC = [ NETWORK_ID = 1 ] NIC = [ NETWORK_ID = 0 ] # FEATURES=[ acpi="no" ] GRAPHICS = [ type = "vnc", listen = "1.2.3.4", port = "5902" ] CONTEXT = [ files = "/home/cloud/images/ubuntu-desktop/init.sh" ]
Once the VM is deployed you can save the changes made to any disk as a new image. To do so, use the onevm saveas
command. This command takes three arguments: The VM name (or ID), the disk_id to save and the name of the new image to register.
To know the DISK_ID of the disk you want to save, just take a look at the onevm show
output for your VM.
<xterm> $ onevm show 5 VIRTUAL MACHINE 5 INFORMATION ID : 5 NAME : one-5 STATE : ACTIVE LCM_STATE : RUNNING START TIME : 07/27 14:43:58 END TIME : - DEPLOY ID: : one-5
VIRTUAL MACHINE TEMPLATE CONTEXT=[
FILES=/home/cloud/images/ubuntu-desktop/init.sh, TARGET=hdb ]
CPU=1 DISK=[
CLONE=YES, DISK_ID=0, IMAGE=Ubuntu Desktop, IMAGE_ID=1, READONLY=NO, SAVE=NO, SOURCE=/home/cloud/opennebula/var/images/147f94ddb708851e71651f05caf81da0131cc904, TARGET=hda, TYPE=DISK ]
DISK=[
DISK_ID=1, SIZE=1024, TARGET=hdd, TYPE=swap ]
GRAPHICS=[
LISTEN=1.2.3.4, PORT=5902, TYPE=vnc ]
MEMORY=3.08 NAME=one-5 NIC=[
BRIDGE=bpub, IP=1.2.3.4, MAC=02:00:01:02:03:04, NETWORK=Public network, NETWORK_ID=1 ]
NIC=[
BRIDGE=bpriv, IP=192.168.30.1, MAC=02:00:c0:a8:1e:01, NETWORK=Private network, NETWORK_ID=0 ]
VMID=5 </xterm>
The DISK_IDs are assigned in the same order the disks were defined in the VM template.
<xterm> $ onevm saveas one-5 0 “Ubuntu with Apache and MySQL” </xterm>
This will register a new image called “Ubuntu with Apache and MySQL”, that will be ready as soon as the VM is shut down.