Introducción al error No Space Left on Device en BTRFS
El sistema de archivos BTRFS se ha convertido en una opción predilecta para muchos administradores de sistemas y usuarios avanzados de Linux debido a sus características nativas como la compresión transparente, los subvolúmenes y las instantáneas (snapshots). Sin embargo, a diferencia de sistemas de archivos tradicionales como EXT4, BTRFS gestiona el almacenamiento de una forma completamente diferente al separar la asignación de metadatos y los datos de usuario.
Uno de los problemas más desconcertantes y frustrantes a los que se enfrentan los usuarios de BTRFS es encontrarse con el error No space left on device al intentar escribir archivos, compilar código o actualizar el sistema, a pesar de ejecutar comandos como df -h y descubrir que todavía quedan gigabytes de almacenamiento libre. Este fenómeno ocurre cuando se agotan los bloques de metadatos, impidiendo que el sistema de archivos indexe nueva información, aunque físicamente queden sectores vacíos.
Análisis profundo de las causas en la gestión de BTRFS
Para comprender por qué ocurre este fallo, es fundamental entender la arquitectura interna de BTRFS. El almacenamiento se divide en fragmentos (chunks) que se clasifican en tres tipos principales: datos, metadatos y sistema. Cuando creas un volumen o realizas operaciones intensivas de escritura, borrado y creación de instantáneas, BTRFS preasigna espacio para metadatos.
Si el sistema se queda sin fragmentos libres dedicados a metadatos, entrará en un estado de bloqueo lógico. Las causas más comunes de este comportamiento incluyen:
- Uso masivo de instantáneas (snapshots) y subvolúmenes que multiplican exponencialmente las referencias de metadatos.
- Sistemas de archivos con perfiles de RAID incorrectos o desbalanceados entre datos y metadatos.
- Fragmentación extrema provocada por bases de datos o máquinas virtuales con archivos de gran tamaño en constante modificación.
- Llenado completo del disco físico antes de que el mecanismo de balanceo automático pueda reasignar los chunks.
Métodos avanzados de solución paso a paso
A continuación, abordaremos las soluciones técnicas más efectivas para recuperar la funcionalidad completa de tu sistema de archivos BTRFS sin perder datos y optimizando el espacio disponible.
Método 1: Comprobación del estado real con btrfs filesystem usage
El primer paso antes de aplicar cualquier solución destructiva o correctiva es auditar el uso real de los chunks. El comando estándar df no muestra la separación interna de BTRFS. Utiliza la herramienta nativa para obtener un diagnóstico preciso:
sudo btrfs filesystem usage /Analiza la salida generada prestando especial atención a las secciones de Data y Metadata. Si el porcentaje de metadatos asignados alcanza el 100% y no hay espacio sin asignar (Unallocated), has identificado la raíz del problema.
Método 2: Balanceo manual para reasignar espacio libre
El balanceo (balancing) es el proceso mediante el cual BTRFS reorganiza los bloques de datos y metadatos para optimizar el almacenamiento y liberar fragmentos vacíos. Si el disco está completamente lleno, un balanceo completo fallará. Por lo tanto, debemos iniciar un balanceo limitado exclusivamente a los metadatos o aplicar filtros de uso.
Ejecuta el siguiente comando para convertir y reequilibrar los metadatos utilizando un perfil más seguro (como DUP si estás en un disco único):
sudo btrfs balance start -mconvert=dup,soft /Si el sistema responde permitiendo la ejecución, este comando redistribuirá los metadatos existentes y fusionará fragmentos semivacíos, recuperando inmediatamente espacio operativo para que puedas seguir escribiendo en el disco.
Método 3: Liberar espacio mediante la limpieza de instantáneas
Las instantáneas antiguas son la causa número uno del agotamiento de metadatos. Debes listar las instantáneas activas en tu sistema y eliminar aquellas que ya no sean necesarias para aliviar la carga sobre el árbol de BTRFS.
- Lista los subvolúmenes actuales con:
sudo btrfs subvolume list / - Identifica las instantáneas redundantes o temporales.
- Elimina la instantánea problemática de forma segura ejecutando:
sudo btrfs subvolume delete /ruta/al/subvolumen/snapshot
Una vez eliminada la instantánea, el espacio liberado no siempre se refleja al instante. Es necesario ejecutar un proceso de recolección de basura interno que BTRFS gestiona automáticamente tras un breve periodo o mediante un balanceo adicional.
Método 4: Añadir temporalmente un dispositivo de almacenamiento
Si el sistema está tan lleno que ni siquiera el comando de balanceo puede iniciarse debido al error persistente, la única salida técnica viable es ampliar temporalmente la capacidad del sistema de archivos añadiendo un nuevo disco, partición o incluso un archivo de bucle (loop device).
Sigue estos pasos para añadir almacenamiento temporal y permitir que el balanceador trabaje:
sudo truncate -s 10G /tmp/btrfs-temp-pool
sudo losetup /dev/loop0 /tmp/btrfs-temp-pool
sudo btrfs device add /dev/loop0 /
sudo btrfs balance start -dusage=50 -musage=50 /Una vez que el balanceo haya finalizado con éxito y se haya reorganizado el espacio interno, puedes retirar el dispositivo temporal de forma segura:
sudo btrfs device delete /dev/loop0
sudo losetup -d /dev/loop0
rm /tmp/btrfs-temp-poolConclusión y buenas prácticas de mantenimiento
El error No space left on device en BTRFS es una advertencia de que la gestión interna de metadatos requiere supervisión. Para evitar que este problema vuelva a ocurrir en el futuro, se recomienda programar tareas automatizadas de balanceo periódico mediante cron o systemd timers, limitar la retención de instantáneas automatizadas con herramientas como Snapper, y mantener siempre un margen del 10% al 15% de espacio libre no asignado en tus particiones BTRFS.