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

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

Backups en Virtuozzo 4.6 con vzabackup / vzarestore

Virtuozzovzabackup y vzarestore son las utilidades designadas a la gestión de copias de seguridad tanto para nodos Hardware y máquinas virtuales Virtuozzo.

vzabackup

vzabackup permite hacer copia de seguridad tanto del propio nodo Hardware como de uno, varios o todos los contenedores del mismo. También permite hacer backups de nodos remotos. A continuación podéis ver todas las opciones disponibles:

vzabackup [BACKUP OPTIONS...] NODE1 ... [CT OPTIONS...]

[BACKUP OPTIONS]
-F, -I, --Tfull
	Create a full backup.
-i, --Tinc
	Make an incremental backup or, if no full backups are available, a full backup.
--Tdiff
	Make a differential backup or, if no full backups are available, a full backup
-o,--rm-old
	Create a backup and then remove the oldest backups.
-d,--rm-tag
	Create a backup and then remove the backup with the
	specified backupID. You can learn the backup IDs of the
-J
	Do backing up nodes simultaneously if more than one source node specified.
--force
	Don't stop on errors during backup of Container. Should be used when more than
	one Container's specified to backup.
--view-folder
	 Show current backup storage configuration.
--set-folder-creds [USER[:PASSWORD]]
	 Set backup storage login credentials.
--backup-folder-path PATH
	Path to a custom backup storage location.
--backup-folder-login USER
	Username for a custom backup storage on a samba share.
--backup-folder-passwd PASSWORD
	Password for a custom backup storage on a samba share.
--set-folder
	Use --backup-folder-* options values to change backup storage configuration.
-D DESCRIPTION
	Set backup description.
-C
	Set compression level in range from 0 to 3.
--storage [USER[:PASSWD]]@ADDRESS
	Set address and credentials for storage server, where backup is stored.
NODE
	NODE parameter specifies the node to be backed up.

	 Node should be specified in format: [USER[:PASSWD]]@ADDRESS.

[CT OPTIONS]
-e
	List of Containers to backing up. Back up all the Containers if omitted.
-x
	List of Containers to skip. Do not skip any Containers if omitted.
--include-files
	Paths(files) to include in backups.
--exclude-files
	Paths(files) to exclude from backups.

Vamos a hacer un ejemplo práctico en el que queremos hacer una copia de seguridad de todos los contenedores del nodo Hardware local en la ruta /backup (en este caso una unidad montada por NFS):

# vzabackup --backup-folder-path /backup -i localhost

Con -i indicamos que queremos hacer backups incrementales y con “localhost” que son para el nodo local. Si quisieramos hacerlo en un storage remoto y de un nodo remoto sería así:

# vzabackup  --storage root:password@192.168.0.100 root:password_remoto@192.168.0.111

Si quisieramos hacerlo únicamente del contenedor 101:

# vzabackup --backup-folder-path /backup -i localhost -e 101

El resto es jugar con las opciones, la compresión, el tipo de backup, etc. A la hora de hacer backups de servidores remotos hay que asegurarse que la conectividad SSH es satisfactoria y que pueden comunicarse mediante llave SSH.

vzarestore

Lo primero que debemos saber de vzarestore es que permite mostrar un listado de los backups disponibles en el nodo seleccionado. Si quisieramos ver los backups disponibles en el nodo local y en la ruta /backup:

# vzarestore --list --backup-folder-path /backup
Show existing backups...
CTID    Title                   Creation date/time     Type Size
2719275 vps1                2011-04-15T111346+0002 full 213.19 Mb
305470  vps2                2011-04-15T110646+0002 full 262.13 Mb
3574391 vps3               2011-04-15T110041+0002 full 245.63 Mb
5195637 vps4               2011-04-15T111616+0002 full 710.83 Mb
8426989 vps5               2011-04-15T113722+0002 full 291.22 Mb

Para ver los backups en nodos remotos utilizaríamos el parámetro –storage:

# vzarestore --list --storage root:password_remoto@192.168.0.110

Bien, para restaurar un backup únicamente tendríamos que seleccionar su ID (CTID) y en caso de estar en una ubicación remota especificarla:

Remoto:

# vzarestore 101 --storage root:password_remoto@192.168.200.200

Local:

# vzarestore 101

En caso de contar con backups incrementales, podríamos especificar el punto de restauración con el parámetro “-b” seguido del identificador del backup (no el del contenedor). A continuación la ayuda del comando:

vzarestore is the utility to restore Container's which were backed up by means
of vzbackup. Also it can be used to remove, listing backups
and browsing contents of backups.

vzarestore [CTID[:New CTID] | -e  | -x ] [RESTORE OPTIONS] [STORAGE SERVER]
vzarestore -r, --remove  [STORAGE SERVER]
vzarestore -l,--list [LIST OPTIONS...] [STORAGE SERVER]
vzarestore --browse backupID [BROWSE OPTIONS...] [STORAGE SERVER]
vzarestore --print-ve-config BackupID [STORAGE SERVER]
vzarestore -h,--help

RESTORE OPTIONS:
-B
	Treat parameters for -e and -x options as backup ID's.
--force
	Don't stop on errors during restore of Container.
--files
	Separate files to restore, FILE is the full path to the file.
--skip-ve-config
	Do not restore Container config.
-b backupID
	Backup ID to restore files, if omitted then last backup will used.
--skip-locked
	Don't stop on errors during restore of locked files.

LIST OPTIONS
-f,--full
	Show full information (this option can be used only with --list).
--latest
	Show latest backups only (this option can be used only with --list).
-e
	List of Container's to show.
-B
	Treat parameters for -e option as backup ID's.

BROWSE OPTIONS
-d,--dir DIR
	Set the paths to the folder whose contents is to be shown.

STORAGE SERVER
--storage [USER[:PASSW]]@ADDRESS
	Set address and credentials to storage server.
	When this argument is omitted then local node will be used as storage server.
--backup-folder-path PATH
	Path to a custom backup storage location.

Virtuozzo: Averiguar a que contenedor pertenece un proceso

Dentro de un nodo físico Virtuozzo, si ejecutamos un top podemos ver los procesos que más CPU y memoria están consumiendo, pero no podemos averiguar a simple vista a que máquina virtual pertenece. Para averiguarlo tenemos dos opciones.

La primera es sustituir el uso de top por vztop. Se trata de una versión de top modificada por Virtuozzo a través de la cual aparece una nueva columna que muestra el ID de la máquina virtual.

$ vztop

vztop - 16:59:44 up 72 days,  5:11,  1 user,  load average: 2.04, 2.60, 2.76
Tasks: 528 total,   1 running, 522 sleeping,   0 stopped,   5 zombie
Cpu(s): 19.6% us,  7.4% sy,  0.2% ni, 62.2% id,  9.9% wa,  0.0% hi,  0.6% si
Mem:   4038416k total,  3948496k used,    89920k free,   173288k buffers
Swap:  4192956k total,      160k used,  4192796k free,  1701956k cached

 CTID   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  104 20875 nobody    15   0 41748  32m 1508 S   11  0.8   0:00.17 httpd
  104 11085 nobody    15   0 41904  33m 1564 S   10  0.8   0:01.53 httpd
  104 20899 nobody    15   0 41748  32m 1508 S   10  0.8   0:00.09 httpd
  104 18757 nobody    15   0 42016  33m 1556 S    8  0.8   0:00.64 httpd
  104 21077 527       18   0     0    0    0 Z    8  0.0   0:00.04 php
  104 21079 527       18   0     0    0    0 Z    8  0.0   0:00.04 php
  104 18752 nobody    15   0 41632  32m 1536 S    6  0.8   0:00.50 httpd
  104 19390 nobody    15   0 41748  32m 1532 S    6  0.8   0:00.44 httpd
  104 20884 nobody    15   0 41932  33m 1600 S    6  0.8   0:00.11 httpd

La otra opción es utilizar otro comando propio de Virtuozzo,

vzpid

. Su uso es sencillo, hay que pasar como parámetro el PID y nos dirá el contenedor/máquina virtual al que pertenece:

# vzpid 20845
Pid	VEID	Name
20845	109	httpd

109 es el ID de la máquina virtual, ejecutando un

vzlist

veremos el hostname y más información sobre la misma:

# vzlist 109
      CTID      NPROC STATUS    IP_ADDR         HOSTNAME
       109        90 running   192.168.0.155       vps1.test.com

Activar Quotas en VPS Virtuozzo

Vamos a seguir los pasos descritos en la documentación de cPanel sobre la activación de quotas en una máquina virtual Virtuozzo.

Lo primero que tenemos que hacer es activar las Quotas a nivel de Virtuozzo/Máquina virtual. Este es el primer nivel disponible, el cual permite asignar un espacio e inodos a un contenedor VPS. Para verificar si están activadas a nivel de contenedor, ejecutamos el siguiente comando:

# vzquota show ID_de_contenedor

Si tenemos activadas las Quotas, debería aparecer una información similar a:

   resource          usage       softlimit      hardlimit    grace
  1k-blocks        2900544        10485760       10485760
     inodes         146576          600000         620000    

Los valores de espacio en disco e inodos se definen en el fichero de configuración de la máquina virtual (ve.conf):

DISKINODES="600000:620000"
DISKSPACE="10485760:10485760"

Se pueden modificar a tiempo real:

# vzctl set 101 --diskspace 1000000:1100000 --save
# vzctl set 101 --diskinodes 90000:91000 --save

Las Quotas de segundo nivel las define el parámetro QUOTAUGIDLIMIT del fichero de configuración ve.conf, por defecto su valor es desactivado (0). Si lo activamos permitimos que se calculen las Quotas dentro de la máquina virtual por usuario y grupo.

Si la ejecución del siguiente comando es igual a 0 significa que no están activadas, si devuelve un valor distinto a 0 están activas (CT_ID es el ID de contenedor):

grep -i QUOTAUGIDLIMIT /etc/sysconfig/vz-scripts/CT_ID.conf

Cambiando este valor y reiniciando la máquina virtual ya las tendremos activadas, el número configurado indicará el límite de número de propietarios de fichero en el VPS. A tiempo real (también requiere reinicio se puede modificar también.

# zctl set 101 --quotaugidlimit 50 --save

Una vez realizado esto, si utilizamos cPanel/WHM únicamente tendríamos que inicializar las Quotas desde la interfaz WHM, sección “Initial Quota Setup“.

Arreglar inconsistencias y fallos en VZFS (máquina virtual Virtuozzo)

El otro día, tras la migración de una máquina virtual en modo online (sin parada de servicio) me encontré con el problema de que ciertos ficheros (realmente son enlaces simbólicos a la plantilla del sistema operativo que utiliza el VPS) estaban corruptos, por ejemplo, en la ruta /var/empty, sshd aparecía del siguiente modo:

?--------- ? ? ? ? ? sshd

Esto provocaba que el servicio SSH no levantara. Para solventar este tipo de problemas, Virtuozzo ofrece una herramienta que revisa todos los ficheros/enlaces simbólicos de la máquina virtual contra los de su plantilla, en caso de que no sean correctos los restablece. Efectivamente así fue, ejecutando el siguiente comando todos los enlaces fueron regenerados correctamente:

# vzfsutil --call=move --oall=do -t /vz/template /vz/private/$VEID

La utilidad se ejecuta con el comando vzfsutil, le indicamos la ruta en la que se encuentran en primera instancia las plantillas (templates) y después la zona privada de la máquina virtual (cambiaríamos $VEID por el id de la máquina virtual). El parámetro

--call

sirve para corregir todos los errores que la ejecución de la herramienta encuentre, y le especificamos que mueva “move” los ficheros con inconsistencias a la ruta

$VE_PRIVATE/lost_files

, podríamos decirle que los borre directamente o que únicamente nos informe y no haga nada.

Os recomiendo, en caso de encontrar este problema revisar bien la documentación de vzfsutil aquí.

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.