LXD y ZFS en Ubuntu 20.04
Una 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 rpool
—root 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:~$