03 ago

LXC integrado con ZFS

Sin títuloNunca trabajé muy seriamente con lxc hasta ahora, total que estuve mirando para aprender sobre el tema y resulta que sacaron lxc 1.0.3, con un monton de cosas muy molonas, entre ellas la posibilidad de que se integre con sistemas de ficheros, desconozco si las versiones anteriores ya podían hacer, yo parto de la 1.0.3 y todo lo anterior esta obsoleto :).

Total que esta integración la tiene con bastantes sistemas, pero me pareció muy interesante dos de ellos btrfs (que también empece a trabajar con el y me parece muy interesante) y por supuesto zfs. Así que no hay mejor forma de entender que leer y después probar.

 

Este post me centrare en hacer trabajar lxc con zfs de forma celestial .

Pues venga al lío que se nos va el Domingo.

Instalación de LXC y ZFS

Primero de todo instalaremos lxc y zfs, la parte de zfs la podéis encontrar explicada en en Instalar OpenZFS en LINUX


[email protected]:~# apt-get install ubuntu-zfs lxc

En mi caso la máquina tiene un disco principal de 8GB y vamos añadir dos más de 10GB cada uno, para poder hacer raidz-1 con zfs, y allí es donde montaremos nuestros lxc,  lo haremos en dos partes, primero zfs.

Los discos que tenemos son los siguientes.

ZFS


Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Haremos el pool con los dos de 10GB, sdb y sdc


[email protected]:~# zpool create -f containers raidz /dev/sdb /dev/sdc


[email protected]:~# df -h

containers      9.8G     0  9.8G   0% /containers

Pues ya tenemos el sitio donde meter los containers, ahora a por lxc

LXC

Primero de todo tenemos que decirle a lxc que coloque los containers en el pool de zfs, lo haremos con dos directivas en el fichero

vim /etc/lxc/lxc.conf

lxc.lxcpath = /containers/lxc
lxc.bdev.zfs.root = /containers/lxc

lxc.lxcpath -> Path donde estarán todos los container

lxc.bdev.zfs.root -> Nombre por defecto del zfs root

Deberemos crear el directorio lxc dentro del pool containers,  sino mal asunto.


[email protected]:~# zfs create containers/lxc

[email protected]:~# df -h

containers             9.8G 128K 9.8G  1%     /containers
containers/lxc    9.8G 128K 9.8G  1%    /containers/lxc

Y con esto ya tenemos el entorno montado, ahora es el momento de probar!

LXC más ZFS

Vamos a crear un container de forma normal, pero le daremos la opción -B zfs, es el valor predeterminado del directorio, pero si asignamos zfs o btrfs o lvm, lo que nos debería hacer es que el sistema de ficheros sea zfs y nos generara un nuevo volumen por contenedor y –zfsroot donde le diremos donde esta el container.


[email protected]:~# lxc-create -t ubuntu -n test -B zfs --zfsroot containers/lxc

Como es el primer container, esta descargando la imagen y eso lleva un ratillo… una vez termine nos dice este mensaje que es muy interesante y útil.


##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

Pues vamos a ver como quedo la situación


[email protected]:~# zfs list
NAME                 USED AVAIL REFER MOUNTPOINT
containers           318M 9.47G 31K /containers
containers/lxc       318M  9.47G 34K /containers/lxc
containers/lxc/test  318M 9.47G 318M /containers/lxc/test/rootfs

Ahí lo tenemos test esta listo para arrancar, no la hagamos esperar mas.


lxc-start --name test

Y ya tenemos el tema andando, ahora por último lo que vamos hacer es sacarle un poco de jugo al zfs, que para eso lo hemos montado, vamos a jugar con la compresión, deduplicacion y snapshots.

Tenemos más detalle de los mismos en post anteriores, así que aquí vamos a ir al lío directamente.

Deduplicacion y compresion

Snapshots

Compresion, deduplicacion y snapshots


zfs set dedup=on containers

zfs set compression=lz4 containers

zpool set listsnapshots=on containers

La compresión en lz4 que es lo que se lleva ahora ;).

Comprobamos que este todo activado.


[email protected]:~# zfs get compression
NAME                PROPERTY    VALUE SOURCE
containers          compression lz4   local
containers/lxc      compression lz4   inherited from containers
containers/lxc/test compression lz4   inherited from containers
[email protected]:~# zfs get dedup
NAME                 PROPERTY VALUE SOURCE
containers           dedup on local
containers/lxc       dedup on inherited from containers
containers/lxc/test  dedup on inherited from containers

Pues venga a jugar!!!

Vamos a crear otro container a ver como se comporta la deduplicacion y la compresion.


lxc-create -t ubuntu -n test2 -B zfs --zfsroot containers/lxc

Una vez creado si comprobamos nos llevaremos una sorpresa


[email protected]:~# zfs get compressratio

containers/lxc/test compressratio 1.00x -
containers/lxc/test2 compressratio 2.10x -


[email protected]:~# zpool list

containers 19.9G 947M 19.0G 4% 1.01x ONLINE -

Uno de los containers esta comprimido pero el otro no, y aún por encima no aplico nada de deduplicacion :(, esto es sencillamente porque hemos aplicado esas características después de crear “test”, así que hay que tenerlo en cuenta.

Vamos hacer un snapshot y crear un nuevo container, ahí si que veremos que la deduplicacion surge efecto.

Creamos el snapshot.


[email protected]:~# zfs snapshot [email protected]
[email protected]:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
[email protected] 0 - 31K -

Creamos test3


lxc-create -t ubuntu -n test3 -B zfs --zfsroot containers/lxc

Y comprobamos


[email protected]:~# zpool list
containers 19.9G 962M 18.9G 4% 2.02x ONLINE -

Ahora si, tenemos test2 y test3 ocupando como si solo fuera 1 a más a más como están comprimidos el tamaño es inferior respecto test1


containers/lxc/test  319M  4% /containers/lxc/test/rootfs
containers/lxc/test2 153M  2% /containers/lxc/test2/rootfs

Por ultimo los snapshots, como habeis visto hemos realizado un snapshot con zfs, pues otra de las cosas molonas que trae esta version de lxc es que puede controlar los snapshots de zfs, btrfs, lo podemos comprobar haciendo.

[email protected]:~# lxc-snapshot -n test3 -L
snap0 (/containers/lxcsnaps/test3) 2014:08:02 04:53:18
snap1 (/containers/lxcsnaps/test3) 2014:08:02 04:53:33

Ahí los tenemos :)

Podemos crear snapshot de zfs directamente de lxc en un container especifico.


[email protected]:~# lxc-snapshot -n test2
could not find any snapshots to destroy; check snapshot names.

[email protected]:~# zfs list -t snapshot -o name,creation
NAME CREATION
[email protected] Sat Aug 2 4:58 2014

Lo lanzamos con lxc y lo comprobamos con zfs, al revés que en el caso anterior, parece que si que se entienden(que era el objetivo del post :) )

Pues ya tenemos el sistema montado…

Ale a desfrutarlo!