Nunca 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.
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 containers/lxc/[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!