Ubuntu piensa que el disco de Btrfs está lleno pero no lo está

$ cat /etc/fstab #       UUID=a168d1ac-4e13-4643-976d-6e47ea1732b1 /boot ext2 defaults 0 1 /dev/mapper/sda4_crypt / btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda4_crypt /tmp btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda4_crypt /run btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda4_crypt /var/crash btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda4_crypt /var/tmp btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda4_crypt /var/log btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected]var-log 0 2 /dev/mapper/sda4_crypt /var/spool btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 2 /dev/mapper/sda5_crypt /home btrfs defaults,autodefrag,compress=lzo,inode_cache,space_cache,[email protected] 0 3 /dev/mapper/750er /media/750er ext4 defaults 0 4 /dev/mapper/cswap none swap defaults 0 5 ➜ ~ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/sda4_crypt 38G 12G 13M 100% / none 4,0K 0 4,0K 0% /sys/fs/cgroup udev 2,0G 4,0K 2,0G 1% /dev tmpfs 396M 1,3M 394M 1% /run none 5,0M 0 5,0M 0% /run/lock none 2,0G 208K 2,0G 1% /run/shm none 100M 36K 100M 1% /run/user /dev/mapper/sda4_crypt 38G 12G 13M 100% /tmp /dev/sda2 231M 44M 175M 21% /boot /dev/mapper/sda4_crypt 38G 12G 13M 100% /var/crash /dev/mapper/sda4_crypt 38G 12G 13M 100% /var/tmp /dev/mapper/sda4_crypt 38G 12G 13M 100% /var/log /dev/mapper/sda4_crypt 38G 12G 13M 100% /var/spool /dev/mapper/sda5_crypt 3,7T 2,4T 1,2T 67% /home /dev/mapper/750er 688G 276G 377G 43% /media/750er /dev/mapper/2tb 1,8T 1,7T 141G 93% /media/2tb ➜ ~ sudo btrfs fi df / Data, single: total=9.47GiB, used=9.46GiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=13.88GiB, used=1.13GiB Metadata, single: total=8.00MiB, used=0.00 ➜ ~ 

Es una partición de 40 GB con bastantes instantáneas. Pero está comprimido, así que creo que los 9,46GB / 40GB son precisos. Pero mi Ubuntu falla porque dice que no tiene espacio en el disco. Tuve errores de apt, no puedo instalar progtwigs y mi servidor mysql no se pudo iniciar debido a eso.

Y sé que no debo confiar en df , simplemente lo df para completar.

Creo que Ubuntu usa df que se sabe que informa de forma incorrecta con Btrfs internamente y falla por ese motivo. Eso tendría sentido para APT cuando verifica el espacio. Pero en realidad no se escribe en el disco.

 $ sudo time dd if=/dev/zero of=large bs=2G count=1 dd: error writing 'large': No space left on device 0+1 records in 0+0 records out 11747328 bytes (12 MB) copied, 1,29706 s, 9,1 MB/s Command exited with non-zero status 1 0.00user 1.40system 0:01.44elapsed 97%CPU (0avgtext+0avgdata 2098028maxresident)k 160inputs+23104outputs (0major+383008minor)pagefaults 0swaps 

Btrfs es diferente de los sistemas de archivos tradicionales. No es solo una capa que traduce los nombres de archivo a compensaciones en un dispositivo de bloque, es más bien una capa que combina un sistema de archivos tradicional con LVM y RAID. Y al igual que LVM, tiene el concepto de asignar espacio en el dispositivo subyacente, pero en realidad no lo usa para archivos.

Un sistema de archivos tradicional se divide en archivos y espacio libre. Es fácil calcular cuánto espacio se usa o gratis:

 |--------files--------| | |------------------------drive partition-------------------------------| 

Btrfs combina LVM, RAID y un sistema de archivos. La unidad se divide en subvolúmenes, cada uno de tamaño dynamic y replicado:

 |--files--| |--files--| |files| | | |[email protected]|[email protected]|[email protected]|metadata| | |------------------------drive partition-------------------------------| 

El diagtwig muestra la partición que se divide en dos subvolúmenes y metadatos. Uno de los subvolúmenes está duplicado (RAID1), por lo que hay dos copias de cada archivo en el dispositivo. Ahora no solo tenemos el concepto de cuánto espacio queda libre en la capa del sistema de archivos, sino también cuánto espacio queda libre en la capa de bloque (partición de la unidad) debajo de ella. El espacio también es ocupado por metadatos.

Al considerar el espacio libre en Btrfs, debemos aclarar de qué espacio libre estamos hablando: ¿la capa de bloques o la capa de archivos? En la capa de bloque, los datos se asignan en porciones de 1 GB, por lo que los valores son bastante aproximados y es posible que no tengan ninguna relación con la cantidad de espacio que el usuario realmente puede usar. En la capa de archivo, es imposible informar la cantidad de espacio libre porque la cantidad de espacio depende de cómo se utiliza. En el ejemplo anterior, un archivo almacenado en el subvolumen replicado @ raid1 ocupará el doble de espacio que el mismo archivo almacenado en el subvolumen @home . Las instantáneas solo almacenan copias de archivos que se han modificado posteriormente. Ya no hay una asignación 1-1 entre un archivo como lo ve el usuario, y un archivo como almacenado en la unidad.

Puede verificar el espacio libre en la capa de bloques con el btrfs filesystem show / y el espacio libre en la capa de btrfs filesystem df / con el btrfs filesystem df /


 # df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/sda4_crypt 38G 12G 13M 100% / 

Para este subvolumen montado, df reporta una unidad de tamaño total 38G, con 12G utilizada y 13M libre. Se ha utilizado el 100% del espacio disponible. Recuerde que el tamaño total 38G se divide entre diferentes subvolúmenes y metadatos, no es exclusivo de este subvolumen.

 # btrfs filesystem df / Data, single: total=9.47GiB, used=9.46GiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=13.88GiB, used=1.13GiB Metadata, single: total=8.00MiB, used=0.00 

Cada línea muestra el espacio total y el espacio utilizado para un tipo de datos y un tipo de replicación diferentes. Los valores mostrados son datos almacenados en lugar de bytes sin procesar en la unidad, por lo que si usa subvolúmenes RAID-1 o RAID-10, la cantidad de almacenamiento en bruto utilizado es el doble de los valores que puede ver aquí.

La primera columna muestra el tipo de elemento que se almacena (Datos, Sistema, Metadatos). La segunda columna muestra si una sola copia de cada elemento está almacenada (única), o si dos copias de cada artículo están almacenadas (DUP). Se utilizan dos copias para datos confidenciales, por lo que hay una copia de seguridad si una copia está dañada. Para las líneas DUP, el valor utilizado debe duplicarse para obtener la cantidad de espacio utilizado en la unidad real (porque btrfs fs df informa sobre los datos almacenados, no sobre el espacio utilizado). Las columnas tercera y cuarta muestran el espacio total y utilizado. No hay una columna libre , ya que la cantidad de “espacio libre” depende de cómo se utiliza.

Lo que destaca de esta unidad es que tiene 9.47GiB de espacio asignado para archivos ordinarios de los cuales ha usado 9.46GiB: es por eso que no le queda espacio en los errores del dispositivo . Tiene 13.88GiB de espacio asignado para metadatos duplicados, del cual ha utilizado 1.13GiB. Dado que estos metadatos están duplicados por DUP, significa que se han asignado 27.76GiB de espacio en la unidad real, de la cual ha utilizado 2.26GiB. Por lo tanto, no se están utilizando 25.5GiB de la unidad, pero al mismo tiempo no está disponible para los archivos que se almacenarán. Este es el problema “Btrfs metadata enorme asignado” . Para intentar corregirlo, ejecute btrfs balance start -m / . El parámetro -m le dice a btrfs que solo vuelva a equilibrar los metadatos.

Un problema similar se está quedando sin espacio de metadatos. Si la salida hubiera mostrado que los metadatos estaban realmente llenos (valor usado cercano al total ), la solución sería intentar liberar bloques de datos casi vacíos (<5% de los usados) utilizando el comando btrfs balance start -dusage=5 / . Estos bloques libres podrían luego ser reutilizados para almacenar metadatos.

Para más detalles vea las preguntas frecuentes de Btrfs:

  • Recibo errores de “No queda espacio en el dispositivo”, pero df dice que tengo mucho espacio

  • Btrfs dice que me he quedado sin espacio, pero parece que debería quedarme mucho .

Respuesta corta: los metadatos de la partición Btrfs se muestran como ‘usados’ por las utilidades de disco estándar como df.

  1. compruebe el volumen del problema. por ejemplo: /

     btrfs subvolume list / 
  2. Las instantáneas más probables están llenando el volumen. Borra la instantánea que no necesites. mantén una desde la última fecha, estás seguro de que el sistema estaba funcionando bien.

     btrfs subvolume delete  

    Donde la ruta es de la lista de subvolúmenes de comandos anteriores que dice “instantánea”.

  3. Reinicia y listo

El motivo del problema puede ser su distribución o el administrador de paquetes que realiza instantáneas cada vez que actualiza el sistema.

NB: el comando de balance falla si el disco está lleno, ya que no hay espacio libre para vaciar.

En mi caso, el uso del disco no disminuiría incluso cuando eliminara archivos e instantáneas.

El balance de btrfs (datos y metadatos) no funcionó con el error “no queda espacio en el dispositivo”

 btrfs balance start -m / ERROR: error during balancing '/': No space left on device There may be more info in syslog - try dmesg | tail 

El RAID1 mostró uso completo en ambos discos a pesar de que el uso de datos real fue inferior a un tercio de eso.

 # btrfs fi sh Label: none uuid: 61a20f1a-c133-11e6-964b-d3bac0c48bbd Total devices 2 FS bytes used 153.94GiB devid 1 size 455.76GiB used 455.76GiB path /dev/sda2 devid 2 size 455.76GiB used 455.76GiB path /dev/sdb2 # btrfs filesystem df / Data, RAID1: total=452.73GiB, used=151.51GiB System, RAID1: total=32.00MiB, used=80.00KiB Metadata, RAID1: total=3.00GiB, used=2.42GiB GlobalReserve, single: total=512.00MiB, used=0.00B 

Solución: descarte los trozos vacíos , no necesita espacio adicional:

 btrfs balance start -dusage=0 / btrfs balance start -musage=0 / 

Fuente: https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-balance#ENOSPC

Alternativa: Mi solución fue reducir los discos Ver: https://unix.stackexchange.com/questions/239765/how-to-fix-btrfs-superblock-error-after-resize-shrink-btrfs-couldnt-get-super

 btrfs filesystem resize 1:430g / btrfs filesystem resize 2:430g / 

(los comandos toman tiempo, verifique syslog para ver los bloques de reubicación)

después de eso cambiar el tamaño hasta:

 btrfs filesystem resize 1:450g / btrfs filesystem resize 2:450g / 

Después de eso, btrfs balance (metadata) trabajó de nuevo:

 btrfs balance -m / 

Luego, btrfs balance de los datos (reubique los fragmentos de datos que tienen un uso inferior al 33%):

 btrfs balance -dusage=33 / 

El crédito va a @ignis y @bain. Solo para tener una respuesta simple de referencia directa al punto aquí sin toda la conferencia y compartir lo que realmente hice para que el sistema vuelva a funcionar.

 btrfs balance start -m /mountpoint 

Es la línea mágica para resolver problemas como este.

Me encontré con un problema con el que no quiero aburrirte y no sé si era necesario ejecutar esto desde un CD en vivo, pero lo que hice al final después de que el sistema se estropeó no arrancar fue ejecutar btrfsck Los dispositivos (mapeadores criptográficos desbloqueados) y realmente encontraron errores, luego montaron el sistema de archivos btrfs raíz sin ninguna opción para /mnt , a diferencia de mi sistema instalado, donde / es el único subvolumen @ montado. Así que tuve todas las instantáneas y otros subvolúmenes también allí. No sé de esto hace una diferencia.

 btrfs balance start -m /mnt 

Obtuve los metadatos de

 Metadata, DUP: total=13.88GiB, used=1.13GiB 

a

 Metadata, DUP: total=1.38GiB, used=1.05GiB 

Y un refrescante:

 $ sudo df -h / Filesystem Size Used Avail Use% Mounted on /dev/mapper/sda4_crypt 38G 12G 26G 31% / 

Así que creo que todo está bien ahora.