2012/11/28

FreeBSD The Z File System (ZFS)

Introduccion:

Teniendo FreeBSD ya instalado y funcionando, le vamos a crear una unidad formada por varios discos y usaremos ZFS RAID-Z para guardar los datos de home y los contenidos de los usuarios que vamos creando.

Wikipedia ZFS:
ZFS es un sistema de archivos desarrollado por Sun Microsystems para su
sistema operativo Solaris. El significado original era 'Zettabyte File System'
, pero ahora es un acrónimo recursivo.

El anuncio oficial de ZFS se produjo en Septiembre de 2004.1 El código fuente del producto final se integró en la rama principal de desarrollo de Solaris el 31 de octubre de 20052 y fue lanzado el 16 de noviembre de 2005 como parte del build 27 de OpenSolaris.

ZFS fue diseñado e implementado por un equipo de Sun liderado por Jeff Bonwick.

ZFS destaca por su gran capacidad, integración de los conceptos
anteriormente separados de sistema de ficheros y administrador de
volúmenes en un solo producto, nueva estructura sobre el disco, sistemas de
archivos ligeros y una administración de espacios de almacenamiento
sencilla."

Wikipedia Storage pools:
A diferencia de los sistemas de ficheros tradicionales que residen encima de un sólo dispositivo subyacente y por lo tanto requieren un gestor de volúmenes separado si se precisa un sistema de archivos mayor que el dispositivo, ZFS se apoya en espacios de almacenamiento virtuales (virtual storage pools). Los espacios se construyen a partir de uno o más dispositivos virtuales (vdevs), de los que cada uno es o bien un raw device, un mirror (RAID 1) de uno o más dispos todos los vdevs esa disponible para todos los sistemas de archivos del zpool.

Requerimientos:

* FreeBSD instalado
* Leer este manual

Distribucion de los discos:

0    ad10      ada0 }=> FreeBSD:    /, /swap, /var, /tmp, /usr

1    ad12      ada1
2    ad14      ada2
                            }=> ZFS RAID-Z: /storage/home
3    ad16      ada3
4    ad18      ada4

ada0 tendra nuestro FreeBSD y las particiones necesarias como se describe en Example 3-3. Creating Traditional Split Filesystem Partitions

ada1, 2, 3 y 4 seran los discos que usaremos para crear nuestro ZFS RAID-Z

El proceso:

Luego de conectar los discos para el RAID-Z y encender nuestro FreeBSD, miramos como estan los discos:

# cat /var/run/dmesg.boot | grep ada

En la salida nos muestra que efectivamente tenemos ada1, ada2, ada3 y ada4.

Segun el handbook:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/filesystems-zfs.html

Hacemos que se carguen los modulos al iniciar FreeBSD:

# echo '# The Z File System (ZFS)' >> /boot/loader.conf
# echo 'vm.kmem_size="512M"' >> /boot/loader.conf
# echo 'vm.kmem_size_max="512M"' >> /boot/loader.conf
# echo 'vfs.zfs.arc_max="40M"' >> /boot/loader.conf
# echo 'vfs.zfs.vdev.cache.size="5M"' >> /boot/loader.conf

Si tengo menos de 4GB de RAM se pone tambien esta otra linea:

# echo 'vfs.zfs.prefetch_disable="0"' >> /boot/loader.conf

Nota
Las lineas de arriba son diferentes a las que estan en el handbook ya que unos mensajes al cargar FreeBSD recomiendan dichos valores.

Hacemos que se active ZFS al iniciar FreeBSD:

# echo '# Using ZFS' >> /etc/rc.conf
# echo 'zfs_enable="YES"' >> /etc/rc.conf

Iniciamos ZFS
# /etc/rc.d/zfs start

Creamos el pool con los discos y lo llamaremos "storage":

# zpool create storage raidz ada1 ada2 ada3 ada4

si da un error, usar la opcion -f, algo asi "zpool create -f storage ..."

Creamos el ZFS y lo llamaremos "home"

# zfs create storage/home

Copiamos el contenido de home, borramos las viejas rutas y creamos las nuevas:

# cp -rp /home/* /storage/home
# rm -rf /home /usr/home
# ln -s /storage/home /home
# ln -s /storage/home /usr/home

Reiniciamos FreeBSD:

# reboot

Al entrar nuevamente a FreeBSD, miramos como esta la cosa:

# df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
...
storage         2.7T     45k    2.7T     0%    /storage
storage/home    2.7T     54k    2.7T     0%    /storage/home <- Nuestro ZFS RAID-Z :-)

# mount
...
storage on /storage (zfs, local, nfsv4acls)
storage/home on /storage/home (zfs, local, nfsv4acls)

Activamos el reporte diario del estado del ZFS:

# echo '# The ZFS' >> /etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf

Ver estado del raid:

# zpool status
  pool: storage
 state: ONLINE
 scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    storage     ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        ada1    ONLINE       0     0     0
        ada2    ONLINE       0     0     0
        ada3    ONLINE       0     0     0
        ada4    ONLINE       0     0     0

errors: No known data errors

# zpool status -x
all pools are healthy

Ejemplo de como recuperar nuestro RAID si uno de los discos se daña (se copia del handbook y se ajustan los nombres "ad" por "ada"):

21.2.2.3 Recovering RAID-Z

pool: storage
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    storage     DEGRADED     0     0     0
      raidz1-0  DEGRADED     0     0     0
      ada1      OFFLINE      0     0     0  <- El disco ada1 malo
      ada2      ONLINE       0     0     0
      ada3      ONLINE       0     0     0
      ada4      ONLINE       0     0     0

errors: No known data errors

Sacamos ada1 del arreglo:

# zpool offline storage ada1

Apagamos el equipo:

# shutdown -h now

Cambiamos el disco ada1 malo por uno bueno y encendemos el equipo

Agregamos el disco ada1 al arreglo:

# zpool replace storage ada1

Verificamos:

# zpool status storage
 pool: storage
 state: ONLINE
 scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008
config:

    NAME        STATE     READ WRITE CKSUM
    storage     ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
      ada1      ONLINE       0     0     0
      ada2      ONLINE       0     0     0
      ada3      ONLINE       0     0     0
      ada4      ONLINE       0     0     0

errors: No known data errors

# zpool status -x
all pools are healthy

Si queremos eliminar el POOL y el ZFS que tenemos hasta el momento:

Cuidado, los dos comandos siguientes eliminan el arreglo y los datos!

Eliminar el ZFS:

# zfs destroy storage/home

Eliminar el pool:

# zpool destroy storage

Bueno, ya tenemos nuestro arreglo de discos en ZFS RAID-Z, pero una de las cosas interesantes de todo esto son las quotas de disco para los usuarios que se conectaran desde la red por Samba...

21.2.2.5 ZFS Quotas

Crear el ZFS para jdoe:

# zfs create storage/home/jdoe

Crearle una quota de 10G a jdoe:

# zfs set quota=10G storage/home/jdoe

Reporte de la quota:

# zfs get quota storage/home/jdoe
NAME               PROPERTY  VALUE  SOURCE
storage/home/jdoe  quota     10G     local

Ejemplo de como quitarle la quota a jdoe:

# zfs set quota=none storage/home/jdoe

Reporte de la quota (para ver si se la quito):

# zfs get quota storage/home/jdoe
NAME               PROPERTY  VALUE  SOURCE
storage/home/jdoe  quota     none   local

Ahora ya podemos crear el usuario "jdoe":

# adduser
Username: jdoe
Full name: John Doe
...

Por defecto al agregar el usuario se crea la carpeta /home/jdoe y esta gracias al link que ya tenemos se creara en storage/home/jdoe

Ahora supongamos que luego de mucho tiempo queremos hacer una instalacion completamente nueva de FreeBSD en ada0 y logicamente queremos continuar usando nuestro ZFS RAID-Z y los datos que en ese lugar tenemos...

En el FreeBSD recien instalado

Cargar las opciones en el loader.conf:

# echo '# The Z File System (ZFS)' >> /boot/loader.conf
# echo 'vm.kmem_size="512M"' >> /boot/loader.conf
# echo 'vm.kmem_size_max="512M"' >> /boot/loader.conf
# echo 'vfs.zfs.arc_max="40M"' >> /boot/loader.conf
# echo 'vfs.zfs.vdev.cache.size="5M"' >> /boot/loader.conf

Si tengo menos de 4GB de RAM se pone esta otra linea:

# echo 'vfs.zfs.prefetch_disable="0"' >> /boot/loader.conf

Cargar las opciones en el rc.conf:

# echo '# Using ZFS' >> /etc/rc.conf
# echo 'zfs_enable="YES"' >> /etc/rc.conf
# /etc/rc.d/zfs start

Importar el pool:

# zpool import storage

Activamos el reporte diario del estado del ZFS:

# echo '# The ZFS' >> /etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf

Eliminar las rutas viejas y crear las nuevas para el storage:

# rm -rf /home /usr/home
# ln -s /storage/home /home
# ln -s /storage/home /usr/home

Listo, si reiniciamos el FreeBSD, debemos poder ver todo bien.

Este manual se hizo con FreeBSD 9.0 RELEASE.

Actualizacion 2014/10/09

Recientemente instale FreeBSD 10.0 con la nueva opcion ZFS (experimental) para usar ese sistema de archivos tambien para FreeBSD.

Ya no se agrega nada relacionado con el soporte a ZFS en /etc/rc.conf, tampoco hay que agregar parametros en /boot/loader.conf pues en el nuevo instalador de FreeBSD 10.0 ya deja todo listo.

Hay que eliminar el volumen zroot/usr/home para poder montar /storage/home

# umount /usr/home
# zfs destroy zroot/usr/home
# rm /home
# zpool import storage
# ln -s /storage/home /home
# ln -s /storage/home /usr/home