En corto

zfs hold keep pool/dataset@snapzfs destroy falla con dataset is busy. Suelta con zfs release.

Los scripts de retención (zfs destroy -r …@auto-…) no preguntan. Un hold es un candado con nombre sobre un snapshot: destroy falla hasta que sueltas el tag.

Sirve para la snapshot desde la que estás haciendo zfs send, o para la que es el único rollback conocido después de un upgrade.

Poner el hold

1
zfs hold keep tank/home/cindys@snap1

Recursivo en todo un árbol (primero snapshot, luego hold):

1
2
zfs snapshot -r tank/home@now
zfs hold -r keep tank/home@now

El tag (keep) es libre, pero único por snapshot. Puedes tener keep y offsite a la vez en el mismo @now.

Qué ves al destruir

1
2
zfs destroy tank/home/cindys@snap1
# cannot destroy 'tank/home/cindys@snap1': dataset is busy

Eso es el hold, no un dataset montado. zfs destroy -d marca el snapshot para borrar cuando no queden holds (diferido), no lo ignora.

Listar

1
2
zfs holds tank/home@now
zfs holds -r tank/home@now
1
2
3
NAME                  TAG   TIMESTAMP
tank/home@now         keep  Thu Jul 15 11:25:39 2010
tank/home/cindys@now  keep  Thu Jul 15 11:25:39 2010

Soltar y entonces sí destruir

1
2
zfs release -r keep tank/home@now
zfs destroy -r tank/home@now

Si un send largo sigue corriendo, espera a que termine: el hold está precisamente para que el prune no te coma el cursor incremental.

Docs de Oracle (el mecanismo es el mismo en OpenZFS): Holding ZFS snapshots.

Ver también: send a dataset cifrado.