Btrfs

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Btrfs and the translation is 45% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎polski • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

"Btrfs" es un sistema de ficheros copy-on-write (CoW) para Linux enfocado a implementar características novedosas y avanzadas y, a la vez, centrado en la tolerancia a fallos, reparación y facilidad de administración. Desarrollado conjuntamente por Oracle, Red Hat, Fujitsu, Intel, SUSE, STRATO, y muchos más, Btrfs está publicado bajo la licencia GPL y se encuentra abierto a contribuciones por parte de cualquier persona.

Características

Ext4 es seguro y estable y es capaz de manejar sistemas de ficheros muy grandes sin problemas, entonces ¿Por qué cambiar?. Si bien es verdad que Btrfs aún es considerado experimental y está creciendo en cuanto a estabilidad, el momento en el que se convierta en el sistema de ficheros d por defecto en los sistemas Linux se va acercando. Algunas distribuciones ya han comenzado a cambiar en sus últimos lanzamientos. Btrfs tiene un gran número de características avanzadas en común con ZFS, las cuales hicieron que ZFS fuera tan popular entre las distribuciones de BSD y los dispositivos NAT.

  • Copy on Write (CoW) y snapshotting - Facilitar la creación de backups incluso desde un sistema de ficheros "en caliente" o de una máquina virtual.
  • Checksums a nivel de fichero - Los metadatos de cada fichero incluyen un checksum que es usado para detectar y reparar errores.
  • Compresión - Los ficheros pueden estar comprimidos o descomprimidos en vuelo, lo que aumenta la velocidad de lectura.
  • Auto-Desfragmentación - Los sistemas de ficheros son optimizados por un proceso en segundo plano "mientras" están en uso.
  • Subvolumenes - Los sistemas de ficheros pueden compartir un determinado espacio en vez de tener que utilizar sus propias particiones.
  • RAID - Btrfs tiene sus propias implementaciones de RAID de manera que LVM o mdadm no son necesarios para tener un RAID. De momento RAID 0 y 1 están soportados; RAID 5 y 6 están de camino.
  • Las particiones son opcionales - Si bien Btrfs puede trabajar con particiones, también es capaz de utilizar volumenes sin formato (/dev/<device>) directamente.
  • Deduplicación de datos - El soporte de deduplicación de datos es limitado; sin embargo, eventualmente se convertirá en una característica estándar en Btrfs. Ésto permite reducir el espacio ocupado mediante la comparación binaria de ficheros.
Tip
Para una lista más exhaustiva y actualizada de las características visite la sección de estado de su Wiki. Sin embargo, no todas las características son lo suficientemente maduras para un uso extensivo.

Con el tiempo, los nuevos sistemas de ficheros en cluster tomarán ventaja de Btrfs mediante el uso de copy on write y otras características avanzadas referentes al almacenamiento de objetos. Ceph es un ejemplo de un sistema de ficheros en cluster que se ve realmente prometedor, y es capaz de aprovechar las ventajas de Btrfs.

Instalación

Kernel

Active las siguientes opciones del kernel para habilitar el soporte para Btrfs:

KERNEL Activate Btrfs in the kernel
File systems  --->
    <*> Btrfs filesystem

Emerge

El paquete sys-fs/btrfs-progs contiene las utilidades necesarias para trabajar con el sistema de ficheros Btrfs.

root #emerge --ask sys-fs/btrfs-progs

Uso

Escribir largos comandos de Btrfs se puede convertir rápidamente en un incordio. Cada comando (además del btrfs inicial) puede ser reducido a un pequeño conjunto de instrucciones. Este método es de gran ayuda cuando se trabaja desde la línea de comandos ya que ayuda a reducir el número de caracteres a teclear.

Por ejemplo, para defragmentar un sistema de ficheros localizado en /, la manera larga sería:

root #btrfs filesystem defragment -v /

Acorte cada uno de los comandos largos a base de reducirlos a su prefijo único. En este contexto único significa que no existe una pareja de comandos que hagan cosas diferentes, por mínimas que sean, que concidan en la forma mínima del comando. La versión acortada del comando anterior es:

root #btrfs fi de -v /

Ningún otro comando de btrfs comienza con fi; filesystem es el único. Lo mismo se aplica al comando de, el cual es un subcomando del comando filesystem.

Creación

Advertencia
El comando mkfs.btrfs es irreversible y destruye todo el contenido de la partición a formatear. Por favor, aseguresé de que es la partición correcta antes de ejecutar cualquier comando mkfs!

Para crear un sistema de ficheros Btrfs en la partición /dev/sdXN:

root #mkfs.btrfs /dev/sdXN

En el ejemplo anterior, reemplace N con el número de la partición y X con la letra del disco a formatear. Por ejemplo, para formatear la tercera partición del primer disco del sistema con formato Btrfs ejecute:

root #mkfs.btrfs /dev/sda3
Importante
El número de la última columna en /etc/fstab debe ser 0 para todas las particiones Btrfs. Ni fsck.btrfs ni btrfsck deberían ser ejecutados en cada inicio del sistema.

Montaje

Después de la creación, los sistemas de ficheros se pueden montar de diferentes maneras:

  • mount - Montaje manual.
  • fstab - Definir los puntos de montaje en /etc/fstab activa los montajes automáticos en el inicio del sistema.
  • Removable media - Montajes automáticos a demanda (útil para memorias USB).
  • AutoFS - Montaje automático al acceder al sistema de ficheros.

Convertir sistemas de ficheros basados en ext*

Es posible convertir sistemas ext2, ext3 y ext4 a Btrfs using la herramienta btrfs-convert.

Las siguientes instrucciones solo soportan la conversión de sistemas de ficheros que se encuentran desmontados. Para convertir la partición root, inicie un disco de rescate del sistema (SystemRescueCD funciona perfectamente) y ejecute los comandos de conversión sobre la partición de root.

Primero, asegúrese de que el sistema no se encuentra montada:

root #umount <dispositivo_montado>

Compruebe la integridad del sistema de ficheros usando la herramienta apropiada de fsck. En el siguiente ejemplo, el sistema de ficheros es ext4:

root #fsck.ext4 -f <dispositivo_desmontado>

Use btrfs-convert para convertir el dispositivo con formato ext* a un dispositivo formateado en Btrfs:

root #btrfs-convert <dispositivo_desmontado>

Asegúrese de editar el fichero /etc/fstab después de que el dispositivo haya sido formateado para cambiar la columna de sistema de ficheros de ext4 a Btrfs:

ARCHIVO /etc/fstabCambiar de ext4 a btrfs
<device>   <mountpoint>  btrfs  defaults  0 0

Desfragmentación

Otra característica de Btrfs es la desfragmentación en línea. Para desfragmentar un sistema de ficheros root formateado en Btrfs ejecute el comando:

root #btrfs filesystem defragment -r -v /
Advertencia
La desfragmentación con la versiones de kernel < 3.9 o ≥ 3.14-rc2, así como las versiones estables ≥ 3.10.31, ≥ 3.12.12 o ≥ 3.13.4 rompen los enlaces entre los ficheros y sus copias COW [1] y por lo tanto puede incrementar el espacio usado considerablemente. Asegúrese de que tiene suficiente espacio disponible y no demasiadas snapshots en el disco porque las particiones Btrfs pueden volverse realmente lentas.

Compresión

Btrfs soporta compresión transparente utilizando los algoritmos zlib y lzo.

Es posible comprimir ficheros específicos utilizando los siguientes atributos de fichero:

user $chattr +c

La opción de montaje compress establece por defecto la compresión de los ficheros nuevos que se crean. Para recomprimir el sistema de ficheros completo, ejecute el siguiente comando:

root #btrfs filesystem defragment -r -v -clzo /

Dependiendo de la CPU y del rendimiento del disco, utilizar compresión mediante el algoritmo lzo podría mejorar el rendimiento en general.

Es posible utilizar el algoritmo de compresión zlib en vez de lzo. Zlib es más lento pero tiene un mejor ratio de compresión:

root #btrfs filesystem defragment -r -v -czlib /

Compression level

Since kernel version 4.15.0[2], zlib compression can now be set by levels 1-9. For example, to set zlib to maximum compression at mount time:

root #mount -o compress=zlib:9 /dev/sdXY /path/to/btrfs/mountpoint

Or to set minimal compression:

root #mount -o compress=zlib:1 /dev/sdXY /path/to/btrfs/mountpoint

Or adjust compression by remounting:

root #mount -o remount,compress=zlib:3 /path/to/btrfs/mountpoint

The compression level should be visible in /proc/mounts or by checking the most recent output of dmesg |grep -i btrfs.

root #dmesg |grep -i btrfs
[    0.495284] Btrfs loaded, crc32c=crc32c-intel
[ 3010.727383] BTRFS: device label My Passport devid 1 transid 31 /dev/sdd1
[ 3111.930960] BTRFS info (device sdd1): disk space caching is enabled
[ 3111.930973] BTRFS info (device sdd1): has skinny extents
[ 9428.918325] BTRFS info (device sdd1): use zlib compression, level 3


Compression ratio and disk usage

The usual userspace tools for determining used and free space like du and df may provide inaccurate results on a Btrfs partition due to inherent design differences in the way files are written compared to, for example, ext2/3/4[3].

It is therefore advised to use the du/df alternatives provided by the btrfs userspace tool btrfs filesystem. In Addition to that, The compsize tool found from the sys-fs/compsize package can be helpful in providing additional information regarding compression ratios and the disk usage of compressed files. The following are example uses of these tools for a btrfs partition mounted under /media/drive.


user $btrfs filesystem du -s /media/drive
     Total   Exclusive  Set shared  Filename
 848.12GiB   848.12GiB       0.00B  /media/drive/
user $btrfs filesystem df /media/drive
Data, single: total=846.00GiB, used=845.61GiB
System, DUP: total=8.00MiB, used=112.00KiB
Metadata, DUP: total=2.00GiB, used=904.30MiB
GlobalReserve, single: total=512.00MiB, used=0.00B
user $compsize /media/drive
Processed 2262 files, 112115 regular extents (112115 refs), 174 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       99%      845G         848G         848G       
none       100%      844G         844G         844G       
zlib        16%      532M         3.2G         3.2G 

RAID

Crear RAIDs en Btrfs es mucho más fácil que crear RAIDs utilizando la herramienta mdadm.

El método más simple es utilizar el dispositivo completo para crear un RAID:

root #mkfs.btrfs -m raid1 <dispositivo1> <dispositivo2> -d raid1 <dispositivo1> <dispositivo2>

Converting between RAID modes is possible with the balance sub-command. For example, say a multiple device RAID 1 is mounted at /srv. It is possible to convert this RAID1 to RAID0 with using the following command:

root #btrfs balance start -dconvert=raid0 -mconvert=raid0 --force /srv

RAID mode conversion can be performed while the filesystem is online and in use. Possible RAID modes in btrfs include RAID0, RAID1, RAID5, RAID6, and RAID10. See the upstream BTRFS wiki for more information.

Advertencia
Actualmente no es seguro utilizar los modos RAID 5 o RAID 6[4]. RAID 5 y 6 han recibido ciertas correcciones[5] en Linux 4.12, but en general siguen estando marcados como inestables.[6][7]. A los usuarios que quieran utilizar las funcionalidades de RAID 5 y RAID 6 en Btrfs se les recomienda que comprueben la página sobre el estado de Brtfs para ver el estado de la estabilidad de dichos modos antes de utilizarlos.

Subvolúmenes

As mentioned above in the features list, Btrfs can create subvolumes. Subvolumes can be used to better organize and manage data. They become especially powerful when combined with snapshots. Important distinctions must be made between Btrfs subvolumes and subvolumes created by Logical Volume Management (LVM). Btrfs subvolumes are not block level devices, they are POSIX file namespaces.[8] They can be created at any location in the filesystem and will act like any other directory on the system with one caveat: subvolumes can be mounted and unmounted. Subvolumes are nestable (subvolumes can be created inside other subvolumes), and easily created or removed.

Nota
A subvolume cannot be created across different Btrfs filesystems. If /dev/sda and /dev/sdb both contain separate (non-RAID) Btrfs filesystems, there is no way a subvolume can expand across the two filesystems. The snapshot can be moved from one filesystem to another, but it cannot span across the two. It must be on /dev/sda or /dev/sdb.

Create

To create a subvolume, issue the following command inside a Btrfs filesystem's name space:

root #btrfs subvolume create <dest-name>

Replace <dest-name> with the desired destination and subvolume name. For example, if a Btrfs filesystem exists at /mnt/btrfs, a subvolume could be created inside it using the following command:

root #btrfs subvolume create /mnt/btrfs/subvolume1

List

To see the subvolume(s) that have been created, use the subvolume list command followed by a Btrfs filesystem location. If the current directory is somewhere inside a Btrfs filesystem, the following command will display the subvolume(s) that exist on the filesystem:

root #btrfs subvolume list .

If a Btrfs filesystem with subvolumes exists at the mount point created in the example command above, the output from the list command will look similar to the following:

root #btrfs subvolume list /mnt/btrfs
ID 309 gen 102913 top level 5 path mnt/btrfs/subvolume1

Remove

Subvolumes can be properly removed by using the subvolume delete command followed by the path to the subvolume. All available subvolume paths in a Btrfs filesystem can be seen using the list command above.

root #btrfs subvolume delete <subvolume-path>

As above, replace <subvolume-path> with the actual path to the subvolume to be removed. To delete the subvolume used in the examples above, the following command would be issued:

root #btrfs subvolume delete /mnt/btrfs/subvolume1
Delete subvolume (no-commit): '/mnt/btrfs/subvolume1'

Snapshots

Snapshots are subvolumes that share data and metadata with other subvolumes. This is made possible by Btrfs' Copy on Write (CoW) ability.[8] Snapshots can be used for several purposes, one of which is to create backups of file system structures at specific points in time.

If the root filesystem is Btrfs, it is possible to create a snapshot using the subvolume snapshot commands:

root #mkdir -p /mnt/backup/rootfs
root #btrfs subvolume snapshot / /mnt/backup/rootfs/

The following small shell script can be added to a timed cron job to create a timestamped snapshot backup of a Btrfs formatted root filesystem. The timestamps can be adjusted to whatever is preferred by the user.

ARCHIVO btrfs_snapshot.shBtrfs rootfs snapshot cron job example
#!/bin/bash
NOW=$(date +"%Y-%m-%d_%H:%M:%S")
 
if [ ! -e /mnt/backup ]; then
mkdir -p /mnt/backup
fi
 
cd /
/sbin/btrfs subvolume snapshot / "/mnt/backup/backup_${NOW}"

Mounting

A subvolume can be mounted in a location different from where it was created, or users can choose to not mount them at all. For example, a user could create a Btrfs filesystem in /mnt/btrfs and create /mnt/btrfs/home and /mnt/btrfs/portage subvolumes. The subvolumes could then be mounted at /home and /usr/portage, with the original top level subvolume left unmounted. This results in a configuration where the subvolumes' relative path from the top level subvolume is different from their actual path.

To mount a subvolume, perform the following command, where <rel-path> is the relative path of the subvolume from the top level subvolume, obtainable through the subvolume list command:

root #mount -o subvol=<rel-path> <device> <mountpoint>

Similarly, one can update the filesystem tab to mount their Btrfs subvolumes like so:

ARCHIVO /etc/fstabMounting Subvolumes
<device>  <mountpoint>  btrfs  subvol=<rel-path>  0 2

Troubleshooting

Using with VM disk images

When using Btrfs with virtual machine disk images, it is best to disable copy-on-write on the disk images in order to speed up IO performance. This can only be performed on files that are newly created. It also possible to disable CoW on all files created within a certain directory. For example, using the chattr command:

root #chattr +C /var/lib/libvirt/images

Clear the free space cache

It is possible to clear Btrfs' free space cache by mounting the filesystem with the clear_cache mount option. For example:

root #mount -o clear_cache /path/to/device /path/to/mountpoint

Btrfs hogging memory (disk cache)

When utilizing some of Btrfs' special abilities (like making many --reflink copies or creating a crazy amount of snapshots), lot of memory can be eaten and not freed fast enough by the kernel's inode cache. This issue can go undiscovered since memory dedicated to the disk cache might not be clearly visible in traditional system monitoring utilities. The slabtop utility (available as part of the sys-process/procps package) was specifically created to determine how much memory kernel objects are consuming:

root #slabtop
Active / Total Objects (% used)    : 2259363 / 2338091 (96.6%)
Active / Total Slabs (% used)      : 467797 / 467803 (100.0%)
Active / Total Caches (% used)     : 83 / 175 (47.4%)
Active / Total Size (% used)       : 1489775.62K / 1512200.52K (98.5%)
Minimum / Average / Maximum Object : 0.02K / 0.65K / 4096.00K

OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME
1034532 1032386  99%    1.04K 344844        3   1379376K btrfs_inode

If the inode cache is consuming too much memory, the kernel can be manually instructed to drop the cache by echoing an integer value to the /proc/sys/vm/drop_caches file[9].

To be safe, and to help the kernel determine the maximum amount of freeable memory, be sure to run a sync before running the echo commands below:

user $sync

Most of the time Btrfs users will probably want to echo 2 to reclaim just the slab objects (dentries and btrfs_inodes):

root #echo 2 > /proc/sys/vm/drop_caches

To clear the entire disk cache (slab objects and the page cache) use echo 3 instead:

root #echo 3 > /proc/sys/vm/drop_caches
Advertencia
While the above commands are non-destructive (as long as a sync was completed before running them), they could seriously but temporarily slow down the system while the kernel loads only the necessary items back into memory. Think twice before running the above commands for systems under heavy load!

More information on kernel slabs can be found in this dedoimedo blog entry.

Mounting Btrfs fails, returning mount: unknown filesystem type 'btrfs'

The original solution by Tim on Stack Exchange inspired the following solution: build the kernel manually instead of using genkernel:

#cd /usr/src/linux
#make menuconfig
#make && make modules_install
#cp arch/x86_64/boot/bzImage /boot
#mv /boot/bzImage /boot/whatever_kernel_filename
#genkernel --install initramfs

Btrfs root doesn't boot

Genkernel's initramfs as created with the command below doesn't load btrfs:

root #genkernel --btrfs initramfs

Compile support for btrfs in the kernel rather than as a module, or use genkernel-next or Dracut to generate the initramfs.

See also

  • Btrfs snapshots - Script that creates snapshots when files have changed
  • Btrfs/System Root Guide - Use the Btrfs filesystem as a collection of subvolumes including one as a system root.
  • Btrfs native system root guide - An alternative guide on using a subvolume in a Btrfs filesystem as the system's root.
  • ext4 - The default filesystem for most Linux distributions.
  • Samba shadow copies - Using Samba to expose Shadow Copies as 'Previous Versions' to Windows clients.
  • Snapper - A command-line program capable of managing Btrfs filesystem snapshots.
  • ZFS - A filesystem that shares much in common with Btrfs, but has licensing issues.

External resources

References