Ir al contenido
  1. Posts/

zfs get en Proxmox: cómo leo propiedades de datasets y discos de VM sin tocar nada

·1996 palabras·10 mins

zfs get es de esos comandos que parecen aburridos hasta que te ahorran tocar algo que no deberías tocar. En Proxmox lo uso antes de cambiar propiedades de un dataset, antes de asumir que una VM está mal configurada y antes de meter mano a ZFS con esa alegría peligrosa que aparece cuando llevas demasiadas horas delante de una terminal.

ZFS tiene muchas propiedades. Algunas se heredan. Algunas se fijan localmente. Algunas cambian rendimiento. Algunas cambian comportamiento. Algunas parecen inocentes y luego te dejan una tarde muy entretenida. Por eso me gusta mirar antes de actuar.

El comando más básico es este.

1
zfs get all pve-zfs

Pero casi nunca necesito todo. all escupe demasiada información para una revisión rápida. Yo suelo empezar por propiedades concretas.

1
zfs get compression,atime,recordsize,sync,mountpoint pve-zfs

Y si estoy mirando un disco de VM o un dataset concreto, apunto directamente a ese recurso.

1
zfs get compression,volblocksize,sync pve-zfs/vm-120-disk-0

No cambia nada. Solo lee. Eso ya lo convierte en un buen comando para usar cuando no estás seguro.

la captura de este post
#

La captura usa una salida saneada de un entorno Proxmox con ZFS. Los nombres son genéricos. No hay rutas privadas, hostnames reales ni datos que identifiquen el laboratorio. Me interesa enseñar cómo leo columnas y valores, no el inventario de nadie.

Salida saneada de zfs get en Proxmox

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ zfs get compression,atime,recordsize,sync,mountpoint pve-zfs/templates
NAME               PROPERTY     VALUE          SOURCE
pve-zfs/templates  compression  zstd           local
pve-zfs/templates  atime        off            local
pve-zfs/templates  recordsize   128K           default
pve-zfs/templates  sync         standard       default
pve-zfs/templates  mountpoint   /pve/templates local

$ zfs get compression,volblocksize,sync pve-zfs/vm-120-disk-0
NAME                  PROPERTY      VALUE     SOURCE
pve-zfs/vm-120-disk-0 compression   zstd      inherited from pve-zfs
pve-zfs/vm-120-disk-0 volblocksize  16K       -
pve-zfs/vm-120-disk-0 sync          standard  default

Esta salida ya dice varias cosas. El dataset de plantillas tiene compression=zstd y atime=off fijados localmente. recordsize y sync vienen por defecto. El disco de VM hereda compresión del pool, tiene volblocksize=16K y mantiene sync=standard.

No hay que tocar nada para aprender bastante.

por qué miro SOURCE y no solo VALUE
#

La columna que más gente ignora es SOURCE. Error clásico.

VALUE te dice el valor actual. SOURCE te dice de dónde viene. Puede ser local, default, inherited o algo más específico según la propiedad. Esa diferencia importa mucho en ZFS.

Si veo esto:

1
compression  zstd  inherited from pve-zfs

sé que ese dataset no tiene una decisión propia. Está siguiendo lo que marca el padre. Si cambio el padre, puede cambiar el comportamiento de varios hijos. Eso exige más cuidado.

Si veo esto:

1
compression  zstd  local

sé que alguien fijó ese valor en ese dataset. Aunque cambie el padre, ese dataset seguirá con su valor local hasta que lo herede de nuevo o lo cambie expresamente.

Esa es una diferencia enorme cuando estás limpiando configuración. Si solo miras VALUE, puedes pensar que todos los datasets están igual. Si miras SOURCE, ves cuáles están igual por herencia y cuáles están igual porque alguien los dejó clavados.

En un homelab pequeño quizá no parece importante. En cuanto tienes varias VMs, backups, plantillas y datasets para servicios, empieza a importar bastante.

propiedades que reviso casi siempre
#

No miro todas las propiedades de ZFS cada vez. Sería absurdo. Tengo un grupo pequeño que me da contexto rápido.

compression es la primera. En la mayoría de mis datasets prefiero tener compresión activa. ZFS suele ganar más de lo que pierde, especialmente con lz4 o zstd en niveles razonables. Pero quiero saber si está activada, si se hereda y si alguien la cambió solo en un dataset.

atime también la miro mucho. En datasets con muchos archivos pequeños, tener atime=on puede generar escrituras extra cada vez que se accede a un archivo. No siempre es grave, pero en plantillas, backups o datos que no necesitan registrar último acceso, suelo preferir off.

recordsize me interesa en datasets de archivos. No lo trato como una palanca mágica. Para datos generales, 128K suele estar bien. Para bases de datos o cargas muy concretas, puede tener sentido otro valor. Lo importante es no tocarlo por copiar una recomendación suelta de internet.

sync la miro con respeto. standard es lo normal. always puede tener sentido en ciertos escenarios. disabled puede dar rendimiento aparente, pero también puede darte una lección cara si hay un corte o una caída. En laboratorio se puede probar. En datos importantes, cuidado.

mountpoint parece aburrida hasta que un dataset se monta donde no debe. Cuando algo aparece o desaparece de una ruta, miro esto pronto.

En discos de VM también miro volblocksize, aunque ahí hay una trampa importante: no es una propiedad que cambies alegremente después de crear el zvol. Si te equivocaste al crear el disco, normalmente toca planificar migración o recreación, no apretar botones como si fuese un toggle de interfaz.

datasets y zvols no se leen igual
#

En Proxmox te vas a encontrar datasets de archivos y zvols para discos de VM. Los dos viven en ZFS, pero no conviene leerlos con la misma cabeza.

Un dataset de archivos puede tener propiedades como recordsize y mountpoint que afectan bastante a cómo se comporta. Por ejemplo, un dataset para plantillas ISO, backups temporales o datos de servicios tiene sentido mirarlo como un árbol de archivos.

Un zvol de VM funciona como un bloque. Ahí me fijo más en volblocksize, compresión y sync. También miro si hereda propiedades del pool o si tiene algo local extraño.

Esto es una salida típica para un zvol.

1
zfs get compression,volblocksize,sync pve-zfs/vm-120-disk-0

Y esto para un dataset de archivos.

1
zfs get compression,atime,recordsize,mountpoint pve-zfs/templates

La diferencia parece pequeña, pero evita conclusiones torpes. Si estás leyendo un zvol y te obsesionas con propiedades que no aplican como esperas, pierdes tiempo. Si estás leyendo un dataset y no miras mountpoint, puedes perder una pista evidente.

el caso típico: una VM que consume más de lo esperado
#

Una VM empieza a ocupar más disco del que debería. La web de Proxmox enseña un tamaño. ZFS enseña otro. El sistema invitado enseña otro. Bienvenido a una tarde normal.

Antes de tocar nada, miro propiedades.

1
zfs get compression,compressratio,logicalused,used,referenced pve-zfs/vm-120-disk-0

Aquí no busco una verdad absoluta. Busco contexto. logicalused me da una idea del uso lógico. used enseña lo que ZFS está consumiendo con sus reglas. compressratio me dice si la compresión está ayudando algo.

Si la compresión está activa pero el ratio es bajo, no pasa nada. No todo comprime. Un disco lleno de vídeos, backups comprimidos o datos cifrados no va a hacer milagros. ZFS no es magia, aunque a veces lo vendan como si fuese una liturgia.

Si la compresión está desactivada en ese zvol y activada en otros, miro SOURCE. Quizá alguien fijó compression=off localmente hace meses. Ahí zfs get me evita una discusión con fantasmas.

el caso incómodo: sync desactivado
#

Cuando encuentro esto, paro un momento.

1
sync  disabled  local

No digo que sea siempre incorrecto. En homelab hacemos pruebas. A veces buscas rendimiento para una carga temporal. A veces quieres medir diferencias. El problema es olvidarte de que lo dejaste así.

Con sync=disabled, ZFS puede responder más rápido a escrituras síncronas porque no las trata con la misma garantía. Eso puede parecer una mejora brutal en benchmarks, pero no es gratis. Si hay una caída, puedes perder datos que la aplicación creía confirmados.

Para una VM de pruebas, me da igual. Para una base de datos, un servicio importante o algo que no quiero reconstruir, no me hace gracia.

Por eso me gusta mirar sync directamente.

1
zfs get sync pve-zfs/vm-120-disk-0

Y si quiero buscar rarezas en todo el pool:

1
zfs get -r sync pve-zfs | grep disabled

Ese comando es casi una inspección de higiene. Si no devuelve nada, mejor. Si devuelve algo, quiero saber por qué.

usar -r sin ahogarte en salida
#

-r recorre datasets hijos. Es útil, pero puede escupir demasiado.

1
zfs get -r compression pve-zfs

En un pool pequeño se lee bien. En uno con muchas VMs, snapshots y datasets, puede ser ruido. Por eso suelo combinarlo con propiedades concretas y filtros simples.

Para ver compresión y origen:

1
zfs get -r compression pve-zfs

Para buscar datasets con compresión desactivada:

1
zfs get -r compression pve-zfs | grep " off "

Para revisar atime:

1
zfs get -r atime pve-zfs

Para encontrar valores locales:

1
zfs get -r compression pve-zfs | grep " local"

No es sofisticado. Funciona. A veces en administración de sistemas confundimos sofisticación con utilidad y luego acabamos con un dashboard precioso para evitar leer una columna.

cuidado con cambiar propiedades por impulso
#

zfs get es lectura. El peligro viene justo después, con zfs set.

Ver una propiedad rara no significa que debas cambiarla en caliente. Primero hay que entender qué recurso estás mirando, qué carga mueve, si hay snapshots, si hay backups recientes y si el cambio afecta solo a ese dataset o a hijos que heredan.

Ejemplo sencillo:

1
zfs set compression=zstd pve-zfs

Puede ser una decisión razonable. Pero si tienes muchos hijos heredando compresión, acabas de cambiar el comportamiento futuro de todos los que no tengan valor local. Quizá eso es lo que quieres. Quizá no.

Otro ejemplo:

1
zfs set atime=off pve-zfs/templates

En un dataset de plantillas puede tener sentido. En otro tipo de datos quizá una aplicación sí espera atime. No es lo más común, pero existe.

Y con sync, directamente no juego sin pensar.

1
zfs set sync=disabled pve-zfs/vm-120-disk-0

Ese comando puede convertir una prueba de rendimiento en una ruleta. Si lo uso, lo documento y lo revierto. Si no lo documento, dentro de tres semanas yo mismo me odiaré un poco. Con razón.

cómo lo documento cuando encuentro algo raro
#

Cuando zfs get me enseña una propiedad rara, guardo tres cosas.

Primero, la salida exacta.

1
zfs get compression,sync,atime,recordsize pve-zfs/dataset

Segundo, el motivo si lo conozco. Por ejemplo: “sync desactivado para prueba de benchmark, volver a standard al terminar”.

Tercero, la fecha. Parece obvio. No lo es. En un homelab con cambios pequeños, saber cuándo tocaste algo vale oro.

También miro zpool history para ver si el cambio aparece registrado.

1
zpool history pve-zfs | grep "zfs set"

Así conecto la propiedad actual con el momento en que se cambió. zfs get me dice cómo está. zpool history me ayuda a saber cuándo llegó ahí.

mi comando corto favorito
#

Si solo quiero una lectura rápida de un dataset de archivos, suelo usar esto.

1
zfs get compression,atime,recordsize,sync,mountpoint pve-zfs/templates

Si es un disco de VM:

1
zfs get compression,volblocksize,sync,used,logicalused,compressratio pve-zfs/vm-120-disk-0

Con eso tengo bastante para decidir si sigo investigando ZFS o si miro otra capa. No necesito veinte propiedades para cada sospecha. Necesito las que cambian la historia.

lo que me gusta de zfs get
#

Me gusta porque es seguro. Leer antes de tocar debería ser norma, pero en homelab a veces nos venimos arriba. zfs get te obliga a mirar el estado real y, sobre todo, el origen del valor.

También me gusta porque explica diferencias que en la web de Proxmox no siempre se ven claras. Dos discos pueden parecer iguales y no serlo. Dos datasets pueden tener la misma compresión por motivos distintos. Un valor local olvidado puede sobrevivir durante meses y condicionar una VM sin que nadie se acuerde.

No es el comando más emocionante de ZFS. Mejor. Los comandos emocionantes en almacenamiento suelen venir acompañados de sudor.

Mi regla es simple: si voy a tocar una propiedad, antes la leo. Si una VM o dataset se comporta raro, leo sus propiedades antes de culpar al nodo. Si veo un valor local inesperado, miro historial. Y si no entiendo por qué está así, no lo cambio hasta tener una copia buena o una razón decente.

En Proxmox, esa prudencia parece aburrida. También es la diferencia entre una tarde tranquila y una noche intentando recordar por qué una VM importante dejó de arrancar después de “solo un cambio pequeño”.