Necesitaba ejecutar btrfs balance
en mi sistema de archivos de un solo dispositivo porque estaba obteniendo ENOSPC
a pesar de que efectivamente había espacio libre.
¿Por qué es necesario ejecutar esto?
¿Qué hace realmente la balanza?
Respuesta
A diferencia de la mayoría de los sistemas de archivos convencionales, BTRFS utiliza un asignador de dos etapas. La primera etapa asigna grandes regiones de espacio conocidas como fragmentos para tipos específicos de datos , luego la segunda etapa asigna bloques como un sistema de archivos normal dentro de estas regiones más grandes. Hay tres tipos diferentes de fragmentos:
-
Chunks de datos: estos almacenan datos de archivos normales.
-
Fragmentos de metadatos: almacenan metadatos sobre archivos, incluidas, entre otras cosas, marcas de tiempo, sumas de verificación, nombres de archivos, propiedad, permisos y atributos extendidos.
-
Fragmentos del sistema: se trata de un tipo especial de fragmento que almacena datos sobre dónde se encuentran todos los demás fragmentos.
Solo el tipo de datos para los que está asignado el fragmento se puede almacenar en ese fragmento. El caso más común en estos días cuando recibe un error -ENOSPC en BTRFS es que el sistema de archivos se ha quedado sin espacio para datos o metadatos en los fragmentos existentes y no puede asignar un nuevo fragmento. Puede verificar que este sea el caso al ejecutando btrfs fi df
en el sistema de archivos que arrojó el error. Si la línea de datos o metadatos muestra un valor total que es significativamente diferente del valor usado, probablemente esta sea la causa.
Lo que btrfs balance
hace es enviar cosas a través del asignador, lo que da como resultado el uso de espacio en los fragmentos que se compactan. Por ejemplo, si tiene dos fragmentos de metadatos que son ambos 40% completo, un saldo hará que se conviertan en un fragmento de metadatos que esté lleno al 80%. Al compactar el uso del espacio de esta manera, la operación de equilibrio puede eliminar los fragmentos ahora vacíos y, por lo tanto, libera espacio para la asignación de nuevos fragmentos. Si vuelve a ejecutar btrfs fi df
después de ejecutar el saldo, debería ver que los valores Total y Usado están mucho más cerca uno del otro, ya que el saldo borró fragmentos que ya no eran necesarios.