Introducción a btrfs

Butter Filesystem, o btrfs, es un "nuevo" filesystem que toma bastantes ideas de ZFS de Solaris. Su idea fundamental es unificar la gestión de ficheros y de volúmenes (tipo LVM) bajo un mismo entorno. De esta forma, operaciones como añadir o quitar discos en caliente, redistribuir los datos (balance) o cambiar el nivel de protección (RAID) son factibles y mucho más eficientes al conocer qué ficheros están involucrados en cada operación (y no simplemente unos bloques que desconocemos si contienen datos o no).

Teniendo ya creado un filesystem btrfs, podemos empezar a sacar algo de información de esta forma:

$ df -ht btrfs
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-5       838G  123G  715G  15% /run/media/fran/wd20btrfs

$ sudo btrfs filesystem show /run/media/fran/wd20btrfs/
Label: 'wd20btrfs'  uuid: 7bb1d318-c7a9-40d8-995a-972a9d43544f
    Total devices 1 FS bytes used 120.15GiB
    devid    1 size 837.59GiB used 124.04GiB path /dev/mapper/luks-0aad2fa7-f2c9-4acb-81f5-5197751fee3e

Btrfs v3.18.1

Dentro de btrfs existe el concepto de subvolúmenes, que vendrían a ser similares a los filesystems zfs. Los subvolúmenes tienen una estructura jerárquica y pueden ser susceptibles de hacer snapshots con ellos, enviarlos con btrfs send/receive, etc.

$ sudo btrfs subvolume list -puta /run/media/fran/wd20btrfs/ 
ID      gen     parent  top level       uuid    path
--      ---     ------  ---------       ----    ----
257     944     5       5               75a8331b-9cd3-0d46-b773-9aaba88b6369    root
514     950     5       5               c767358c-83e0-134f-9698-2ae535742284    backup
556     951     514     514             54f942af-31e7-6e4c-ae4a-691d4642ddfd    <FS_TREE>/backup/.snapshots
558     828     556     556             add72c57-3f1b-a143-8902-cc0242e971bf    <FS_TREE>/backup/.snapshots/2/snapshot
559     841     556     556             9e6e71aa-8ddc-ee44-a0cc-628ab659c544    <FS_TREE>/backup/.snapshots/3/snapshot
560     848     556     556             fc44d63a-393d-294e-b868-6d12c9e5515f    <FS_TREE>/backup/.snapshots/4/snapshot

$ sudo btrfs subvolume show /run/media/fran/wd20btrfs/                                                   
/run/media/fran/wd20btrfs is btrfs root

$ sudo btrfs subvolume show /run/media/fran/wd20btrfs/backup/
/run/media/fran/wd20btrfs/backup
    Name:                   backup
    uuid:                   c767358c-83e0-134f-9698-2ae535742284
    Parent uuid:            -
    Creation time:          2015-01-20 22:03:20
    Object ID:              514
    Generation (Gen):       950
    Gen at creation:        202
    Parent:                 5
    Top Level:              5
    Flags:                  -
    Snapshot(s):
                            .snapshots/2/snapshot
                            .snapshots/3/snapshot
                            .snapshots/4/snapshot
                            .snapshots/5/snapshot

Al igual que en ZFS, las herramientas df y du no necesariamente muestran información correcta sobre nuestro filesystem. Factores como la compresión, nivel de RAID, etc harán que no concuerden estas informaciones con el uso real de espacio en disco y sobre la cantidad de información que este contiene.

En el ejemplo de abajo, podemos ver que hay 119.01 GiB de datos, pero solo ocupan en disco 118.45.

$ btrfs filesystem df /run/media/fran/wd20btrfs
Data, single: total=119.01GiB, used=118.45GiB
System, DUP: total=8.00MiB, used=32.00KiB
System, single: total=4.00MiB, used=0.00B
Metadata, DUP: total=2.50GiB, used=1.70GiB
Metadata, single: total=8.00MiB, used=0.00B
GlobalReserve, single: total=512.00MiB, used=0.00B

Cada subvolumen de btrfs puede tener distintas propiedades establecidas, fundamentalmente ro para cambiar un filesystem a sólo-lectura, y compression para establecer el algoritmo de compresión a utilizar para nuevos datos escritos en el subvolumen:

$ sudo btrfs prop list /run/media/fran/wd20btrfs/                                                        
ro                  Set/get read-only flag of subvolume.
label               Set/get label of device.
compression         Set/get compression for a file or directory

$ sudo btrfs prop get /run/media/fran/wd20btrfs/                                                         
ro=false
label=wd20btrfs

$ sudo btrfs prop get /run/media/fran/wd20btrfs/backup/                                             
ro=false
compression=zlib

Otra de las características que tiene btrfs es que podemos comprobar la integridad de nuestros datos. No nos servirá para arreglar nada si no tenemos otra copia de los mismos (bien por RAID, o de un backup externo), pero al menos nos enteraremos si nuestros datos están bien.

$ sudo btrfs scrub status -d /run/media/fran/wd20btrfs/
scrub status for 7bb1d318-c7a9-40d8-995a-972a9d43544f
scrub device /dev/mapper/luks-0aad2fa7-f2c9-4acb-81f5-5197751fee3e (id 1) status
scrub started at Fri Apr 17 21:48:08 2015, running for 25 seconds
total bytes scrubbed: 847.03MiB with 0 errors

$ sudo btrfs scrub status -d /run/media/fran/wd20btrfs/
scrub status for 7bb1d318-c7a9-40d8-995a-972a9d43544f
scrub device /dev/mapper/luks-0aad2fa7-f2c9-4acb-81f5-5197751fee3e (id 1) history
scrub started at Fri Apr 17 21:48:08 2015 and finished after 3460 seconds
total bytes scrubbed: 121.84GiB with 0 errors

Por lo visto anteriormente, btrfs es un sistema de ficheros prometedor y llamado a reemplazar a filesystems más tradicionales como ext4 ó XFS, a la vez que sistemas de volúmenes como LVM. Ahora sólo hace falta que gane algo más de soporte por parte de la comunidad y usuarios que lo prueben hasta el límite.

Happy Hacking :-)