<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Zfs on inetshell</title><link>https://inet.sh/es/tags/zfs/</link><description>Recent content in Zfs on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Wed, 19 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/zfs/index.xml" rel="self" type="application/rss+xml"/><item><title>Cifrado nativo de ZFS (OpenZFS): crear, heredar y cambiar la key</title><link>https://inet.sh/es/posts/zfs/cifrado/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/cifrado/</guid><description>Cómo crear un dataset ZFS cifrado con passphrase o keyfile, heredar cifrado en hijos, y change-key. OpenZFS, no Solaris zfs key -c.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><code>zfs create -o encryption=on …</code>. Los hijos heredan. Rotar key en Linux: <code>zfs change-key</code> (no Solaris <code>zfs key -c</code>).</p>
<p>OpenZFS cifra <strong>datasets</strong>, no el pool entero. El pool (etiquetas, metaslab) sigue visible; el contenido de <code>tank/secret</code> no. Sirve en TrueNAS, Proxmox y Linux.</p>
<p>Guías útiles: <a href="https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/">Ars native encryption</a>, <a href="https://mtlynch.io/zfs-encrypted-backups/">ZFS encrypted backups</a>.</p>
<h2 id="crear">Crear</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs create -o <span class="nv">encryption</span><span class="o">=</span>on -o <span class="nv">keyformat</span><span class="o">=</span>passphrase -o <span class="nv">keylocation</span><span class="o">=</span>prompt tank/encrypted
</span></span><span class="line"><span class="cl">zfs create tank/encrypted/child1
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>child1</code> hereda cifrado. No pongas <code>encryption=off</code> en un hijo: OpenZFS no permite “agujero” sin cifrar bajo un padre cifrado.</p>
<p>Keyfile en vez de prompt:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs create -o <span class="nv">encryption</span><span class="o">=</span>on -o <span class="nv">keyformat</span><span class="o">=</span>passphrase <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  -o <span class="nv">keylocation</span><span class="o">=</span>file:///root/zfs.key tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p>El archivo de la key <strong>no</strong> va en el dataset cifrado. USB, TPM o un path en otro pool.</p>
<h2 id="cargar-la-key-al-boot">Cargar la key al boot</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs load-key tank/encrypted
</span></span><span class="line"><span class="cl">zfs mount tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p>Sin <code>load-key</code>, el dataset existe y <code>zfs list</code> lo muestra, pero no monta.</p>
<h2 id="recibir-un-dataset-claro-como-cifrado">Recibir un dataset claro como cifrado</h2>
<p>En el <strong>primer</strong> <code>recv</code>, puedes fijar propiedades de cifrado:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs send tank/test@snap1 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> zfs recv -o <span class="nv">encryption</span><span class="o">=</span>on -o <span class="nv">keyformat</span><span class="o">=</span>passphrase <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      -o <span class="nv">keylocation</span><span class="o">=</span>file:///path/to/keyfile tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p>Eso es un receive <strong>sin</strong> <code>-w</code>. <code>-w</code> (raw) copia el wrapping key del origen: solo aplica si el origen ya estaba cifrado. Detalle en <a href="/es/posts/zfs/send-sin-cifrar-a-cifrado/">send de dataset sin cifrar a cifrado</a>.</p>
<h2 id="rotar-passphrase-openzfs">Rotar passphrase (OpenZFS)</h2>
<p>En <strong>Solaris</strong> el comando era <code>zfs key -c</code>. En <strong>OpenZFS / Linux / TrueNAS</strong>:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs change-key tank/encrypted
</span></span><span class="line"><span class="cl">zfs get keyformat,keylocation,keystatus tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p>Keyfile nueva:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs change-key -o <span class="nv">keylocation</span><span class="o">=</span>file:///media/stick/key tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>rekey</code> de wrapping key (no re-cifra todos los bloques; rota la key que envuelve las master keys) es <code>zfs change-key -i</code> según versión — lee <code>zfs change-key</code> de <strong>tu</strong> man page antes de usarlo en producción.</p>
<p>Ver también: <a href="/es/posts/zfs/hold-proteger-snapshot/">hold de snapshots</a>, <a href="/es/posts/zfs/backups-s3/">backups fuera del host</a>.</p>
]]></content:encoded></item><item><title>Enviar snapshots ZFS a otro host (y de ahí a S3)</title><link>https://inet.sh/es/posts/zfs/backups-s3/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/backups-s3/</guid><description>zfs send -w -R -i por SSH a zfs recv -s, y cómo aterrizar el mismo stream en S3. Incremental, raw, resumible.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><code>zfs send -w -R -i</code> por SSH a <code>zfs recv -s</code>. El stream no es tar; S3 es el paso extra si lo necesitas.</p>
<p><code>zfs send</code> produce un <strong>stream replicable</strong>, no un directorio. El destino natural es otro pool (<code>zfs recv</code>). S3 es un segundo salto: guardas el stream como objeto, o usas una herramienta tipo <a href="https://github.com/pressly/z3">z3</a>.</p>
<h2 id="incremental-a-otro-host-el-comando-que-uso">Incremental a otro host (el comando que uso)</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs send -w -R -v -i vol1/secure/backups@initial vol1/secure/backups@new <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> ssh root@10.0.0.1 zfs recv -s vol1/secure/backups
</span></span></code></pre></td></tr></table>
</div>
</div><table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Qué hace</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-w</code></td>
          <td>raw: manda el dataset <strong>cifrado como está</strong>. El destino no necesita la key para recibir.</td>
      </tr>
      <tr>
          <td><code>-R</code></td>
          <td>replica propiedades y snapshots hijas</td>
      </tr>
      <tr>
          <td><code>-i @initial @new</code></td>
          <td>incremental desde <code>@initial</code> (tiene que existir en origen <strong>y</strong> destino)</td>
      </tr>
      <tr>
          <td><code>-v</code></td>
          <td>progreso</td>
      </tr>
      <tr>
          <td><code>recv -s</code></td>
          <td><strong>resumible</strong> si se corta el SSH (<code>zfs restart</code> / <code>recv -s</code> otra vez)</td>
      </tr>
  </tbody>
</table>
<p>Pon un <a href="/es/posts/zfs/hold-proteger-snapshot/">hold</a> en <code>@initial</code> y <code>@new</code> mientras corre el send, o el prune te rompe la cadena.</p>
<p>El primer full (sin <code>-i</code>) es obligatorio una vez:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs send -w -R -v vol1/secure/backups@initial <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> ssh root@10.0.0.1 zfs recv -s vol1/secure/backups
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="aterrizar-en-s3">Aterrizar en S3</h2>
<p>Mismo stream, otro lado del pipe:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs send -w -R vol1/secure/backups@new <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> gzip -1 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> aws s3 cp - s3://mi-bucket/zfs/backups@new.zfs.gz
</span></span></code></pre></td></tr></table>
</div>
</div><p>Restaurar:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">aws s3 cp s3://mi-bucket/zfs/backups@new.zfs.gz - <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> gunzip <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> zfs recv -s vol1/secure/backups
</span></span></code></pre></td></tr></table>
</div>
</div><p>Esto <strong>no</strong> es un sync de archivos. Es un blob opaco: o recuperas el stream entero (o el incremental encima del full), o no recuperas nada. Versiona los nombres <code>@initial</code>, <code>@new</code> y no borres el full.</p>
<p>Para incrementales en S3, herramientas como z3 llevan el catálogo de qué snapshot ya subió. Un <code>aws s3 cp -</code> crudo no sabe de eso.</p>
<p><code>-w</code> en S3 es correcto si el dataset ya está cifrado: Amazon no ve plaintext. Si el origen <strong>no</strong> está cifrado, o cifras en recv (<a href="/es/posts/zfs/send-sin-cifrar-a-cifrado/">artículo</a>) o cifras el objeto (KMS / cliente) — el stream en claro en un bucket es un backup en claro.</p>
<p>Ver también: <a href="/es/posts/zfs/cifrado/">cifrado nativo</a>.</p>
]]></content:encoded></item><item><title>Exportar un ZVOL de ZFS a un archivo RAW</title><link>https://inet.sh/es/posts/zfs/exportar-zvol-raw/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/exportar-zvol-raw/</guid><description>dd if=/dev/zvol/pool/volume of=file.raw para sacar un RAW de un ZVOL (discos de VM en Proxmox) y cuándo usar qemu-img.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>ZVOL = block device: <code>dd if=/dev/zvol/pool/vol of=vm.raw</code>. Snapshot primero si la VM está up.</p>
<p>En Proxmox un disco de VM en ZFS es un <strong>ZVOL</strong> (<code>rpool/data/vm-101-disk-0</code>), no un archivo. Para copiarlo a otro hypervisor o a un USB, sacas un RAW.</p>
<p>Hilo: <a href="https://forum.proxmox.com/threads/import-convert-export-raw-images-to-zfs-volume.21241/">Import/convert/export RAW images to ZFS volume</a>.</p>
<h2 id="snapshot-y-dd">Snapshot y dd</h2>
<p>Si la VM está encendida, congela el disco con un snapshot y lee el snap (el ZVOL <code>@snap</code> aparece bajo <code>/dev/zvol/…</code>):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs snapshot rpool/data/vm-101-disk-0@export
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0@export <span class="nv">of</span><span class="o">=</span>/mnt/backup/vm-101.raw <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span><span class="line"><span class="cl">zfs destroy rpool/data/vm-101-disk-0@export
</span></span></code></pre></td></tr></table>
</div>
</div><p>VM apagada, puedes leer el zvol vivo:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0 <span class="nv">of</span><span class="o">=</span>/mnt/backup/vm-101.raw <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>bs=1M</code> (o <code>1m</code> en dd GNU) importa: el default de 512 B es eterno.</p>
<h2 id="qemu-img-qcow2--vmdk">qemu-img (qcow2 / vmdk)</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">qemu-img convert -p -f raw -O qcow2 /mnt/backup/vm-101.raw /mnt/backup/vm-101.qcow2
</span></span></code></pre></td></tr></table>
</div>
</div><p>O directo desde el zvol:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">qemu-img convert -p -f raw -O qcow2 /dev/zvol/rpool/data/vm-101-disk-0 vm-101.qcow2
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="el-otro-sentido-raw--zvol">El otro sentido (RAW → ZVOL)</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs create -s -V 32G rpool/data/vm-101-disk-0
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>file.raw <span class="nv">of</span><span class="o">=</span>/dev/zvol/rpool/data/vm-101-disk-0 <span class="nv">bs</span><span class="o">=</span>1M <span class="nv">status</span><span class="o">=</span>progress
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-s</code> = sparse. El RAW no puede ser más grande que el zvol.</p>
<p>Ver también: <a href="/es/posts/zfs/comandos-basicos/">comandos básicos</a>.</p>
]]></content:encoded></item><item><title>Importar un pool ZFS después de un apagón</title><link>https://inet.sh/es/posts/zfs/importar-pool-despues-apagado/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/importar-pool-despues-apagado/</guid><description>zpool import -F y zpool import -f para importar un pool ZFS sucio después de un corte de luz, y scrub para verificar.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Pool no importa tras apagón: <code>zpool import -f</code>, si hace falta <code>-F</code> (rewind txgs), luego <code>zpool scrub</code>.</p>
<p>Tras un corte de luz el pool a menudo <strong>existe</strong> en los discos pero <code>zpool status</code> no lo muestra: quedó exportado sucio o el host arrancó sin él. No hagas <code>zpool create</code> sobre esos discos.</p>
<h2 id="ver-qué-hay">Ver qué hay</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool import
</span></span></code></pre></td></tr></table>
</div>
</div><p>Lista pools importables con su nombre (<code>VOL1</code> en el ejemplo) y si están <code>FAULTED</code> / <code>UNAVAIL</code>.</p>
<h2 id="importar">Importar</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool import -f VOL1
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-f</code> = “sé que puede estar importado en otro host”. Es el caso típico después de un crash: ZFS cree que el otro lado todavía lo tiene.</p>
<p>Si <code>-f</code> no basta porque las últimas txgs quedaron a medias:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool import -F VOL1
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-F</code> <strong>rebobina</strong> a un txg anterior consistente. Puedes perder los segundos de writes del apagón. Es preferible a un pool que no monta.</p>
<p><code>-n</code> simula:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool import -F -n VOL1
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="después-scrub">Después: scrub</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool scrub VOL1
</span></span><span class="line"><span class="cl">zpool status VOL1
</span></span></code></pre></td></tr></table>
</div>
</div><p>El scrub confirma que el rewind no dejó checksum errors. Déjalo terminar antes de borrar snapshots “por si acaso”.</p>
<h2 id="qué-no-hacer">Qué no hacer</h2>
<ul>
<li><code>zpool create</code> sobre los mismos <code>sdX</code> destruye las etiquetas.</li>
<li><code>-F</code> no es el primer recurso: prueba <code>-f</code> primero.</li>
<li>Si el pool es raíz (<code>rpool</code> / <code>bpool</code> de Proxmox), importa desde un live USB, no desde el sistema que no arranca.</li>
</ul>
<p>Ver también: <a href="/es/posts/zfs/reemplazar-discos/">reemplazar discos</a>, <a href="/es/posts/zfs/comandos-basicos/">comandos básicos</a>.</p>
]]></content:encoded></item><item><title>Proteger snapshots ZFS con hold para que no las borren</title><link>https://inet.sh/es/posts/zfs/hold-proteger-snapshot/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/hold-proteger-snapshot/</guid><description>zfs hold y zfs release: un tag keep en el snapshot hace que zfs destroy falle con dataset is busy.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><code>zfs hold keep pool/dataset@snap</code> — <code>zfs destroy</code> falla con <em>dataset is busy</em>. Suelta con <code>zfs release</code>.</p>
<p>Los scripts de retención (<code>zfs destroy -r …@auto-…</code>) no preguntan. Un <strong>hold</strong> es un candado con nombre sobre un snapshot: <code>destroy</code> falla hasta que sueltas el tag.</p>
<p>Sirve para la snapshot desde la que estás haciendo <code>zfs send</code>, o para la que es el único rollback conocido después de un upgrade.</p>
<h2 id="poner-el-hold">Poner el hold</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs hold keep tank/home/cindys@snap1
</span></span></code></pre></td></tr></table>
</div>
</div><p>Recursivo en todo un árbol (primero snapshot, luego hold):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs snapshot -r tank/home@now
</span></span><span class="line"><span class="cl">zfs hold -r keep tank/home@now
</span></span></code></pre></td></tr></table>
</div>
</div><p>El tag (<code>keep</code>) es libre, pero <strong>único por snapshot</strong>. Puedes tener <code>keep</code> y <code>offsite</code> a la vez en el mismo <code>@now</code>.</p>
<h2 id="qué-ves-al-destruir">Qué ves al destruir</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs destroy tank/home/cindys@snap1
</span></span><span class="line"><span class="cl"><span class="c1"># cannot destroy &#39;tank/home/cindys@snap1&#39;: dataset is busy</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Eso es el hold, no un dataset montado. <code>zfs destroy -d</code> marca el snapshot para borrar <strong>cuando</strong> no queden holds (diferido), no lo ignora.</p>
<h2 id="listar">Listar</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs holds tank/home@now
</span></span><span class="line"><span class="cl">zfs holds -r tank/home@now
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">NAME                  TAG   TIMESTAMP
</span></span><span class="line"><span class="cl">tank/home@now         keep  Thu Jul 15 11:25:39 2010
</span></span><span class="line"><span class="cl">tank/home/cindys@now  keep  Thu Jul 15 11:25:39 2010
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="soltar-y-entonces-sí-destruir">Soltar y entonces sí destruir</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs release -r keep tank/home@now
</span></span><span class="line"><span class="cl">zfs destroy -r tank/home@now
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si un <code>send</code> largo sigue corriendo, espera a que termine: el hold está precisamente para que el prune no te coma el cursor incremental.</p>
<p>Docs de Oracle (el mecanismo es el mismo en OpenZFS): <a href="https://docs.oracle.com/cd/E19253-01/819-5461/gjdfk/index.html">Holding ZFS snapshots</a>.</p>
<p>Ver también: <a href="/es/posts/zfs/send-sin-cifrar-a-cifrado/">send a dataset cifrado</a>.</p>
]]></content:encoded></item><item><title>Reemplazar un disco en un pool ZFS</title><link>https://inet.sh/es/posts/zfs/reemplazar-discos/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/reemplazar-discos/</guid><description>zpool replace -f para cambiar un disco OFFLINE o por GUID en ZFS on Linux / Proxmox, y esperar el resilver.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Disco OFFLINE: <code>zpool replace -f &lt;GUID&gt; /dev/disk/by-id/…</code> — el GUID lo da <code>zpool status</code>, no <code>/dev/sdX</code>.</p>
<p>Proxmox documenta el caso: <a href="https://pve.proxmox.com/wiki/ZFS_on_Linux#sysadmin_zfs_change_failed_dev">ZFS on Linux — change a failed device</a>. El síntoma es un vdev <code>OFFLINE</code> / <code>FAULTED</code> y un número largo en vez de <code>sde</code>.</p>
<h2 id="estado">Estado</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool status vol1
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ejemplo: el miembro muerto aparece como GUID:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1894156996840098641  OFFLINE
</span></span></code></pre></td></tr></table>
</div>
</div><p>Eso pasa cuando el kernel ya no tiene <code>/dev/sdX</code> para ese disco (lo arrancaste, se fue, o cambió de letra).</p>
<h2 id="replace">Replace</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool replace -f vol1 <span class="m">1894156996840098641</span> /dev/disk/by-id/ata-NEWDISK
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-f</code> fuerza si ZFS todavía “recuerda” el disco viejo. El destino debe ser <strong>al menos</strong> del mismo tamaño (mejor, by-id, no <code>sde</code>).</p>
<p>Si el disco nuevo <strong>es</strong> el mismo slot y ZFS lo ve:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool replace vol1 /dev/disk/by-id/ata-OLDDISK /dev/disk/by-id/ata-NEWDISK
</span></span></code></pre></td></tr></table>
</div>
</div><p>o, autodetect del recambio en el mismo sitio:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool replace vol1 /dev/disk/by-id/ata-OLDDISK
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="esperar-el-resilver">Esperar el resilver</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool status vol1
</span></span><span class="line"><span class="cl">watch -n <span class="m">5</span> zpool status vol1
</span></span></code></pre></td></tr></table>
</div>
</div><p>No apagues el host, no exportes el pool, no hagas otro replace en el mismo vdev hasta <code>resilvered</code>. En RAIDZ1 estás un disco abajo: un segundo fallo en ese periodo es pérdida.</p>
<h2 id="después">Después</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool detach vol1 <span class="m">1894156996840098641</span>   <span class="c1"># solo si quedó como spare/old y status lo pide</span>
</span></span><span class="line"><span class="cl">zpool labelclear /dev/sdOLD             <span class="c1"># si reusas el disco viejo en otra máquina</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Ver también: <a href="/es/posts/zfs/importar-pool-despues-apagado/">import después de apagón</a>.</p>
]]></content:encoded></item><item><title>zfs send/recv de un dataset sin cifrar a uno cifrado</title><link>https://inet.sh/es/posts/zfs/send-sin-cifrar-a-cifrado/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/send-sin-cifrar-a-cifrado/</guid><description>Migrar un dataset ZFS en claro a uno cifrado con zfs send | zfs recv -o encryption=on en el receive inicial.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Primer <code>recv</code> con <code>-o encryption=on</code> (sin <code>-w</code>). El dataset destino debe existir con nombre.</p>
<p>Quieres el mismo contenido, otra key. El origen sigue en claro; el destino nace cifrado. OpenZFS lo permite <strong>solo en el receive inicial</strong> (dataset que todavía no existe).</p>
<p>Hilo de origen: <a href="https://www.reddit.com/r/zfs/comments/mus2gn/zfs_sendreceive_from_enencrypted_dataset_to/">r/zfs</a>.</p>
<h2 id="comando">Comando</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs snapshot tank/test@snap1
</span></span><span class="line"><span class="cl">zfs send tank/test@snap1 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> zfs recv -o <span class="nv">encryption</span><span class="o">=</span>on <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      -o <span class="nv">keyformat</span><span class="o">=</span>passphrase <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      -o <span class="nv">keylocation</span><span class="o">=</span>file:///path/to/keyfile <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>      tank/encrypted
</span></span></code></pre></td></tr></table>
</div>
</div><p>Notas que rompen el send si se omiten:</p>
<ol>
<li><strong>No uses <code>-w</code>.</strong> Raw send reproduce el estado de cifrado del origen. Origen en claro → destino en claro, y los <code>-o encryption=…</code> se ignoran o fallan.</li>
<li><strong>Pon el nombre del dataset destino</strong> (<code>tank/encrypted</code>). Un <code>recv</code> sin destino no crea el dataset.</li>
<li><strong>Passphrase vs file:</strong> <code>keylocation=prompt</code> no funciona bien al otro lado de un pipe no interactivo. Keyfile o <code>keylocation=file://</code>.</li>
<li>Los incrementales siguientes (<code>-i</code>) <strong>heredan</strong> el cifrado. No vuelvas a pasar <code>-o encryption=on</code>.</li>
</ol>
<h2 id="comprobar">Comprobar</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs get encryption,keystatus,keyformat tank/encrypted
</span></span><span class="line"><span class="cl">zfs load-key tank/encrypted   <span class="c1"># si keystatus=unavailable</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="el-otro-sentido">El otro sentido</h2>
<p>Cifrado → cifrado con la <strong>misma</strong> wrapping key: <code>zfs send -w</code>. Cifrado → otro key wrapping: send <strong>sin</strong> <code>-w</code> (ZFS descifra al enviar; el recv vuelve a cifrar). Eso exige <code>load-key</code> en el origen y es más lento.</p>
<p>Ver también: <a href="/es/posts/zfs/cifrado/">cifrado nativo</a>.</p>
]]></content:encoded></item><item><title>ZFS: cheat sheet de comandos (pool, compression, cache, log)</title><link>https://inet.sh/es/posts/zfs/comandos-basicos/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/comandos-basicos/</guid><description>Cheat sheet de ZFS: zpool create raidz, export/import, compression lz4, L2ARC, SLOG, labelclear y destroy.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Cheat sheet: <code>zpool create</code>, export/import, <code>lz4</code>, L2ARC, SLOG, <code>labelclear</code>, destroy — lo de las 2 a.m.</p>
<p>Referencia corta. Los procedimientos largos están enlazados al final.</p>
<h2 id="pool">Pool</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool create vol1 raidz sda sdb sdc
</span></span><span class="line"><span class="cl">zpool status vol1
</span></span><span class="line"><span class="cl">zpool <span class="nb">export</span> vol1
</span></span><span class="line"><span class="cl">zpool import -f vol1
</span></span><span class="line"><span class="cl">zpool destroy tank          <span class="c1"># irreversible</span>
</span></span><span class="line"><span class="cl">zpool labelclear ada0       <span class="c1"># limpia etiquetas ZFS de un disco suelto</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>raidz</code> aquí es RAIDZ1 (una paridad). Para dos: <code>raidz2</code>. Identifica discos por <code>/dev/disk/by-id/…</code>, no por <code>sdX</code> que se reordenan.</p>
<h2 id="mountpoint">Mountpoint</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs unmount vol1
</span></span><span class="line"><span class="cl">zfs <span class="nb">set</span> <span class="nv">mountpoint</span><span class="o">=</span>/mnt/vol1 vol1
</span></span><span class="line"><span class="cl">zfs mount vol1
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="l2arc-cache-y-slog-zil">L2ARC (cache) y SLOG (ZIL)</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zpool add vol1 cache &lt;disk-id&gt;
</span></span><span class="line"><span class="cl">zpool add vol1 log &lt;disk-id&gt;
</span></span><span class="line"><span class="cl">zpool add vol1 log mirror &lt;disk-id-a&gt; &lt;disk-id-b&gt;
</span></span><span class="line"><span class="cl">zpool remove vol1 &lt;device&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>Cache = lecturas calientes. Log = sync writes (NFS, VMs). Un SLOG USB “rápido” es peor que no tener SLOG: si muere a mitad de un txg, duele. Espeja el log.</p>
<h2 id="compression">Compression</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">zfs <span class="nb">set</span> <span class="nv">compression</span><span class="o">=</span>lz4 newvol
</span></span><span class="line"><span class="cl">zfs <span class="nb">set</span> <span class="nv">compression</span><span class="o">=</span>off newvol
</span></span><span class="line"><span class="cl">zfs get compressratio newvol
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>lz4</code> es el default razonable en OpenZFS moderno. <code>zstd</code> comprime más y cuesta CPU. La propiedad se hereda a datasets hijos que no la pisen.</p>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="/es/posts/zfs/importar-pool-despues-apagado/">Importar después de un apagón</a></li>
<li><a href="/es/posts/zfs/reemplazar-discos/">Reemplazar discos</a></li>
<li><a href="/es/posts/zfs/cifrado/">Cifrado nativo</a></li>
</ul>
]]></content:encoded></item></channel></rss>