Ir al contenido
  1. Posts/

zfs list en Proxmox: cómo veo datasets, discos de VM y consumo real antes de tocar nada

·1933 palabras·10 mins

zfs list es el comando que uso cuando pvesm status ya se me queda corto.

Proxmox te dice que un storage está activo, cuánto ocupa y qué porcentaje queda libre. Eso está bien para una foto rápida. Pero cuando quieres saber qué está comiendo espacio dentro de un pool ZFS, necesitas bajar un nivel. Ahí entra zfs list.

Lo uso para responder preguntas muy concretas. Qué datasets existen. Qué discos de VM viven en el pool. Qué subvolúmenes de LXC ocupan más de lo esperado. Qué volumen tiene una reserva rara. Qué dataset aparece cuando nadie lo esperaba. Y, sobre todo, si el problema de espacio es real o si estoy mirando una cifra agregada sin contexto.

El comando base es sencillo.

1
zfs list

En Proxmox suelo acotarlo un poco más.

1
zfs list -o name,used,avail,refer,mountpoint -r -d 2 pve-zfs

Ese formato me da una tabla bastante legible. No necesito todas las propiedades de ZFS para una primera lectura. Necesito nombre, usado, disponible, referencia y punto de montaje. Con eso ya puedo orientarme.

la captura de este post
#

La captura viene de un nodo real de Proxmox y está saneada. He cambiado identificadores concretos por nombres genéricos y he dejado tamaños aproximados. Lo importante aquí no es el inventario exacto, sino la forma de leer datasets, subvolúmenes y discos de VM.

Salida saneada de zfs list en Proxmox

Esta es la salida saneada que usé para generar la captura:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ zfs list -o name,used,avail,refer,mountpoint -r -d 2 pve-zfs
NAME                        USED  AVAIL  REFER  MOUNTPOINT
pve-zfs                     982G  2.84T   204K  /pve-zfs
pve-zfs/subvol-100-disk-1  3.28G  16.7G  3.27G  /pve-zfs/subvol-100-disk-1
pve-zfs/subvol-101-disk-0  6.41G  33.6G  6.41G  /pve-zfs/subvol-101-disk-0
pve-zfs/subvol-108-disk-0   421M  19.6G   421M  /pve-zfs/subvol-108-disk-0
pve-zfs/subvol-109-disk-0  4.44G  3.56G  4.44G  /pve-zfs/subvol-109-disk-0
pve-zfs/vm-145-disk-0      97.3G  2.90T  29.7G  -
pve-zfs/vm-145-disk-1       243G  2.99T  85.2G  -
pve-zfs/vm-204-disk-1       122G  2.95T  8.57G  -
pve-zfs/vm-308-disk-1       365G  3.00T   199G  -

Esta tabla parece más seca que la web, pero a mí me cuenta más. Veo el dataset raíz, veo subvolúmenes de contenedores LXC y veo zvols de VMs. También veo una diferencia importante entre USED y REFER, que es donde mucha gente se lía.

NAME: leer la forma del almacenamiento
#

La columna NAME ya te dice bastante.

1
2
pve-zfs/subvol-100-disk-1
pve-zfs/vm-145-disk-0

En Proxmox, los contenedores LXC suelen aparecer como subvolúmenes. Las VMs suelen aparecer como volúmenes ZFS, normalmente zvols. Esa diferencia importa porque no se comportan igual, no se montan igual y no siempre los inspeccionas con las mismas herramientas.

Cuando veo subvol, pienso en LXC. Cuando veo vm-xxx-disk-y, pienso en disco de VM. No necesito abrir la web para ubicarme. Si el nombre tiene buena pinta y coincide con lo que espero, sigo. Si aparece un volumen de una VM que creía borrada, ya tengo una tarea de limpieza pendiente.

Aquí conviene recordar una cosa básica: el número de VMID no te cuenta la historia completa. Puede haber discos antiguos, volúmenes sin usar, restauraciones a medias o pruebas que dejaron restos. Por eso no borro nada solo porque el nombre me suene viejo. Primero cruzo con Proxmox.

1
2
3
4
qm list
pct list
qm config 145
pct config 100

Borrar storage por intuición es una forma bastante eficiente de fabricar una tarde horrible.

USED no siempre significa lo que crees
#

La columna USED dice cuánto espacio está usando ese dataset teniendo en cuenta hijos, snapshots, reservas y otros detalles de ZFS.

1
pve-zfs/vm-145-disk-1       243G  2.99T  85.2G  -

Aquí el volumen aparece con 243 GB usados, pero REFER marca 85.2 GB. Esa diferencia no es un error. ZFS distingue entre espacio usado por el dataset en conjunto y espacio referenciado directamente por ese dataset.

Esta es una de las razones por las que zfs list me parece tan útil. La web puede enseñarte un disco de cierto tamaño y Proxmox puede mostrarte una ocupación agregada, pero ZFS te enseña detalles que explican por qué las cuentas no cuadran a simple vista.

Si USED es muy alto y REFER bastante menor, empiezo a pensar en snapshots, clones, reservas o hijos. No asumo automáticamente que el invitado tiene 243 GB de archivos. Puede ser más sutil.

Para investigar más, cambio de comando.

1
2
zfs list -t snapshot -r pve-zfs
zfs get used,referenced,usedbysnapshots,usedbydataset pve-zfs/vm-145-disk-1

No suelo empezar por ahí porque genera más ruido. Pero cuando USED y REFER no cuadran, merece la pena.

REFER: lo que el dataset referencia directamente
#

REFER es una columna que me gusta mirar con calma.

1
2
REFER
85.2G

En términos prácticos, me ayuda a distinguir entre lo que parece ocupar el objeto y lo que ZFS está contando alrededor. En un zvol de una VM, REFER suele acercarme más a lo que ese volumen está referenciando ahora mismo. En un subvolumen de LXC, también me sirve para ver si un contenedor se ha ido de madre.

No es una traducción perfecta a “lo que ves dentro del sistema operativo invitado”. Si dentro de Linux haces df -h, puedes ver otra cosa. Thin provisioning, bloques liberados que no han sido descartados, snapshots y comportamiento del filesystem invitado pueden cambiar la lectura.

Por eso me gusta comparar capas.

Dentro de la VM:

1
df -h

En Proxmox:

1
qm config 145

En ZFS:

1
zfs list pve-zfs/vm-145-disk-1

Tres capas. Tres verdades parciales. Cuando encajan, perfecto. Cuando no, al menos sabes dónde empezar a tirar.

AVAIL: disponible para ese dataset, no una promesa mágica
#

AVAIL muestra espacio disponible para el dataset.

1
2
AVAIL
2.99T

En la captura parece todo muy cómodo. Hay teras libres. Pero no lo leo como carta blanca para ampliar discos sin pensar. Depende de cuotas, reservas, estructura del pool, uso futuro y margen operativo.

En un homelab pequeño, es muy tentador ampliar discos porque “total, queda sitio”. Lo he hecho. Luego descubres que el problema no era el tamaño del disco, sino logs creciendo, backups locales mal puestos, una aplicación escribiendo caché sin límite o snapshots acumulados. Si solo amplías, compras tiempo. A veces está bien. Otras veces solo tapas el olor.

Antes de ampliar un disco, me hago tres preguntas.

  • El invitado necesita espacio de verdad o está reteniendo basura
  • Hay snapshots que explican la diferencia de uso
  • El pool tiene margen suficiente para seguir sano después del cambio

Si las respuestas son razonables, amplío. Si no, investigo.

MOUNTPOINT: por qué unas líneas tienen ruta y otras no
#

En la captura, los subvolúmenes tienen punto de montaje.

1
/pve-zfs/subvol-100-disk-1

Los discos de VM aparecen con -.

1
pve-zfs/vm-145-disk-0      97.3G  2.90T  29.7G  -

Esto desconcierta un poco al principio. No todos los objetos ZFS se montan como directorios. Un zvol es un dispositivo de bloque. Proxmox lo usa como disco para una VM. No esperes verlo como una carpeta normal donde entrar con cd.

Los subvolúmenes de LXC sí aparecen montados como datasets. Eso hace que ciertas inspecciones sean más directas, aunque igualmente hay que tener cuidado. Que puedas mirar dentro no significa que debas tocar archivos a mano alegremente.

Mi regla es sencilla. Para diagnosticar, mirar está bien. Para modificar datos de un contenedor o VM desde el host, mucha prudencia. Si puedo entrar por el sistema invitado y hacer las cosas desde ahí, suelo preferirlo.

cómo encuentro quién se está comiendo el pool
#

Cuando el pool crece y no sé por qué, empiezo ordenando por uso.

1
zfs list -o name,used,refer,mountpoint -r pve-zfs | sort -h -k2

Ese sort no siempre queda perfecto con unidades mezcladas, pero para una primera pasada ayuda. Si quiero algo más limpio, saco tamaños en bytes.

1
zfs list -p -o name,used,refer -r pve-zfs | sort -n -k2

Ahí ya no hay discusión con G, M o T. Ordeno por números reales.

Cuando detecto un volumen grande, no lo borro. Lo identifico. Miro si pertenece a una VM activa, si tiene snapshots, si hay backups recientes y si Proxmox lo sigue referenciando.

1
2
qm config 145 | grep disk
zfs list -t snapshot -r pve-zfs/vm-145-disk-1

La limpieza buena es aburrida. Confirmar, confirmar otra vez y borrar solo cuando entiendes qué estás borrando. La limpieza emocionante queda muy bien hasta que tienes que restaurar algo que no pensabas haber tocado.

snapshots: el sospechoso habitual
#

Cuando USED sube y el invitado no parece tener tantos datos, miro snapshots.

1
zfs list -t snapshot -r pve-zfs

Los snapshots son maravillosos hasta que dejas de acordarte de que existen. En Proxmox puedes tener snapshots manuales, snapshots de pruebas, herramientas externas y retenciones que parecían prudentes hace meses. Todo suma.

No tengo nada contra los snapshots. Al contrario. Me han salvado más de una vez. Pero hay que tratarlos como copias temporales, no como un cementerio infinito de decisiones pasadas.

Si un dataset crece sin explicación, usedbysnapshots suele poner orden.

1
zfs get usedbysnapshots,usedbydataset pve-zfs/vm-145-disk-1

Si el espacio lo retienen snapshots, borrar archivos dentro de la VM no va a liberar lo que esperas. Esa es una de esas lecciones que se aprenden una vez y luego ya no se olvidan.

cruzar con Proxmox antes de limpiar
#

Después de mirar ZFS, vuelvo a Proxmox.

1
2
3
pvesm status
qm list
pct list

Quiero saber si los volúmenes que he visto pertenecen a algo vivo. Si una VM está apagada desde hace meses pero sigue siendo importante, no la toco. Si un volumen parece huérfano, busco contexto. Si hay un disco unused en la configuración, lo trato como evidencia, no como basura automática.

Para una VM concreta:

1
qm config 145

Para un contenedor:

1
pct config 100

Solo cuando ZFS y Proxmox cuentan la misma historia me planteo limpiar. Y aun así, antes de borrar, prefiero tener backup reciente y saber qué camino de vuelta tengo.

errores típicos que intento evitar
#

El primero es confundir tamaño provisionado con espacio usado. Un disco virtual puede tener 200 GB asignados y no estar ocupando 200 GB reales en ZFS. También puede pasar lo contrario en ciertas lecturas si hay snapshots o reservas.

El segundo es borrar volúmenes por nombre. Que algo se llame vm-204-disk-1 no significa que sea basura. Significa que hay que mirar qué es la VM 204 o qué fue en su momento.

El tercero es fiarse solo de df -h dentro del invitado. Esa salida te dice lo que ve el sistema operativo, no necesariamente lo que ZFS está reteniendo por debajo.

El cuarto es olvidarse de snapshots. En ZFS, borrar datos dentro de una VM con snapshots antiguos puede liberar bastante menos de lo que esperabas.

El quinto es ampliar discos sin preguntarse por qué crecieron. A veces hace falta. Otras veces estás premiando a una aplicación mal configurada.

mi rutina corta
#

Cuando necesito entender un pool ZFS en Proxmox, hago esto.

1
2
3
zpool list pve-zfs
zfs list -o name,used,avail,refer,mountpoint -r -d 2 pve-zfs
pvesm status

Si algo no cuadra, profundizo.

1
2
3
4
zfs list -t snapshot -r pve-zfs
zfs get used,referenced,usedbysnapshots,usedbydataset pve-zfs/<dataset>
qm config <vmid>
pct config <ctid>

No es una rutina elegante. Es una rutina que evita tonterías. En almacenamiento, eso vale mucho.

mi regla práctica
#

Uso zfs list cuando quiero dejar de hablar de “el storage” como si fuera una nube abstracta y empezar a ver objetos concretos.

Datasets. Subvolúmenes. Zvols. Discos de VM. Contenedores. Snapshots. Espacio referenciado. Espacio retenido.

Ahí es donde los problemas dejan de sonar genéricos. Ya no es “Proxmox ocupa mucho”. Es un volumen concreto, un snapshot concreto, una VM concreta o una decisión antigua que sigue cobrando alquiler.

zfs list no arregla nada por sí solo, pero te quita niebla. Y en un homelab con Proxmox, quitar niebla ya es medio trabajo.