LXD y ZFS en Ubuntu 20.04

per Victor Carceler darrera modificació 2021-05-15T10:14:14+01:00

lxd-containers.pngUna de las características estrella aunque todavía sea experimental de Ubuntu 20.04 es la instalación del sistema sobre OpenZFS.

LXD puede utilizar distintos backends para el almacenamiento y precisamente ZFS es el recomendado pues permite aprovechar las características COW (Copy on write) para optimizar la gestión de las imágenes y contenedores.

Se pueden comparar las funciones de los diferentes backends soportados en: Storage Backends and supported functions.

Pues bien, cuando se realiza la instalación de Ubuntu 20.04 sobre ZFS se puede utilizar el zpool rpool para crear un nuevo dataset para LXD.

Ubuntu 20.04 sobre OpenZFS: pools y datasets

La instalación de Ubuntu 20.04 sobre OpenZFS define dos zpools: bpool y rpool.

usuario@laika:~$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
bpool 1,88G 263M 1,62G - - 0% 13% 1.00x ONLINE -
rpool 232G 23,5G 208G - - 7% 10% 1.00x ONLINE -
usuario@laika:~$

La función de bpool boot pool— es contener /boot para permitir el arranque del sistema. Este zpool debe crearse con opciones especiales para que el gestor de arranque pueda utilizarlo.

La función de rpoolroot pool— es contener los datasets rpool/ROOT y rpool/USERDATA dentro de los que respectivamente se instala el sistema y se guardan los datos de los usuarios.

Una instalación por defecto tiene este aspecto:

usuario@laika:~$ zfs list
NAME                                               USED  AVAIL     REFER  MOUNTPOINT
bpool                                              262M  1,49G       96K  /boot
bpool/BOOT                                         261M  1,49G       96K  none
bpool/BOOT/ubuntu_hrsnga                           261M  1,49G      184M  /boot
rpool                                             23,5G   201G       96K  /
rpool/ROOT                                        5,56G   201G       96K  none
rpool/ROOT/ubuntu_hrsnga                          5,56G   201G     3,32G  /
rpool/ROOT/ubuntu_hrsnga/srv                        96K   201G       96K  /srv
rpool/ROOT/ubuntu_hrsnga/usr                       552K   201G       96K  /usr
rpool/ROOT/ubuntu_hrsnga/usr/local                 456K   201G      144K  /usr/local
rpool/ROOT/ubuntu_hrsnga/var                      1,65G   201G       96K  /var
rpool/ROOT/ubuntu_hrsnga/var/games                  96K   201G       96K  /var/games
rpool/ROOT/ubuntu_hrsnga/var/lib                  1,62G   201G     1,48G  /var/lib
rpool/ROOT/ubuntu_hrsnga/var/lib/AccountsService   296K   201G      104K  /var/lib/AccountsService
rpool/ROOT/ubuntu_hrsnga/var/lib/NetworkManager    808K   201G      156K  /var/lib/NetworkManager
rpool/ROOT/ubuntu_hrsnga/var/lib/apt              62,9M   201G     56,1M  /var/lib/apt
rpool/ROOT/ubuntu_hrsnga/var/lib/dpkg             63,1M   201G     37,5M  /var/lib/dpkg
rpool/ROOT/ubuntu_hrsnga/var/log                  33,6M   201G     21,6M  /var/log
rpool/ROOT/ubuntu_hrsnga/var/mail                   96K   201G       96K  /var/mail
rpool/ROOT/ubuntu_hrsnga/var/snap                  304K   201G      144K  /var/snap
rpool/ROOT/ubuntu_hrsnga/var/spool                 376K   201G      120K  /var/spool
rpool/ROOT/ubuntu_hrsnga/var/www                    96K   201G       96K  /var/www
rpool/USERDATA                                    18,0G   201G       96K  /
rpool/USERDATA/root_i0pjda                         472K   201G      268K  /root
rpool/USERDATA/usuario_i0pjda                     18,0G   201G     17,4G  /home/usuario
usuario@laika:~$

De todos estos datasets el demonio zsys irá creando snapshots al instalar paquetes (snapshots del sistema) o con el paso del tiempo (snapshots de los datos del usuario).

Un nuevo dataset para lxd

A partir de esta situación resulta trivial crear un nuevo dataset rpool/lxd para que lxd lo utilice como almacenamiento.

root@laika:/home/usuario# zfs create -o mountpoint=none rpool/lxd

Ahora podemos instalar lxd

root@laika:/home/usuario# snap install lxd
Se ha instalado lxd 4.0.1 por Canonical✓
root@laika:/home/usuario#

Y configurar lxd para que utilice el dataset rpool/lxd

root@laika:/home/usuario# lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (zfs, ceph, btrfs, dir, lvm) [default=zfs]: 
Would you like to create a new zfs dataset under rpool/lxd? (yes/no) [default=yes]: no
Create a new ZFS pool? (yes/no) [default=yes]: no
Name of the existing ZFS pool or dataset: rpool/lxd
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like LXD to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 
root@laika:/home/usuario#

Con lo que se crearán diferentes datasets por en el interior de rpool/lxd

usuario@laika:~$ zfs list rpool/lxd -r
NAME                                 USED  AVAIL     REFER  MOUNTPOINT
rpool/lxd                            960K   201G       96K  none
rpool/lxd/containers                  96K   201G       96K  none
rpool/lxd/custom                      96K   201G       96K  none
rpool/lxd/deleted                    480K   201G       96K  none
rpool/lxd/deleted/containers          96K   201G       96K  none
rpool/lxd/deleted/custom              96K   201G       96K  none
rpool/lxd/deleted/images              96K   201G       96K  none
rpool/lxd/deleted/virtual-machines    96K   201G       96K  none
rpool/lxd/images                      96K   201G       96K  none
rpool/lxd/virtual-machines            96K   201G       96K  none
usuario@laika:~$ 

Prueba de LXD

Finalmente se pueden lanzar algunos contenedores. Al lanzar el primer contenedor se descargará automáticamente la imagen utilizada:

usuario@laika:~$ time lxc launch ubuntu:20.04 u1
Creating u1
Starting u1                                 

real	0m34,895s
user	0m0,213s
sys	0m0,108s
usuario@laika:~$

El segundo contenedor se lanzará mucho más rápido:

usuario@laika:~$ time lxc launch ubuntu:20.04 u2
Creating u2
Starting u2

real	0m4,320s
user	0m0,094s
sys	0m0,052s
usuario@laika:~$

Si inspeccionamos los datasets en el interior de rpool/lxd encontramos que cada uno de los contenedores tiene su propio dataset (que consume muy poco espacio) y que la imagen está en otro dataset.

usuario@laika:~$ zfs list rpool/lxd -r
NAME                                                                                USED  AVAIL     REFER  MOUNTPOINT
rpool/lxd                                                                           666M   200G       96K  none
rpool/lxd/containers                                                               46,0M   200G       96K  none
rpool/lxd/containers/u1                                                            22,9M   200G      621M  /var/snap/lxd/common/lxd/storage-pools/default/containers/u1
rpool/lxd/containers/u2                                                            22,9M   200G      621M  /var/snap/lxd/common/lxd/storage-pools/default/containers/u2
rpool/lxd/custom                                                                     96K   200G       96K  none
rpool/lxd/deleted                                                                   480K   200G       96K  none
rpool/lxd/deleted/containers                                                         96K   200G       96K  none
rpool/lxd/deleted/custom                                                             96K   200G       96K  none
rpool/lxd/deleted/images                                                             96K   200G       96K  none
rpool/lxd/deleted/virtual-machines                                                   96K   200G       96K  none
rpool/lxd/images                                                                    619M   200G       96K  none
rpool/lxd/images/647a85725003d873f8bb9a5bd1a09bdc7fd4bcb393b2cf629f7e0edaa58f5637   619M   200G      619M  /var/snap/lxd/common/lxd/storage-pools/default/images/647a85725003d873f8bb9a5bd1a09bdc7fd4bcb393b2cf629f7e0edaa58f5637
rpool/lxd/virtual-machines                                                           96K   200G       96K  none
usuario@laika:~$