¿Cuánto espacio se liberaría al eliminar un subvolumen btrfs?

11

¿Hay alguna manera de calcular cuánto espacio liberaría si eliminara uno (o varios) subvolúmenes en un disco Btrfs (sin eliminarlos realmente)? Sé que "actualmente no hay ningún código que haga el cálculo por usted" , pero ¿cómo lo haría?

También me pregunto por qué dicen que sería tan lento. En realidad, tanto eliminar un subvolumen como preguntar sobre el espacio libre es muy rápido, ¿por qué hacer lo mismo hipotéticamente sería mucho más lento?

Hjulle
fuente
2
Espero que sepan que btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list podría ser un mejor lugar para hacer preguntas sobre el funcionamiento interno de btrfs (o cualquier otro componente del núcleo). Si obtiene la respuesta, publíquela aquí también. Tengo curiosidad por la respuesta yo mismo.
Adam Ryczkowski
1
Usted dice "En realidad, tanto eliminar un subvolumen como preguntar sobre el espacio libre es muy rápido". Cuando elimina un subvolumen, en realidad solo marca ese subvolumen para su eliminación, en realidad solo libera esos bloques cuando tiene tiempo (que es lo que significa el mensaje 'no-commit' cuando lo hace), así que no, eliminar no es necesariamente muy rápido
etskinner

Respuestas:

3

Debe echar un vistazo a btrfs quotay btrfs qgroups(grupos de cuotas).

Básicamente, qgroupshaga exactamente lo que solicitó, realizan un seguimiento de la cantidad de espacio asignado por subvolúmenes. Para habilitar la qgroupfuncionalidad de un btrfssistema de archivos, debe

# btrfs quota enable /path/to/btrfs/filesystem

Sin embargo, antes de hacer esto, tenga en cuenta que esto desencadena un recálculo completo de los qgroupdatos, lo que llevará algún tiempo, especialmente para sistemas de archivos grandes con muchos subvolúmenes. Este proceso se ejecuta de forma asíncrona en segundo plano. Ya puede verificar el estado de la qgroupscon

# btrfs qgroup show /path/to/btrfs/filesystem

Esto le dará un resultado como este:

WARNING: rescan is running, qgroup data may be incorrect
qgroupid         rfer         excl
--------         ----         ----
0/5         843.69GiB     61.91MiB
0/4881      811.06GiB      9.34GiB
0/7990      867.32GiB    329.91MiB
0/8400      867.17GiB     37.64MiB

(La advertencia en la primera línea está presente mientras el reescaneo aún se esté ejecutando).

Btrfs crea automáticamente un qgrouppara cada subvolumen. En este caso, hay tres subvolúmenes con ID de subvolumen 4881, 7990 y 8400. La parte anterior a la barra diagonal es el nivel de qgroup. Cada subvolumen qgroupestá en el nivel 0. Además, hay un especial qgroupen el nivel 0 que siempre tiene ID 5 y corresponde a la raíz del sistema de archivos btrfs.

Para cada uno, qgroupel resultado anterior muestra la cantidad de espacio al que hace referencia. Eso significa que el subvolumen correspondiente contiene archivos cuyo tamaño total es igual al número mostrado.

Sin embargo, debido a las instantáneas y la naturaleza de copiar y escribir de los subvolúmenes btrfs pueden compartir archivos. Esto significa que el contenido (o en realidad la extensión) de los archivos puede estar referenciado por más de un subvolumen. Esto se expresa mediante el segundo número que muestra cuánto espacio se asigna exclusivamente a cada subvolumen y no se comparte con ningún otro subvolumen. En caso de que elimine un subvolumen, este es el espacio que realmente se liberará.

Si desea averiguar cuánto espacio se liberaría si elimina varios subvolúmenes, puede usar los niveles antes mencionados. qgroupsestán organizados en una jerarquía y los grupos en los niveles superiores (superiores a 0) agregan la información de los niveles inferiores.

Por lo tanto, para averiguar cuánto espacio se liberaría si se eliminaran los subvolúmenes 4881 y 7990 (en el ejemplo anterior), cree un nuevo qgroup(arbitrariamente con ID 0, pero puede elegir lo que quiera aquí) en el nivel 1 con

# btrfs qgroup create 1/0 /path/to/btrfs/filesystem

Luego asigne el recién creado qgroupcomo padre al qgroupssubvolumen que desea eliminar con

# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem

Esto activará otra nueva exploración de la información de la cuota que puede demorar un poco. Si está terminado y ahora emite

# btrfs qgroup show -p /path/to/btrfs/filesystem

obtienes una salida como esta:

qgroupid         rfer         excl parent
--------         ----         ---- ------
0/5           1.38TiB      2.51GiB ---
0/4881        1.11TiB     10.86GiB 1/0
0/7990        1.23TiB    502.41MiB 1/0
0/8400        1.34TiB      1.69GiB 1/0
1/0           1.51TiB    132.23GiB ---

(Agregué la -pbandera para agregar la parentcolumna a la salida que muestra la relación padre / hijo del qgroups.)

Ahora la línea con qgroup 1/0le indica cuánto espacio hace referencia a los dos subvolúmenes que desea eliminar y, lo que es más importante, le indica cuánto espacio le asignan exclusivamente . Esta es la cantidad de espacio que se liberará si elimina ambos subvolúmenes.

También me pregunto por qué dicen que sería tan lento.

Esto se debe a la naturaleza de copia en escritura de btrfs junto con las instantáneas. Si crea una instantánea en btrfs (normalmente), todos los datos reales en el subvolumen recién creado que contiene la instantánea se comparten con la fuente de la instantánea. Solo cuando se cambia o reemplaza un archivo en el origen, señala a contenido diferente (extensiones). Esto hace que sea muy difícil evaluar cuánto espacio se liberaría realmente si se elimina un subvolumen porque debe tener en cuenta todo el espacio que se comparte con otros subvolúmenes.

Erki der Loony
fuente