SmartOS: Crear una VM


SmartOS ofrece dos posibilidades para virtualizar un SO:

  • OS VM (OS Virtualized Machine) – La virtualización se realiza utilizando zonas. Solo podremos utilizar como SO huésped SmartOS.
  • HVM (Hypervisor Virtualized Machine) – Gracias al port de KVM, SmartOS tiene la capacidad de virtualizar sistemas operativos como Linux, Windows, BSD, etc.

Antes de comenzar, debemos recordar del post anterior que SmartOS puede funcionar como SO anfitrión para administrar máquinas virtuales o como SO huésped de propósito general.

Datasets

SmartOS se basa en un concepto muy simple, utilizar imágenes de máquinas virtuales pre-instaladas. Estas imágenes de VM se  identifican como Datasets. Por tanto, los Datasets o imágenes virtuales, serán los elementos con los que nos tendremos que acostumbrar a trabajar en SmartOS.  Un Dataset está formado por dos componentes:

  • Una imagen del SO que será un snapshot ZFS del SO.
  • Un fichero con la descripción de la máquina virtual.

La imagen puede ser o bien un filesystem ZFS para el caso de que la máquina virtual corresponda con una VM de tipo OS-VM  o bien un volumen ZFS (zvol) para el caso de que se trate de máquinas virtuales del tipo HVM (Hardware Virtual Machine).

Abajo podemos ver un ejemplo de fichero de descripción de un Dataset. Sson ficheros de tipo JSON (JavaScript Object Notation ) y en ellos se describen un conjunto de atributos que nuestro SmartOS anfitrión utilizará para construir la VM.

{
  "name": "base",
  "version": "1.8.2",
  "type": "zone-dataset",
  "description": "Base image with core packages preinstalled",
  "published_at": "2012-12-03T21:29:45.759Z",
  "os": "smartos",
  "files": [
    {
      "path": "base-1.8.2.zfs.bz2",
      "sha1": "8924d7c4b919a6c11104568105707ad2f42f26fe",
      "size": 79422483,
      "url": "https://datasets.joyent.com/datasets/ef22b182-3d7a-11e2-a7a9-af27913943e2/base-1.8.2.zfs.bz2"
    }
  ],
  "requirements": {
    "networks": [
      {
        "name": "net0",
        "description": "public"
      }
    ]
  },
  "creator_name": "sdc",
  "uuid": "ef22b182-3d7a-11e2-a7a9-af27913943e2",
  "creator_uuid": "352971aa-31ba-496c-9ade-a379feaecd52",
  "vendor_uuid": "352971aa-31ba-496c-9ade-a379feaecd52",
  "platform_type": "smartos",
  "cloud_name": "sdc",
  "urn": "sdc:sdc:base:1.8.2",
  "created_at": "2012-12-03T21:29:45.759Z",
  "updated_at": "2012-12-03T21:29:45.759Z",
  "_url": "https://datasets.joyent.com/datasets"
}

La razón de utilizar JSON como formato para los ficheros de descripción de los Datasetsestá en que SmartOS utiliza Node.js para administrar muchos de sus servicios y aplicaciones.

Más adelante, en otros post iremos viendo cada uno de los atributos del fichero de descripción de un dataset, por ahora nos vamos a quedar con aquel los siguientes.

  "files": [
    {
      "path": "base-1.8.2.zfs.bz2",
      "sha1": "8924d7c4b919a6c11104568105707ad2f42f26fe",
      "size": 79422483,
      "url": "https://datasets.joyent.com/datasets/ef22b182-3d7a-11e2-a7a9-af27913943e2/base-1.8.2.zfs.bz2"
    }
  ],

El atributo “files” que contiene la información necesaria para que SmartOS pueda acceder al fichero con la imagen ZFS.

Base de datos de Datasets

El primer paso para comenzar a trabajar con VMs, es actualizar la base de datos de imágenes o datasets en nuestro sistema. La base de datos se almacena en el directorio /var/db/imgadm y como primer paso debemos crear el fichero con la lista de direcciones HTTP de los servidores que emplearemos para bajar las imágenes.

[root]# echo "http://datasets.joyent.com/datasets" >> /var/db/imgadm/sources.list

Una vez creado el fichero con los servidores, podemos actualizar nuestra base de datos de Datasets utilizando el comando imgadm.

[root]# imgadm
Usage: imgadm [pvH]  [comment-specific arguments]

Commands:

avail                           -- list images available for import
destroy                   -- remove an image from the local zpool
import                    -- import the specified image locally
info                      -- information about an imported image
install -m  -f  -- install an image from components
list                            -- lists imported images
show                      -- outputs the manifest for the image
update                          -- update the local cache of images from sources

For more details see the man page for imgadm(1m).

[root]#

Utilizamos la opción update

[root]# imgadm update
updating local images database...
Get https://datasets.joyent.com/datasets...
done
[root]#
[root]# ls -lrt
total 546
-r--r--r--    1 root     root             37 Jan 22 11:16 sources.list
-rw-r--r--    1 root     root          88423 Jan 22 11:19 imgcache.json
[root]#

Podremos comprobar que se ha generado o actualizado el fichero imgcache.json, el cual almacena toda la información sobre el conjunto de datasets disponibles en los servidores.

Para listar los datasets disponible ejecutamos:

[root]# imgadm available
UUID                                 OS      PUBLISHED  URN
46ecf60e-52c8-11e2-b212-9b51fc749547 linux   2013-01-24 sdc:sdc:debian-6.0.6:2.3.1
1327ed36-5130-11e2-95a8-9b5a153adf3e linux   2013-01-24 sdc:jpc:ubuntu-12.04:2.3.1
6344c3f4-64d9-11e2-af3d-af797e5b19ca smartos 2013-01-23 sdc:sdc:hadoop:1.0.0
fb6ef720-55c1-11e2-b6de-bf6869fd8d41 smartos 2013-01-03 sdc:sdc:riak:1.7.0
fdea06b0-3f24-11e2-ac50-0b645575ce9d smartos 2012-12-05 sdc:sdc:base64:1.8.4
84cb7edc-3f22-11e2-8a2a-3f2a7b148699 smartos 2012-12-05 sdc:sdc:base:1.8.4
aa583f78-3d83-11e2-9188-fff9b605718d smartos 2012-12-03 sdc:sdc:base64:1.8.2
ef22b182-3d7a-11e2-a7a9-af27913943e2 smartos 2012-12-03 sdc:sdc:base:1.8.2
71101322-43a5-11e1-8f01-cf2a3031a7f4 linux   2012-11-21 sdc:sdc:ubuntu-10.04:1.0.1
3f8a3d02-43e4-11e1-9565-7f82a075e289 linux   2012-11-21 sdc:sdc:fedora-14:1.0.1
e6ac6784-44b3-11e1-8555-87c3dd87aafe linux   2012-11-21 sdc:sdc:debian-6.03:1.0.0
2539f6de-0b5a-11e2-b647-fb08c3503fb2 linux   2012-11-21 sdc:jpc:centos-5.7:1.3.0
b00acc20-14ab-11e2-85ae-4f03a066e93e smartos 2012-10-12 sdc:sdc:mongodb:1.4.0
1fc068b0-13b0-11e2-9f4e-2f3f6a96d9bc smartos 2012-10-11 sdc:sdc:nodejs:1.4.0
8700b668-0da4-11e2-bde4-17221283a2f4 linux   2012-10-03 sdc:jpc:centos-6:1.3.0
55330ab4-066f-11e2-bd0f-434f2462fada smartos 2012-09-25 sdc:sdc:base:1.8.1
60a3b1fa-0674-11e2-abf5-cb82934a8e24 smartos 2012-09-25 sdc:sdc:base64:1.8.1
dc1a8b5e-043c-11e2-9d94-0f3fcb2b0c6d smartos 2012-09-21 sdc:sdc:percona:1.6.0
6bf31ce2-f384-11e1-a338-e39c2fe4ab59 smartos 2012-08-31 sdc:sdc:mongodb:1.3.2
a0f8cf30-f2ea-11e1-8a51-5793736be67c smartos 2012-08-30 sdc:sdc:standard64:1.0.7
3390ca7c-f2e7-11e1-8818-c36e0b12e58b smartos 2012-08-30 sdc:sdc:standard:1.0.7
9604da58-f1ee-11e1-aba1-dbda3337ec46 smartos 2012-08-29 sdc:sdc:mongodb:1.3.1
15c77de2-f1ed-11e1-8688-47d8455c7932 smartos 2012-08-29 sdc:sdc:standard64:1.0.5
2baee822-f1eb-11e1-8383-f762d43a424c smartos 2012-08-29 sdc:sdc:standard:1.0.5
….
[root]#

Podemos obtener la descripción de un dataset concreto con la opción show.

[root]# imgadm show 6344c3f4-64d9-11e2-af3d-af797e5b19ca
{
  "name": "hadoop",
  "version": "1.0.0",
  "type": "zone-dataset",
  "description": "A SmartOS 64-bit image with Hadoop Hortonworks components pre-installed.  Includes hadoop, hbase
, hcatalog, hive, pig, and templeton.",
  "published_at": "2013-01-23T05:10:08.591Z",
  "os": "smartos",
  "files": [
    {
      "path": "hadoop-1.0.0.zfs.bz2",
      "sha1": "dbef65961ed646d879d2ab7cf1fa6d86a722dd45",
      "size": 489742860,
      "url": "https://datasets.joyent.com/datasets/6344c3f4-64d9-11e2-af3d-af797e5b19ca/hadoop-1.0.0.zfs.bz2"
    }
  ],
  "requirements": {
    "networks": [
      {
        "name": "net0",
        "description": "public"
      }
    ]
  },
  "users": [
    {
      "name": "root"
    },
    {
      "name": "admin"
    }
  ],
  "generate_passwords": true,
  "uuid": "6344c3f4-64d9-11e2-af3d-af797e5b19ca",
  "creator_uuid": "352971aa-31ba-496c-9ade-a379feaecd52",
  "vendor_uuid": "352971aa-31ba-496c-9ade-a379feaecd52",
  "creator_name": "sdc",
  "platform_type": "smartos",
  "cloud_name": "sdc",
  "urn": "sdc:sdc:hadoop:1.0.0",
  "created_at": "2013-01-23T05:10:08.591Z",
  "updated_at": "2013-01-23T05:10:08.591Z",
  "_url": "https://datasets.joyent.com/datasets"
}
[root]#

Importar un datasets

Ya hemos atualizado la base de datos con la información de todos los datasets disponibles en los distintos repositorios que hemos configurado. Ahora tenemos que importar la imagen ZFS de la VM que queremos utilizar en nuestro sistema. Con la opción import y el UUID del dataset que queremos importar, como en el ejemplo siguiente.

[root]# imgadm import 6344c3f4-64d9-11e2-af3d-af797e5b19ca
6344c3f4-64d9-11e2-af3d-af797e5b19ca doesnt exist. continuing with install

…

6344c3f4-64d9-11e2-af3d-af797e5b19ca successfully installed
image 6344c3f4-64d9-11e2-af3d-af797e5b19ca successfully imported
[root]#

El proceso de importación se sencillo, utilizando la información sobre el dataset, es decir, tamaño, url de la imagen, etc. El comando imgadm, ejecuta la aplicación curl para acceder al repositorio de imágenes y bajar la que hemos especificado, tal como la está bajando se la pasa al descompresor bzip2 y la salida se pasa al comando zfs para volcar el contenido de la imagen en nuestro fs ZFS.

[root]# ps -ef | grep 5290
    root  5293  5290   1 16:11:52 pts/1       0:02 /usr/sbin/zfs recv zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca-partial
    root  5294  5290  17 16:11:52 pts/1       0:14 /usr/bin/bzip2 -cdfq
    root  5295  5290   1 16:11:52 pts/1       0:01 /usr/bin/curl --insecure --header Host: datasets.joyent.com https://165.225.154
    root  5290  2857   3 16:11:51 pts/1       0:04 /usr/node/bin/node /usr/sbin/imgadm import 6344c3f4-64d9-11e2-af3d-af797e5b19ca
[root]#

Mientras está bajando la imagen podemos comprobar con el comando zfs como se está volcando la imagen sobre nuestro fs ZFS.

[root]# zfs list | grep partial
zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca-partial   435M  14.3G   435M  /zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca-partial

Una vez que ha terminado la importación del dataset podemos ver la lista de datasets importados en el sistemas ejecutamos el siguiente comando.

[root]# imgadm list
UUID                                 OS      PUBLISHED  URN
6344c3f4-64d9-11e2-af3d-af797e5b19ca smartos 2013-01-23 sdc:sdc:hadoop:1.0.0
[root]#

Y como se ha montado la nueva imagen en un directorio.

[root]# zfs list
zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca        1.36G  13.4G  1.36G  /zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca
[root]#

Con este proceso tan sencillo podemos importar todas las imágenes o Datasets que necesitemos para crear VMs en nuestro SmartOS.

Crear una VM

Una vez que hayamos importado el datasets que necesitemos, el siguiente paso es crear una máquina virtual (VM). Para crear una nueva VM necesitamos construir un fichero de definición de la VM. El fichero de definición de la nueva VM tiene que tener formato JSON y sería parecido al siguiente.

[root]# cat vm-prueba_hadoop.json
{
        "brand": "joyent",
        "dataset_uuid": "6344c3f4-64d9-11e2-af3d-af797e5b19ca",
        "zonename": "zona_hadoop",
        "nics": [
        {
          "nic_tag": "admin",
          "ip": "192.168.126.250",
          "netmask": "255.255.255.0",
          "gateway": "192.168.126.2"
        }
        ]
}

Toda la administración de las VM se realiza con el comando vmadm.

[root]# vmadm
Usage: /usr/sbin/vmadm  [options]

create [-f ]
console
delete
get
info  [type,...]
install
list [-p] [-H] [-o field,...] [-s field,...] [field=value ...]
lookup [-j|-1] [field=value ...]
reboot  [-F]
receive [-f ]
send  [target]
start  [option=value ...]
stop  [-F]
sysrq
update  [-f ]
 -or- update  property=value [property=value ...]

For more detailed information on the use of this command,type 'man vmadm'.
[root]#

Como vemos en la salida anterior, con el comando vmadm podremos crear, borrar, reiniciar, arrancar, parar, etc. Las distintas VM que tengamos corriendo en nuestro sistema. Con la opción create y el nombre del fichero que hemos creado con la definición de la nueva VM, podremos crear una nueva VM.

[root@00-0c-29-7c-09-64 /etc/ssh]# vmadm create -f /zones/vm-prueba_hadoop.json
Successfully created 753f589b-f7db-4a96-8e0b-fc82b6b51d02
[root@00-0c-29-7c-09-64 /etc/ssh]#

Se ha creado la nueva VM cuyo UUID se 753f589b-f7db-4a96-8e0b-fc82b6b51d02.

[root]# vmadm list
UUID                                  TYPE  RAM      STATE             ALIAS
753f589b-f7db-4a96-8e0b-fc82b6b51d02  OS    256      running           -
[root]#

Con la opción get podemos obtener la información sobre la nueva VM que hemos creado.

[root]# vmadm get 753f589b-f7db-4a96-8e0b-fc82b6b51d02
{
  "zonename": "zona_hadoop",
  "zonepath": "/zones/zona_hadoop",
  "autoboot": true,
  "brand": "joyent",
  "limit_priv": "default",
  "create_timestamp": "2013-01-30T16:54:47.519Z",
  "image_uuid": "6344c3f4-64d9-11e2-af3d-af797e5b19ca",
  "cpu_shares": 100,
  "zfs_io_priority": 100,
  "max_lwps": 2000,
  "max_physical_memory": 256,
  "max_locked_memory": 256,
  "max_swap": 256,
  "billing_id": "00000000-0000-0000-0000-000000000000",
  "owner_uuid": "00000000-0000-0000-0000-000000000000",
  "tmpfs": 256,
  "dns_domain": "local",
  "nics": [
    {
      "interface": "net0",
      "mac": "62:0c:7f:fa:3d:ef",
      "nic_tag": "admin",
      "gateway": "192.168.126.2",
      "primary": true,
      "ip": "192.168.126.250",
      "netmask": "255.255.255.0"
    }
  ],
  "uuid": "753f589b-f7db-4a96-8e0b-fc82b6b51d02",
  "last_modified": "2013-01-30T17:02:37.000Z",
  "server_uuid": "564da5c7-666a-acf9-c639-385bc07c0964",
  "zoneid": 5,
  "zone_state": "running",
  "state": "running",
  "quota": 10,
  "zfs_root_recsize": 131072,
  "zfs_filesystem": "zones/zona_hadoop",
  "zpool": "zones",
  "customer_metadata": {},
  "internal_metadata": {},
  "tags": {},
  "snapshots": []
}
[root@00-0c-29-7c-09-64 /etc/zones]#

Se ha actualizado el fichero con el índice de las ZONAS configuradas en el sistema.

[root]# cat /etc/zones/index
# ident "%Z%%M% %I%     %E% SMI"
# Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# DO NOT EDIT: this file is automatically generated by zoneadm(1M)
# and zonecfg(1M).  Any manual changes will be lost.
#
global:installed:/
zona_hadoop:installed:/zones/zona_hadoop:753f589b-f7db-4a96-8e0b-fc82b6b51d02
[root]#

Con el comando zoneadm podemos comprobar el estado de la nueva zona creada.

[root]# zoneadm list -v
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              liveimg  shared
   1 zona_hadoop      running    /zones/zona_hadoop             joyent   excl
[root]#

Con el comando zfs comprobamos que se ha actualizado nuestro fs ZFS.

[root@00-0c-29-7c-09-64 /zones]# zfs list | grep zona_hadoop
zones/cores/zona_hadoop                             31K  10.0G    31K  /zones/zona_hadoop/cores
zones/zona_hadoop                                 14.0M  9.99G  1.37G  /zones/zona_hadoop
[root@00-0c-29-7c-09-64 /zones]#

Se ha creado un nuevo clon ZFS.

[root@00-0c-29-7c-09-64 /zones]# zfs get origin zones/zona_hadoop
NAME               PROPERTY  VALUE                                                   SOURCE
zones/zona_hadoop  origin    zones/6344c3f4-64d9-11e2-af3d-af797e5b19ca@zona_hadoop  -
[root@00-0c-29-7c-09-64 /zones]#

El identificador único de la VM es su UUID, para facilitar la administración de las distintas VM, podemos añadir un alias a cada VM. El alias lo podemos especificar en el fichero de definición de la VM o bien podemos crear el alias una vez la VM se ha creado, como en el ejemplo.

[root]# echo "{\"alias\": \"hadoop\"}" | vmadm update 753f589b-f7db-4a96-8e0b-fc82b6b51d02
Successfully updated 753f589b-f7db-4a96-8e0b-fc82b6b51d02
[root@00-0c-29-7c-09-64 /etc/zones]# vmadm list
UUID                                  TYPE  RAM      STATE             ALIAS
29d0c896-0c44-433d-bcea-841f83c2bad7  OS    256      running           prueba_A
[root]#

Acceso a la VM

Para acceder a la nueva VM podemos hacerlo utilizando el comando
zlogin (en el caso de que sea una VM de tipo OS-VM) o con el comando vmadm.

Como en nuestro ejemplo no hemos establecido la passwd durante la creación de la VM, debemos establecerla ahora entrando con zlogin.

[root]# zlogin zona_hadoop
[Connected to zone 'zona_hadoop' pts/4]
   __        .                   .
 _|  |_      | .-. .  . .-. :--. |-
|_    _|     ;|   ||  |(.-' |  | |
  |__|   `--'  `-' `;-| `-' '  ' `-'
                   /  ; SmartMachine (hadoop 0.0.90)
                   `-'  http://wiki.joyent.com/jpc2/Joyent+Hadoop+SmartMachine

[root@zona_hadoop ~]#
[root@zona_hadoop ~]# passwd root
New Password:
Re-enter new Password:
passwd: password successfully changed for root
[root@zona_hadoop ~]#

Para establecer la password del usuario root y/o admin durante la definición de la VM, debemos añadir al fichero el siguiente tag.

"customer_metadata":{
	"root_pw": "passwd de root",
	"admin_pw": "passwd de admin",

}

De esta forma cuando creemos la nueva VM, se establecerá la password de los usuarios root y/o admin, evitándonos tener que entrar por en la VM utilizando zlogin para establecer la password.

Con estos sencillos pasos hemos conseguido levantar una nueva VM en nuestro SmartOS. En los siguientes posts veremos cómo asignar recursos a las distintas VM y el papel de RM (Resource Manager) como herramienta clave para la gestión de los recursos de SmartOS.