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.
Tweet