<?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>Recv on inetshell</title><link>https://inet.sh/es/tags/recv/</link><description>Recent content in Recv on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Sat, 26 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/recv/index.xml" rel="self" type="application/rss+xml"/><item><title>ZFS: reanudar un zfs send | zfs recv interrumpido (receive_resume_token)</title><link>https://inet.sh/es/posts/zfs/reanudar-zfs-send-recv/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/zfs/reanudar-zfs-send-recv/</guid><description>Un zfs send de varios TB que se corta a mitad no tiene por qué empezar de cero: con zfs recv -s el receptor guarda el estado parcial y publica receive_resume_token; zfs send -t &amp;lt;token&amp;gt; retoma exactamente donde iba, también en envíos incrementales y raw (-w). Cómo se usa, cómo abortar con zfs recv -A y qué invalida el token.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</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><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</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"><span class="c1"># Receptor preparado para reanudar: -s en el recv</span>
</span></span><span class="line"><span class="cl">zfs send -v -w tank/data@snap1 <span class="p">|</span> ssh backup-host zfs recv -s backup/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Se cortó. En el receptor, pide el token:</span>
</span></span><span class="line"><span class="cl">zfs get -H -o value receive_resume_token backup/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># En el emisor, retoma desde ese punto (sin nombrar dataset ni snapshot: el token lo lleva todo):</span>
</span></span><span class="line"><span class="cl">zfs send -v -t 1-d4f61d893-c0-789c636064000310a500c4ec50360710e72765a5… <span class="p">|</span> ssh backup-host zfs recv -s backup/data
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rendirse y liberar lo recibido a medias:</span>
</span></span><span class="line"><span class="cl">zfs recv -A backup/data
</span></span></code></pre></td></tr></table>
</div>
</div><p>Funciona igual con envíos incrementales (<code>-i</code> / <code>-I</code>) y con envíos raw de datasets cifrados (<code>-w</code>).</p>
<h2 id="por-qué">Por qué</h2>
<p>Sin <code>-s</code>, un <code>zfs recv</code> interrumpido descarta todo lo que había recibido: horas de transferencia a la basura por un corte de red o un reinicio. Con <code>-s</code> (OpenZFS desde 2017; Linux 0.7+, FreeBSD 12+) el receptor conserva el trozo recibido en un dataset oculto (<code>backup/data/%recv</code>) y expone la propiedad <strong><code>receive_resume_token</code></strong>.</p>
<p>El token es la descripción completa de lo que falta: identifica el snapshot origen, el objeto y el offset donde se quedó, y las opciones del stream (raw, comprimido, bloques grandes…). Por eso <code>zfs send -t</code> no necesita más argumentos y por eso no hace falta acordarse de qué flags llevaba el <code>send</code> original: se reconstruyen desde el token.</p>
<h2 id="paso-a-paso">Paso a paso</h2>
<ol>
<li>
<p><strong>Recibe siempre con <code>-s</code>.</strong> No cuesta nada y es lo único que hay que recordar antes del corte.</p>
</li>
<li>
<p><strong>Tras la interrupción</strong>, en el receptor:</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 get -H -o value receive_resume_token backup/data
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si devuelve <code>-</code>, no hay estado parcial (el envío terminó o nunca empezó).</p>
</li>
<li>
<p><strong>En el emisor</strong>, <code>zfs send -t &lt;token&gt;</code> con la misma tubería de siempre hacia <code>zfs recv -s</code>. Puedes cortarlo y retomarlo tantas veces como haga falta; cada vez el token cambia.</p>
</li>
<li>
<p><strong>Comprueba el final</strong>: <code>zfs get receive_resume_token</code> vuelve a <code>-</code> y el snapshot aparece en <code>zfs list -t snapshot -r backup/data</code>.</p>
</li>
</ol>
<p>Para ver el progreso, <code>-v</code> en el <code>send</code> (bytes enviados) o <code>pv</code> en medio; para amortiguar latencia en enlaces lentos, <code>mbuffer</code> entre <code>send</code> y <code>ssh</code>.</p>
<h2 id="abortar">Abortar</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 recv -A backup/data
</span></span></code></pre></td></tr></table>
</div>
</div><p>Borra el <code>%recv</code> y libera el espacio. Necesario cuando el token ya no sirve (abajo) o cuando decides reenviar desde otro snapshot.</p>
<h2 id="con-syncoid">Con syncoid</h2>
<p><code>syncoid</code> usa <code>recv -s</code> y los tokens por su cuenta: si un envío se corta, la siguiente ejecución lo retoma sola. <code>--no-resume</code> lo desactiva si alguna vez estorba. Sanoid + syncoid son la forma cómoda de hacer esto en producción.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>Destruir el snapshot origen invalida el token.</strong> Si tu política de snapshots (o <code>zfs destroy</code> a mano) se lleva <code>@snap1</code> a medio envío, el <code>send -t</code> falla: <code>zfs recv -A</code> y empieza desde un snapshot que exista. Un <a href="/es/posts/zfs/hold-proteger-snapshot/"><code>hold</code></a> sobre el snapshot que estás enviando evita el problema.</li>
<li><strong>Los dos extremos tienen que soportarlo</strong>: OpenZFS moderno en ambos. Solaris e Illumos antiguos no entienden <code>-s</code>.</li>
<li><strong><code>-w</code> se conserva en el token</strong>: un envío raw reanudado sigue siendo raw; no intentes mezclar un <code>send -t</code> con un <code>recv</code> de destino distinto del original.</li>
<li><strong>Mientras hay estado parcial</strong>, <code>zfs destroy</code> del dataset destino se queja: primero <code>recv -A</code>.</li>
<li><strong>Streams <code>-R</code></strong> (paquetes con varios snapshots) también se reanudan, pero es más simple enviar snapshot por snapshot con <code>-i</code>, que es lo que hace syncoid.</li>
</ul>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="/es/posts/zfs/backups-s3/">Enviar snapshots ZFS a otro host (y de ahí a S3)</a></li>
<li><a href="/es/posts/zfs/send-sin-cifrar-a-cifrado/">zfs send/recv de un dataset sin cifrar a uno cifrado</a></li>
<li><a href="/es/posts/zfs/hold-proteger-snapshot/">Proteger snapshots con hold</a></li>
</ul>
]]></content:encoded></item></channel></rss>