• Saltar al contenido principal
  • Saltar a la barra lateral principal
  • Blog
  • Sistemas Operativos
    • Todos los sistemas operativos del Raspberry Pi Imager en 2026
  • Tipos de Raspberry Pi
    • Selector interactivo de Raspberry Pi
    • Raspberry Pi: rivales y alternativas SBC en 2026 con Armbian y DietPi
  • Glosario
  • FAQ
  • Contacto
  • Cookies y RGPD
  • Acerca de

Raspberry para torpes

Blog sobre Raspberry Pi en español desde 2013. Guías de configuración, hardware, sistemas operativos y proyectos para todos los niveles.

Usando btrfs en Raspberry Pi con Open Media Vault

22 enero, 2018 by manuti Deja un comentario

☕
¿El blog te ha sido útil?Puedes invitarme a un café en Ko-fi. Sin suscripciones, sin compromisos.
Invitar a un café

Una guía para utilizar btrfs como mejora del servidor Open Media Vault montado como NAS casero con nuestra Raspberry Pi.

Montar discos en modo RAID ya lo expliqué en el blog hace tiempo. Sin embargo, a día de hoy es mejor en vez de configurar un RAID USB usando mdadm (que fallará de todos modos tarde o temprano y se dañará incluso con problemas menores de conectividad USB) hacerlo con btrfs.

Así se puede proporcionar integridad de datos y con su modo lineal, va llenando los discos del conjunto de 1 en 1, si se trata de añadir la capacidad de dos o más discos. Esto requiere usar la línea de comandos.

OJO QUE PODEMOS LIARLA, VAMOS A HACER COPIA DE SEGURIDAD E IR CON CUIDADO

 

Entramos en una Terminal por SSH. Instalamos el soporte para btrfs por si no lo tenemos.Y suponiendo que tenemos 2 discos (sda y sdb) lo siguiente creará una configuración lineal de btrfs:

sudo -s
apt install btrfs-tools
parted -s /dev/sda mklabel gpt 
parted -s /dev/sdb mklabel gpt 
partprobe 
mkfs.btrfs -f -d single -m raid1 -L BTRFS_LINEAR /dev/sd[ab]

Los dos comandos parted eliminan las particiones de ambos discos, luego el kernel lee en la tabla de particiones (ahora inexistente) y finalmente creamos una configuración multi disco con btrfs que almacena los datos en forma lineal (comenzando con sda y si está lleno entonces usando sdb)

Además la opción -m raid1 tiene la particularidad de que los metadatos (estructuras del sistema de archivos así como las sumas de comprobación para todos los datos almacenados) están duplicados en ambos discos. Así que incluso si un disco se ve afectado por la corrupción de datos, podemos saberlo con seguridad ya que tenemos dos copias de cada fragmento de metadatos.

Vamos ahora con la parte de montar y utilizar nuestro nuevo sistema de discos.

Montar el disco con Raspbian

Ahora la parte difícil, hemos creado una configuración multi dispositivo btrfs que consiste en sda y sdb. Para poder utilizarlo podemos montar sda o sdb, vale cualquiera ya que el código btrfs busca los discos restantes por su cuenta.

Si vas a usarlos con Raspbian por ejemplo, lo que habría que hacer es modificar fstab más o menos como expliqué en este post, pero con el siguiente texto para nuestro caso montando solo sda por ejemplo en una carpeta ya creada con el nombre /media/btrfs por ejemplo:

sudo -s
mkdir /media/btrfs/
mount /dev/sda /media/btrfs
btrfs filesystem df /media/btrfs/
blkid /dev/sda

La salida será algo así:

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda  btrfs        e5b5c118-fb56-4fad-a45d-ff5fad9a649d /media/btrfs

Editamos /etc/fstab:

sudo cp /etc/fstab fstab.old
sudo nano /etc/fstab

Si lo montamos usando el UUID sería de la siguiente forma:

UUID=e5b5c118-fb56-4fad-a45d-ff5fad9a649d /media/btrfs           btrfs   defaults      0  1

O usando el nombre de la unidad, que es más fácil pero tiene sus inconvenientes en caso de que se cambien los nombres de las unidades al cambiarlas de puerto USB. Como ya he dicho, el resto de discos del conjunto se montarán indirectamente de forma automática a partir de ese:

/dev/sda /media/btrfs               btrfs   defaults 0       1

Montar el disco con Open Media Vault

De forma parecida a lo visto con Raspbian pero con la facilidad del entorno de OMV. Así que con nuestra configuración ahora simplemente usamos el interfaz web de OMV para montar sda por ejemplo, sin hacer nada con sdb, y se verá así:

montar disco btrfs en omv

Si desde la Terminal hacemos la siguiente comprobación vemos una incongruencia:

root@raspberrypi:~# lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL /dev/sda 
NAME FSTYPE SIZE MOUNTPOINT LABEL 
sda btrfs 465.8G /srv/dev-disk-by-label-BTRFS_LINEAR BTRFS_LINEAR 
root@raspberrypi:~# df -h | grep '/dev/sd' 
/dev/sda 578G 428M 574G 1% /srv/dev-disk-by-label-BTRFS_LINEAR

Si os fijáis lsblk no detecta bien o no nos informa del espacio combinado de ambos discos. Sin embargo, con df o desde la web de OMV si se ve. Ahora solo queda añadir el nuevo conjunto btrfs creado:

compartir disco btrfs en omv

Lo interesante de usar btrfs viene ahora. Las sumas de comprobación se calcularán de nuevo al leer los datos y se comparan con los metadatos originales que además están guardados por duplicado en los discos del conjunto btrfs. En caso de que se produzca un desajuste (¡corrupción de datos detectada!) se registrará (dmesg y syslog).

Además podemos usar un script que se ejecute una vez al mes desde crontab redirigiendo la salida a un logfile e ir comprobando si todo está OK.

Este script es de Marc Merlin http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html y lo podéis copiar de aquí: https://pastebin.com/bd9yZTMQ

#! /bin/bash

# By Marc MERLIN  2014/03/20
# License: Apache-2.0

which btrfs >/dev/null || exit 0

export PATH=/usr/local/bin:/sbin:$PATH

# bash shortcut for `basename $0`
PROG=${0##*/}
lock=/var/run/$PROG

FILTER='(^Dumping|balancing, usage)'
test -n "$DEVS" || DEVS=$(grep '\' /proc/mounts | awk '{ print $1 }' | sort -u)
for btrfs in $DEVS
do
    tail -n 0 -f /var/log/syslog | grep "BTRFS: " | grep -Ev '(disk space caching is enabled|unlinked .* orphans|turning on discard|device label .* devid .* transid|enabling SSD mode|BTRFS: has skinny extents|BTRFS: device label)' &
    mountpoint="$(grep "$btrfs" /proc/mounts | awk '{ print $2 }' | sort | head -1)"
    logger -s "Quick Metadata and Data Balance of $mountpoint ($btrfs)" >&2
    # Even in 4.3 kernels, you can still get in places where balance
    # won't work (no place left, until you run a -m0 one first)
    btrfs balance start -musage=0 -v $mountpoint 2>&1 | grep -Ev "$FILTER"
    btrfs balance start -musage=20 -v $mountpoint 2>&1 | grep -Ev "$FILTER"
    # After metadata, let's do data:
    btrfs balance start -dusage=0 -v $mountpoint 2>&1 | grep -Ev "$FILTER"
    btrfs balance start -dusage=20 -v $mountpoint 2>&1 | grep -Ev "$FILTER"
    # And now we do scrub. Note that scrub can fail with "no space left
    # on device" if you're very out of balance.
    logger -s "Starting scrub of $mountpoint" >&2
    echo btrfs scrub start -Bd $mountpoint
    ionice -c 3 nice -10 btrfs scrub start -Bd $mountpoint
    pkill -f 'tail -n 0 -f /var/log/syslog'
    logger "Ended scrub of $mountpoint" >&2
done

La salida del script para un disco casi vació, fijaos en la parte del final donde dice 0 errors, sería así:

root@raspberrypi:~# /usr/local/bin/btrfs-scrub.sh 
root: Quick Metadata and Data Balance of /srv/dev-disk-by-label-BTRFS_LINEAR (/dev/sda) 
Done, had to relocate 1 out of 7 chunks 
Done, had to relocate 3 out of 6 chunks 
Done, had to relocate 1 out of 5 chunks 
Done, had to relocate 1 out of 5 chunks 
root: Starting scrub of /srv/dev-disk-by-label-BTRFS_LINEAR 
btrfs scrub start -Bd /srv/dev-disk-by-label-BTRFS_LINEAR 
scrub device /dev/sda (id 1) done 
scrub started at Fri Nov 24 18:33:15 2017 and finished after 159 seconds 
total bytes scrubbed: 3.09GiB with 0 errors 
scrub device /dev/sdb (id 2) done 
scrub started at Fri Nov 24 18:33:15 2017 and finished after 1 seconds 
total bytes scrubbed: 2.56MiB with 0 errors

En caso de que haya errores sabremos en qué archivos y que disco es el que da problemas. Así podemos actuar quitando ese disco del conjunto btrfs y recuperamos de una copia de seguridad, como debe ser.

En la web del Instituto Puig Castellar tienen un montón de buenos Ejemplos de uso de Btrfs.

Extraído del post en el foro de OMV de tkaiser: https://forum.openmediavault.org/index.php/Thread/18991-New-approach-for-Raspberry-Pi-OMV-images/?postID=160915#post160915

Artículos relacionados:

  • RAID-raspberry-pi
    NAS casero avanzado disco RAID en Raspberry Pi
  • raspberry pi b+ hdd usb
    Rasperry Pi y disco duro USB cómo forzar la alimentación
  • omv-logo-cabecera
    Open Media Vault para Raspberry
  • omv-plex-cabecera
    Servidor Plex con OMV

Publicado en: Proyectos Etiquetado como: btrfs, btrfs omv, btrfs open media vault, btrfs raspbian, nas raspberry pi 3, raid, raid btrfs, raid casero, raid omv, raid open media vault, raid raspbian

Barra lateral principal

α Fotografía El lado analógico de manuti

Categorías

  • Cajas (9)
  • comandos (21)
  • Compras (117)
  • dudas (41)
  • Empezando (55)
  • Hardware (111)
  • Instalacion (64)
  • Media Center (56)
  • Negocios (5)
  • Proyectos (45)
  • Rivales (114)
  • Sistemas Operativos (70)
  • sorteo (2)
Raspberry Pi 5 - 4GB RAM
Raspberry Pi 5 - 4GB RAM
Ver precio en Amazon →
Raspberry Pi Zero 2W
Raspberry Pi Zero 2W
Ver precio en Amazon →

Por si te lo perdiste

github julio 2026

GitHub Raspberry Pi julio 2026: UART por PIO

pimoroni

Pimoroni cumple 14 años

touch display 2 10"

Touch Display 2 de 10″: la pantalla más grande

Raspberry Pi 5 - 8GB RAM
Raspberry Pi 5 - 8GB RAM
Ver precio en Amazon →

Visita la tienda Raspberry Pi en Amazon - enlace afiliado
© 2013–2026

Cookie y RGPD | Aviso Legal
Este sitio web usa cookies para mejorar su experiencia como usuario ► «Aceptar todo» Rechazar Elegir cookies ◘ Si necesita Política de cookies
Política de Cookies

Resumen de privacidad

Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. De estas cookies, las clasificadas como necesarias se almacenan en tu navegador, ya que son esenciales para el funcionamiento de las funcionalidades básicas del sitio web. También utilizamos cookies de terceros que nos ayudan a analizar y entender cómo usas este sitio web. Estas cookies se almacenarán en tu navegador únicamente con tu consentimiento. También tienes la opción de rechazarlas. Sin embargo, rechazar algunas de estas cookies puede afectar a tu experiencia de navegación.
Necessary
Siempre activado
Las cookies necesarias son imprescindibles para el funcionamiento correcto del sitio web. Esta categoría solo incluye cookies que garantizan las funcionalidades básicas y las características de seguridad del sitio. Estas cookies no almacenan ninguna información personal.
CookieDuraciónDescripción
cookielawinfo-checkbox-advertisement1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie registra el consentimiento del usuario para las cookies de la categoría "Advertisement".
cookielawinfo-checkbox-analytics1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie registra el consentimiento del usuario para las cookies de la categoría "Analytics".
cookielawinfo-checkbox-comentarios1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie registra el consentimiento del usuario para las cookies de la categoría "Comentarios (Disqus)".
cookielawinfo-checkbox-functional1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie registra el consentimiento del usuario para las cookies de la categoría "Functional".
cookielawinfo-checkbox-necessary1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie registra el consentimiento del usuario para las cookies de la categoría "Necessary".
cookielawinfo-checkbox-others1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie almacena el consentimiento del usuario para las cookies de la categoría "Others".
cookielawinfo-checkbox-performance1 añoEstablecida por el plugin GDPR Cookie Consent, esta cookie almacena el consentimiento del usuario para las cookies de la categoría "Performance".
CookieLawInfoConsent1 añoCookieYes establece esta cookie para registrar el estado por defecto de los botones de cada categoría y el estado de la CCPA. Funciona únicamente en coordinación con la cookie principal.
wpEmojiSettingsSupportssesiónWordPress establece esta cookie cuando un usuario interactúa con emojis en un sitio WordPress. Ayuda a determinar si el navegador del usuario puede mostrar los emojis correctamente.
__cf_bm1 horaEsta cookie, establecida por Cloudflare, se utiliza para dar soporte a la gestión de bots de Cloudflare.
Functional
Las cookies funcionales ayudan a realizar ciertas funciones como compartir el contenido del sitio web en redes sociales, recoger comentarios y otras características de terceros.
CookieDuraciónDescripción
VISITOR_INFO1_LIVE6 mesesCookie establecida por YouTube para medir el ancho de banda y determinar si el usuario recibe la interfaz de reproductor nueva o antigua.
ytidb::LAST_RESULT_ENTRY_KEYnuncaYouTube utiliza esta cookie para almacenar la última entrada de resultados de búsqueda en la que hizo clic el usuario. Esta información se usa para mejorar la experiencia ofreciendo resultados más relevantes en el futuro.
Performance
Las cookies de rendimiento se utilizan para entender y analizar los índices clave de rendimiento del sitio web, lo que ayuda a ofrecer una mejor experiencia de usuario a los visitantes.
Analytics
Las cookies analíticas se utilizan para entender cómo interactúan los visitantes con el sitio web. Estas cookies ayudan a ofrecer información sobre métricas como el número de visitantes, la tasa de rebote, la fuente de tráfico, etc.
CookieDuraciónDescripción
YSCsesiónCookie establecida por YouTube que se usa para hacer seguimiento de las visualizaciones de vídeos embebidos en páginas de YouTube.
Advertisement
Las cookies de publicidad se utilizan para ofrecer a los visitantes anuncios y campañas de marketing relevantes. Estas cookies rastrean a los visitantes a través de distintos sitios web y recopilan información para mostrar anuncios personalizados.
CookieDuraciónDescripción
VISITOR_PRIVACY_METADATA6 mesesYouTube establece esta cookie para almacenar el estado de consentimiento de cookies del usuario para el dominio actual.
__Secure-ROLLOUT_TOKEN6 mesesYouTube utiliza esta cookie para gestionar el despliegue de funciones y la experimentación. Ayuda a Google a controlar qué funciones nuevas o cambios de interfaz se muestran a los usuarios como parte de pruebas y despliegues escalonados, garantizando una experiencia coherente durante un experimento.
__Secure-YECsesiónCookie de YouTube. Se encarga de almacenar tus preferencias de reproducción de video (como el volumen, la calidad de video predeterminada o la configuración de subtítulos) cuando ves videos de YouTube incrustados en otras páginas web.
__Secure-YNID6 mesesCookie de YouTube utilizada para proteger la seguridad del usuario y prevenir el fraude, especialmente durante el proceso de inicio de sesión.
Others
Otras cookies sin clasificar son aquellas que están siendo analizadas y que todavía no se han asignado a ninguna categoría.
Comentarios (Disqus)
Las cookies de comentarios permiten mostrar y gestionar el sistema de comentarios de terceros (Disqus), incluyendo el registro de usuarios y el control de spam. Estas cookies solo se cargan si aceptas esta categoría.
CookieDuraciónDescripción
disqus_unique1 añoCookie de Disqus usada para el registro de usuarios y control de spam en los comentarios.
GUARDAR Y ACEPTAR
Funciona con CookieYes Logo