# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Solaris Zones ERROR: the zonepath must be a ZFS dataset


A la hora de crear una zona en Solaris (Solaris Zones|Solaris Containers), es imprescindible que el zonepath, que es el lugar físico en el que se va a alojar sea un sistema de ficheros zfs independiente, también llamado ZFS dataset. En caso contrario recibiremos este error a la hora de instalarla:

ERROR: No zonepath dataset; the zonepath must be a ZFS dataset.

El error es lo suficientemente descriptivo. A la hora de configurar la zona, establecemos el zonepath del siguiente modo dentro del modo de configuración de la zona:

# zonecfg -z zona01
zonecfg:zona01> set zonepath=/ruta/a/la/zona

El paso previo es entonces crear el dataset correspondiente:

# zfs create /rpool/zones
# zfs create /rpool/zones/zona01

Una vez realizado, podemos establecer como zonepath “/rpool/zones/zona01″, verificar la configuración con “verify”, hacer el “commit” e instalar la zona:

# zoneadm -z zona01 install

Instalar una versión específica de Parallels Virtuozzo Containers


VirtuozzoEl otro día se publicó una KB de Parallels sobre algo que llevaba tiempo intentando poder hacer. Cuando te bajas el instalador de Parallels Virtuozzo Containers para Linux, al comenzar la instalación siempre te fuerza a instalar la última versión disponible. En caso de estar obligado a instalar una versión específica, podemos hacerlo siguiendo estos pasos:

Lo primero es bajar el instalador como lo haríamos normalmente:

# wget http://download.parallels.com/pvc/47/lin/vzinstall-linux-x86_64.bin
# chmod a+x vzinstall-linux-x86_64.bin

Una vez descargado, con el parámetro ‘list‘ podemos ver las versiones y arquitecturas disponibles para la instalación:

# ./vzinstall-linux-x86_64.bin list
Downloading index files...
Templates set: (Default set)
Version  Platform  Architecture  Download size
4.7.0-94 Linux     i386          544MB
4.7.0-94 Linux     x86_64        789MB
4.6.0-187Linux     i386          607MB
4.6.0-187Linux     x86_64        782MB
4.0.0-448Linux     i386          848MB
4.0.0-448Linux     ia64          940MB
4.0.0-448Linux     x86_64        1.0GB
4.0      w2k3      i386          41MB
4.0      w2k3      ia64          60MB
4.0      w2k3      x86_64        48MB

Ahora solo queda elegir la versión, plataforma y arquitectura para nuestra instalación. Si quisieramos instalar la versión 4.6.0-187 para 64 bits Linux:

# ./vzinstall-linux-x86_64.bin install --archs x86_64 --dist-ver 4.6.0-187 --platforms Linux

Migración de un VPS Virtuozzo sin parada de servicio


Uno de los principios básicos de la virtualización es la flexibilidad a la hora de asignar recursos a las máquinas virtuales y por supuesto la de poder mover los VPS entre nodos físicos con el menor tiempo de parada posible, y a ser posible nulo.

En Virtuozzo, la utilidad para realizar migraciones es vzmigrate, a través de la cual podemos migrar un contenedor entre dos máquinas físicas de forma transparente para el usuario final.

A continuación podéis ver como sería para hacer una migración entre dos nodos físicos sin parada de servicio, os recomiendo revisar la documentación de Virtuozzo, en esta página encontraréis toda la información sobre esta utilidad.

En el siguiente ejemplo utilizamos el parámetro –online para indicar que no habrá parada de servicio en la migración, –require-realtime sirve para indicar que la principal cantidad de memoria del contenedor se transfiere al nodo de destino antes de volcar y guardar la imagen del VPS en un fichero. Esto permite lograr la menor cantidad de pérdida de servicio. En mi experiencia, para máquinas virtuales de alrededor de 3GB la pérdida de servicio ha sido de apenas 5 segundos, y para máquinas virtuales de unos 22GB de un minuto aproximadamente. Con los parámetros –new-private y –new-root podemos modificar la ruta en la que se almacenará la máquina virtual. Si queremos también podemos modificar el ID del contenedor con el parámetro –new-id.

A continuación el ejemplo, migramos sin parada de servicio la máquina virtual con ID 126, cambiando las rutas en las que se almacenará en el nodo de destino. El nodo de destino es el host nodo2.virtuozzo.com. El comando lo ejecutaríamos en el nodo en el que se encuentra actualmente el contenedor. Debe haber conectividad ssh entre ambas máquinas físicas:

# vzmigrate --online --require-realtime --new-private=/virtuozzo/private/126 --new-root=/virtuozzo/root/126 nodo2.virtuozzo.com 126

Consumo excesivo de memoria en Virtuozzo


Revisando el consumo de memoria en un nodo de Virtuozzo, que parecía demasiado elevado para el número de máquinas virtuales que contenía, confirmé que había un proceso que estaba utilizando una cantidad muy alta de memoria. Concretamente se trataba del proceso que gestiona los backups:

/opt/vzagent/bin/vzlpl VZABackupLibClient/VZABackupLibClient.so vzlin_backup_serializer

El proceso estaba utilizando el 12.6% de memoria del sistema. Investigando, encontré este post en los foros de Parallels que confirmaban este problema. Este proceso consume más y más memoria incluso cuando no está ejecutando los backups. La solución de momento parece ser reiniciar el Service Container y el vzagent_ctl cuando encontremos el problema, o incluso añadirlo en un cron para hacerlo periódicamente:

/usr/sbin/vzctl restart 1 >/dev/null 2>&1; /usr/sbin/vzagent_ctl restart

Control de contenedores (VPS) Virtuozzo con vzctl


Seguimos descubriendo los distintos comandos y utilidades que integra el sistema de virtualización Virtuozzo para la gestión de las máquinas virtuales. En este caso vamos a ver el comando vzctl, alrededor del cual giran todas las tareas de gestión y control de contenedores.

Son muchísimos los parámetros y posibilidades que nos ofrece el comando, os recomiendo revisar bien la página man del mismo para conocerlos a fondo, ya que sería muy extenso citarlos aquí.

# man vzctl

Bien, vamos a ver los usos más comunes que le podemos dar a este comando. Lo primero que debemos aprender es a modificar el estado de un contenedor:

vzctl destroy | mount | umount | start | stop | status | enter | quotaon | quotaoff | quotainit <ctid|name>

Como véis en la línea anterior, podemos destruir (apagado forzado), arrancar, parar, ver el estado, activar/desactivar/iniciar cuotas, etc de cualquiera de los contenedores. Ejemplos:

Parar contenedor con ID 101:

# vzctl stop 101

Arrancar contenedor con ID 101:

# vzctl start 101

Para saber el nombre del contenedor, o su ID, podéis ejecutar el comando vzlist, que listará todos los contenedores que hay en el nodo físico.

Seguimos con otra opción interesante del comando, se trata de la creación de nuevos contenedores, no voy a entrar en todos los parámetros disponibles, podéis verlo en la página man. Básicamente podemos crear un nuevo contenedor con una única línea de comando, especificarle la plantilla a utilizar, configuraciones de red, límites de recursos, etc:

# vzctl create <ctid|name> {--pkgset <set> [--pkgver <ver>] | --ostemplate <name>}
[--config <name>] [--private <path>] [--root <path>]
[--ipadd <addr>] | [--hostname <name>] [--skip_app_templates]

Para suspender y reactivar contenedores, utilizaremos suspend y resume:

# vzctl suspend <ctid|name>
# vzctl resume <ctid|name>

Para ejecutar comandos en la máquina virtual desde el nodo hardware, usaremos exec, seguido del ID de contenedor, el comando, y los argumentos:

# vzctl exec <ctid|name> <command> [arg ...]

Por último, vzctl set nos permite modificar cualquier parámetro de configuración de los contenedores en tiempo real, a continuación podéis ver todas las opciones:

# vzctl set <ctid|name> [--save] [--ipadd <addr>] [--ipdel <addr>|all]
[--hostname <name>] ]
[--nameserver <addr>] [--searchdomain <name>] [--onboot yes|no]
[--userpasswd <user>:<passwd>] [--cpuunits <N>] [--cpulimit <N>] [--cpus <N>]
[--diskspace <soft>[:<hard>]] [--diskinodes <soft>[:<hard>]]
[--quotatime <N>] [--quotaugidlimit <N>]
[--rate <dev>:<class>:<Kbits>] [--ratebound yes|no]
[--noatime yes|no] [--capability <name>:on|off ...]
[--devnodes device:r|w|rw|none]
[--applyconfig <name>] [--setmode restart|ignore] [--description <desc>]
[--netif_add <ifname[,mac,host_ifname,host_mac]]>] [--netif_del <ifname>]
[--bindmount_add <dst[,nosuid,noexec,nodev]>]
[--bindmount_del <dst|all>] [--name <name>]
[--offline_management yes|no] [--offline_service <name>]
[--netdev_add <name> [--netdev_del <name>]
[--iptables <name>] [--disabled <yes|no>]
[--slmmemorylimit B[:B]] [--slmmode ubc|slm|all] [--ioprio <N>]
[--features name:on|off
[UBC parameters]
UBC parameters (N - items, P - pages, B - bytes):
Two numbers divided by colon denote barrier:limit.
In case the limit is not given it is set to the same value as the barrier.
--numproc N[:N]	--numtcpsock N[:N]	--numothersock N[:N]
--vmguarpages P[:P]	--kmemsize B[:B]	--tcpsndbuf B[:B]
--tcprcvbuf B[:B]	--othersockbuf B[:B]	--dgramrcvbuf B[:B]
--oomguarpages P[:P]	--lockedpages P[:P]	--privvmpages P[:P]
--shmpages P[:P]	--numfile N[:N]		--numflock N[:N]
--numpty N[:N]	--numsiginfo N[:N]	--dcachesize N[:N]
--numiptent N[:N]	--physpages P[:P]	--avnumproc N[:N]
--swappages P[:P]
vzctl set <ctid|name> [--save] [--ipadd <addr>] [--ipdel <addr>|all]   [--hostname <name>] ]   [--nameserver <addr>] [--searchdomain <name>] [--onboot yes|no]   [--userpasswd <user>:<passwd>] [--cpuunits <N>] [--cpulimit <N>] [--cpus <N>]   [--diskspace <soft>[:<hard>]] [--diskinodes <soft>[:<hard>]]   [--quotatime <N>] [--quotaugidlimit <N>]   [--rate <dev>:<class>:<Kbits>] [--ratebound yes|no]   [--noatime yes|no] [--capability <name>:on|off ...]   [--devnodes device:r|w|rw|none]   [--applyconfig <name>] [--setmode restart|ignore] [--description <desc>]   [--netif_add <ifname[,mac,host_ifname,host_mac]]>] [--netif_del <ifname>]   [--bindmount_add <dst[,nosuid,noexec,nodev]>]   [--bindmount_del <dst|all>] [--name <name>]   [--offline_management yes|no] [--offline_service <name>]   [--netdev_add <name> [--netdev_del <name>]   [--iptables <name>] [--disabled <yes|no>]   [--slmmemorylimit B[:B]] [--slmmode ubc|slm|all] [--ioprio <N>]   [--features name:on|off   [UBC parameters]UBC parameters (N - items, P - pages, B - bytes):Two numbers divided by colon denote barrier:limit.In case the limit is not given it is set to the same value as the barrier.   --numproc N[:N]	--numtcpsock N[:N]	--numothersock N[:N]   --vmguarpages P[:P]	--kmemsize B[:B]	--tcpsndbuf B[:B]   --tcprcvbuf B[:B]	--othersockbuf B[:B]	--dgramrcvbuf B[:B]   --oomguarpages P[:P]	--lockedpages P[:P]	--privvmpages P[:P]   --shmpages P[:P]	--numfile N[:N]		--numflock N[:N]   --numpty N[:N]	--numsiginfo N[:N]	--dcachesize N[:N]   --numiptent N[:N]	--physpages P[:P]	--avnumproc N[:N]   --swappages P[:P]

Por supuesto hay más opciones y posibilidades, como os comentaba antes, tenéis todo disponible en la página man de vzctl.

vzstat: el top de virtuozzo


vzstat es una utilidad integrada en los sistemas de virtualización Virtuozzo que muestra estadísticas y utilización de recursos a tiempo real, al más puro estilo del comando top.

Entre otras cosas, con vzstat podemos ver el estado general y carga del sistema y el listado de todos los containers con la utilización de recursos utilizada por cada uno. A partir de esta base, podemos personalizar la salida del programa, ordenando por contenedores con un uso mayor de recursos, visualizar el I/O a tiempo real y estadísticas totales de escritura/lectura, etc.

Por defecto, los datos se actualizan cada segundo, podemos modificar este tiempo con el parámetro “-d”. Lo primero que vemos al acceder a vzstat es el uptime del sistema y las medias de carga al igual que en top. A continuación podemos ver el número de contenedores activos, el número de procesos totales en el nodo hardware y el estado de los procesos (running, stopped, zombie, etc). Posteriormente, se muestra un resumen de la utilización de CPU y memoria (similar también a top). Para la memoria podréis comprobar que se muestra mucha información, fragmentación de las zonas de memoria, estado, latencia, caché, swap, etc.

La siguiente sección nos muestra estadísticas a tiempo real de la utilización de las interfaces de red, total de tráfico entrante y saliente en MB/s, paquetes y estadísticas de totales.

En lo referente a disco también podemos ver estadísticas de lectura y escritura por contenedor en MB/s y totales por nodo físico. Os recomiendo no obstante acceder a la página man de la utilidad porque hay muchísima información:

man vzstat

Os dejo algunos ejemplos de utilización:

Información estandar e información de CPU, procesos, sockets, %vm y %km por contenedor:

# vzstat

Información estandar e información de IO extendida (id,st,ior,iow,iort,iowt,ip) por contenedor:

# vzstat -i

Información estandar e información de red extendida (id,st,rx,tx,rxt,txt,rxpt,txpt,ip) por contenedor:

# vzstat -n

Con el parámetro “-o” podemos personalizar nosotros los parámetros a mostrar, ejemplo:

# vzstat -o id,st,vm,km,proc,cpu,sock,fcnt,mlat,ip,host,ior,iow,iort

A partir de aquí podéis seguir investigando y tomar contacto con la utilidad por vuestra cuenta.

Instalar plantillas en Virtuozzo


Parallels cuenta con un repositorio de plantillas, tanto de sistemas operativos como aplicaciones, las cuales podemos instalar de forma sencilla. En este caso vamos a ver como instalar en el nodo Hardware una plantilla de un sistema operativo, para usarlo posteriormente como sistema de máquinas virtuales (contenedores).

Pinchando aquí encontraréis todo el catálogo de plantillas disponibles. En este caso vamos descargar la plantilla de Fedora Core 13. Vamos al nodo hardware y descargamos el rpm:

# wget http://downloads.swsoft.com/cgi-bin/getfile.pl/fedora-core/13/x86_64/fedora-core-13-x86_64-ez-4.0.0-2.swsoft.noarch.rpm

Una vez descargado, simplemente instalamos la plantilla con el comando vzpkg install template:

# vzpkg install template fedora-core-13-x86_64-ez-4.0.0-2.swsoft.noarch.rpm

Ahora, al tratarse de una plantilla de sistema operativo debemos cachearla para poder comenzar a utilizarla como plantilla de contenedores. Ejecutamos un vzpkg list para ver el nombre de la plantilla y luego ejecutamos la caché:

# vzpkg list
centos-5-x86                       2010-06-07 14:34:15
fedora-core-11-x86_64              2010-09-01 14:37:17
# vzpkg create cache fedora-core-11-x86_64

Ahora ya podemos utilizarla como plantilla para nuestros contenedores Virtuozzo.

Montar una unidad NFS en una máquina virtual Virtuozzo


Para poder disponer de un sistema de ficheros NFS en una máquina virtual en Parallels Virtuozzo, lo primero que debemos hacer es activar nfs desde el nodo Hardware para la máquina virtual:

vzctl set 111 --features nfs:on --save

En este caso 111 es el ID de la máquina virtual a activar. Una vez realizado, ya debería figurar nfs como sistema de ficheros soportado en la máquina virtual:

# grep nfs /proc/filesystems
nodev	nfs

Instalamos todo lo necesario para que funcione NFS en la máquina virtual (en este caso RHEL, CentOS o Fedora):

yum install nfs-utils nfs-utils-lib

Arrancamos nfs:

/etc/init.d/rpcbind start
/etc/init.d/nfs start

Configuramos para que arranque al inicio:

chkconfig --level 3 nfs on
chkconfig  --level 3 rpcbind on

Ya deberíamos poder montar una unidad NFS sin problemas, ya sea directamente con el comando mount o desde el fichero /etc/fstab.

mount -t nfs 192.168.0.1:/compartido /mnt/compartido

Y un ejemplo en fstab:

192.168.0.1:/compartido /mnt/compartido nfs rw 	0 0