Linux

Error Btrfs No Space Left On Device en Linux: Guía Definitiva de Diagnóstico y Solución

Introducción al Problema de Espacio en Btrfs

Uno de los mayores dolores de cabeza para los administradores de sistemas y usuarios avanzados que utilizan el sistema de archivos Btrfs en distribuciones Linux es encontrarse con el mensaje de error No space left on device al intentar crear archivos, instalar paquetes o compilar código, a pesar de que el comando clásico df -h indica que todavía hay gigabytes de almacenamiento disponibles. Este comportamiento anómalo ocurre debido a la arquitectura interna de Btrfs, la cual gestiona el almacenamiento dividiéndolo en fragmentos separados para los datos (data) y para los metadatos (metadata).

A diferencia de sistemas de archivos tradicionales como EXT4, Btrfs reserva bloques específicos para la indexación y estructura interna. Si el pool asignado a los metadatos se agota por completo, el sistema de archivos entra en un estado de protección de escritura de solo lectura (read-only) o rechaza cualquier operación de asignación nueva, independientemente de que existan terabytes libres en los fragmentos de datos. En esta guía técnica exhaustiva, analizaremos las causas fundamentales de este desbalance y aplicaremos métodos avanzados de resolución mediante comandos nativos para recuperar la operatividad total de tu almacenamiento.

Análisis Profundo: ¿Por qué Btrfs reporta falta de espacio falsamente?

Para comprender la raíz del problema, es imperativo entender cómo opera la asignación de bloques en Btrfs. El sistema no mezcla los datos de los archivos con los metadatos en los mismos sectores lógicos sin control, sino que utiliza chunks (trozos). Cuando un sistema de archivos Btrfs se aproxima a su límite de capacidad general, o cuando se realizan numerosas operaciones de escritura, borrado y reescritura intensiva (como snapshots frecuentes o bases de datos), la fragmentación de los metadatos se dispara.

Los motivos principales que desencadenan este fallo crítico son:

  • Agotamiento de chunks de metadatos: Se han llenado todos los bloques reservados para la estructura de archivos, aunque sobren bloques de datos puros.
  • Perfiles de RAID desbalanceados: El uso de configuraciones como RAID 1 o RAID 10 para metadatos requiere el doble de espacio físico disponible para redundancia, fallando prematuramente si el disco secundario o los chunks de respaldo se desincronizan.
  • Exceso de instantáneas (snapshots): Cada snapshot duplica punteros y metadatos, acelerando exponencialmente el consumo del pool de metadatos.
  • Falta de mantenimiento periódico: La ausencia de la ejecución de balanceadores automáticos (btrfs balance) impide la compactación de bloques dispersos.

Diagnóstico Avanzado del Sistema de Archivos

Antes de aplicar cualquier solución destructiva o modificar la tabla de particiones, debemos auditar el uso real del almacenamiento utilizando las herramientas específicas de Btrfs. No confíes ciegamente en df -h. Ejecuta el siguiente comando en tu terminal con privilegios de superusuario:

sudo btrfs filesystem usage /

Este comando arrojará una matriz detallada que desglosa el espacio asignado y el espacio libre tanto para datos como para metadatos y system chunks. Presta especial atención a la línea correspondiente a Metadata y verifica el porcentaje de uso. Si el espacio sin asignar (Unallocated) es cero y el espacio utilizado de metadatos alcanza el 100%, has encontrado la causa exacta del error.

Método 1: Ejecutar un Balanceo Parcial de Metadatos

La solución más limpia y recomendada por los desarrolladores del kernel es redistribuir los bloques mediante el comando de balanceo. Como el sistema está al límite absoluto, intentar un balanceo completo del disco (btrfs balance start /) puede fallar instantáneamente porque requiere crear nuevos chunks antes de liberar los antiguos. Por lo tanto, debemos aplicar un balanceo enfocado exclusivamente en los metadatos y ajustar el uso de los bloques mediante filtros de ocupación.

  1. Abre tu terminal y ejecuta el siguiente comando para reubicar los metadatos que tengan una ocupación menor al 30% (puedes ajustar el valor de usage según la severidad):
    sudo btrfs balance start -dusage=0 -musage=30 /
  2. Este proceso puede tardar varios minutos dependiendo de la velocidad de lectura/escritura de tus unidades de almacenamiento (HDD o SSD NVMe).
  3. Una vez finalizado, verifica si el sistema ha recuperado la capacidad de escritura ejecutando de nuevo la herramienta de uso:
    sudo btrfs filesystem usage /

Método 2: Adición Temporal de Espacio (Chunks de Emergencia)

Si el balanceo inicial falla debido a que el sistema está completamente bloqueado al 100%, la estrategia de rescate consiste en inyectar temporalmente un nuevo dispositivo de almacenamiento o un archivo de intercambio en bucle (loop device) para que Btrfs disponga de un respiro donde crear nuevos chunks de metadatos.

Sigue estos pasos precisos para aplicar esta técnica de emergencia:

  1. Crea un archivo de respaldo de 2 Gigabytes en el sistema de archivos afectado para usarlo como disco virtual:
    sudo dd if=/dev/zero of=/btrfs-emergency-pool bs=1M count=2048
  2. Establece los permisos estrictos de seguridad para el archivo:
    sudo chmod 600 /btrfs-emergency-pool
  3. Asocia el archivo como un dispositivo en bucle:
    sudo losetup /dev/loop0 /btrfs-emergency-pool
  4. Añade este nuevo pseudo-dispositivo en caliente al volumen montado de Btrfs:
    sudo btrfs device add /dev/loop0 /
  5. Ahora, fuerza un balanceo de metadatos para que el sistema mueva información hacia este nuevo espacio temporal:
    sudo btrfs balance start -msoft /
  6. Una vez que el sistema se estabilice y libere espacio en tus discos principales, remueve el dispositivo de emergencia de forma segura:
    sudo btrfs device delete /dev/loop0 /
  7. Desvincula el bucle y elimina el archivo temporal:
    sudo losetup -d /dev/loop0 && sudo rm /btrfs-emergency-pool

Método 3: Purgar Instantáneas y Subvolúmenes Antiguos

Si el consumo excesivo de metadatos proviene de la acumulación masiva de snapshots automatizados (común en herramientas como Snapper o Timeshift), liberar espacio a nivel de archivos mediante rm -rf no solucionará el problema de inmediato, ya que los metadatos retienen las referencias hasta que los subvolúmenes son destruidos oficialmente a través de la interfaz de Btrfs.

Identifica y elimina las instantáneas obsoletas ejecutando las siguientes acciones:

  • Lista los subvolúmenes presentes en tu sistema para localizar puntos de restauración antiguos:
    sudo btrfs subvolume list /
  • Elimina el subvolumen o instantánea que esté saturando los metadatos utilizando el comando de borrado específico de Btrfs:
    sudo btrfs subvolume delete /ruta/al/punto-de-montaje/.snapshots/nombre_snapshot
  • Repite el proceso hasta purgar al menos un 15% o 20% del historial de respaldos innecesarios.

Conclusión y Buenas Prácticas Preventivas

El error No space left on device en Btrfs deja de ser una amenaza crítica una vez que comprendes la naturaleza dual de su gestión de datos y metadatos. Para evitar que este inconveniente vuelva a interrumpir la producción de tus servidores o equipos de escritorio Linux, se recomienda programar una tarea automatizada en el demonio Cron que ejecute un balanceo ligero de mantenimiento de forma mensual (por ejemplo, btrfs balance start -dusage=5 -musage=5 /) y configurar alertas de monitoreo que vigilen específicamente el estado de los metadatos antes de alcanzar el umbral crítico del 95%.