<?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>Inicio on inetshell</title><link>https://inet.sh/es/</link><description>Recent content in Inicio on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Thu, 20 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/index.xml" rel="self" type="application/rss+xml"/><item><title>Acerca</title><link>https://inet.sh/es/acerca/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/acerca/</guid><description>Quién soy, contacto y redes.</description><content:encoded><![CDATA[<h2 id="bio">Bio</h2>
<p><em>(Borrador — biografía corta pendiente.)</em></p>
<h2 id="contacto">Contacto</h2>
<ul>
<li>Email personal: <a class="obfuscated-email" data-e="bWVAaW5ldHNoZWxsLm14" href="#" rel="nofollow" title="email">me [at] inetshell [dot] mx</a>
</li>
<li>Email profesional: <a class="obfuscated-email" data-e="bWVAaW5ldC5zaA==" href="#" rel="nofollow" title="email">me [at] inet [dot] sh</a>
</li>
<li>GPG/PGP: TBD</li>
</ul>
<h2 id="redes-sociales">Redes Sociales</h2>
<p>Los iconos debajo enlazan a las mismas cuentas.</p>
]]></content:encoded></item><item><title>CV</title><link>https://inet.sh/es/cv/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/cv/</guid><description>Currículum y conocimientos — borrador.</description><content:encoded><![CDATA[<h2 id="conocimientos">Conocimientos</h2>
<ul>
<li>Kubernetes</li>
<li>Linux</li>
<li>AWS</li>
<li>GCP</li>
</ul>
]]></content:encoded></item><item><title>Equivalente de netcat en Windows: Test-NetConnection</title><link>https://inet.sh/es/posts/windows/equivalente-netcat/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/windows/equivalente-netcat/</guid><description>El equivalente de nc -v host puerto en Windows es Test-NetConnection (tnc): prueba si un puerto TCP acepta conexión. TcpTestSucceeded True/False.</description><content:encoded><![CDATA[<p>En Linux el reflejo para “¿está abierto el 1433?” es:</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">nc -v 10.1.1.1 <span class="m">1433</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>En <strong>Windows</strong> no hay <code>nc</code> de serie. El equivalente más cercano en PowerShell es probar si el puerto TCP acepta conexión:</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-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Test-NetConnection</span> <span class="n">-ComputerName</span> <span class="mf">10.1</span><span class="p">.</span><span class="py">1</span><span class="p">.</span><span class="py">1</span> <span class="n">-Port</span> <span class="mf">1433</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Alias corto:</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-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">tnc</span> <span class="mf">10.1</span><span class="p">.</span><span class="py">1</span><span class="p">.</span><span class="py">1</span> <span class="n">-Port</span> <span class="mf">1433</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="qué-mirar">Qué mirar</h2>
<p><code>TcpTestSucceeded</code>:</p>
<table>
  <thead>
      <tr>
          <th>Valor</th>
          <th>Significado</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>True</code></td>
          <td>El puerto está abierto y responde (como cuando <code>nc</code> conectó)</td>
      </tr>
      <tr>
          <td><code>False</code></td>
          <td>No hay conexión (firewall, servicio caído, IP inalcanzable)</td>
      </tr>
  </tbody>
</table>
<p>Más detalle, al estilo <code>nc -v</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Test-NetConnection</span> <span class="n">-ComputerName</span> <span class="mf">10.1</span><span class="p">.</span><span class="py">1</span><span class="p">.</span><span class="py">1</span> <span class="n">-Port</span> <span class="mf">1433</span> <span class="n">-InformationLevel</span> <span class="n">Detailed</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="solo-el-puerto-sin-ping">Solo el puerto, sin ping</h2>
<p><code>Test-NetConnection</code> también hace ICMP por defecto. Si solo quieres el TCP:</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-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Test-NetConnection</span> <span class="n">-ComputerName</span> <span class="mf">10.254</span><span class="p">.</span><span class="py">3</span><span class="p">.</span><span class="py">2</span> <span class="n">-Port</span> <span class="mf">1433</span> <span class="n">-WarningAction</span> <span class="n">SilentlyContinue</span> <span class="p">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">Select-Object</span> <span class="n">ComputerName</span><span class="p">,</span> <span class="n">RemoteAddress</span><span class="p">,</span> <span class="n">RemotePort</span><span class="p">,</span> <span class="n">TcpTestSucceeded</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="powershell-muy-viejo">PowerShell muy viejo</h2>
<p>Si <code>Test-NetConnection</code> no existe, el cliente TCP de .NET:</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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$tcp</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="py">Net</span><span class="p">.</span><span class="py">Sockets</span><span class="p">.</span><span class="py">TcpClient</span>
</span></span><span class="line"><span class="cl"><span class="k">try</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$tcp</span><span class="p">.</span><span class="py">Connect</span><span class="p">(</span><span class="s2">&#34;10.254.3.2&#34;</span><span class="p">,</span> <span class="mf">1433</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;Conectado a 10.254.3.2:1433&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">catch</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Write-Host</span> <span class="s2">&#34;Fallo: </span><span class="p">$(</span><span class="nv">$_</span><span class="p">.</span><span class="py">Exception</span><span class="p">.</span><span class="n">Message</span><span class="p">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$tcp</span><span class="p">.</span><span class="py">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded></item><item><title>Mover los datos de k3s a otro disco</title><link>https://inet.sh/es/posts/k3s/migrar-datos/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/k3s/migrar-datos/</guid><description>Cómo mover /var/lib/rancher, los pods de kubelet y /run/k3s a otro disco o partición: stop, mv, symlink, start. Trampas de /run (tmpfs) y alternativa --data-dir.</description><content:encoded><![CDATA[<p>k3s deja estado en el disco del sistema. Si se llena <code>/</code> o quieres un disco más rápido, el procedimiento corto es: <strong>parar → <code>mv</code> → symlink → arrancar</strong>.</p>
<p>El destino (<code>/datadrive</code> aquí) tiene que existir y estar montado <strong>antes</strong>. Root o sudo.</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">sudo systemctl stop k3s
</span></span><span class="line"><span class="cl">sudo systemctl stop k3s-agent   <span class="c1"># solo si este nodo es agent</span>
</span></span><span class="line"><span class="cl">sudo /usr/local/bin/k3s-killall.sh
</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-shell" data-lang="shell"><span class="line"><span class="cl">sudo mv /run/k3s/ /datadrive/k3s/
</span></span><span class="line"><span class="cl">sudo mv /var/lib/kubelet/pods/ /datadrive/k3s-pods/
</span></span><span class="line"><span class="cl">sudo mv /var/lib/rancher/ /datadrive/k3s-rancher/
</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-shell" data-lang="shell"><span class="line"><span class="cl">sudo ln -s /datadrive/k3s/ /run/k3s
</span></span><span class="line"><span class="cl">sudo ln -s /datadrive/k3s-pods/ /var/lib/kubelet/pods
</span></span><span class="line"><span class="cl">sudo ln -s /datadrive/k3s-rancher/ /var/lib/rancher
</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo systemctl start k3s
</span></span><span class="line"><span class="cl">sudo systemctl start k3s-agent   <span class="c1"># solo en agents</span>
</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl get nodes
</span></span><span class="line"><span class="cl">kubectl get pods -A
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="qué-se-mueve">Qué se mueve</h2>
<table>
  <thead>
      <tr>
          <th>Origen</th>
          <th>Destino de ejemplo</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>/run/k3s/</code></td>
          <td><code>/datadrive/k3s/</code></td>
      </tr>
      <tr>
          <td><code>/var/lib/kubelet/pods/</code></td>
          <td><code>/datadrive/k3s-pods/</code></td>
      </tr>
      <tr>
          <td><code>/var/lib/rancher/</code></td>
          <td><code>/datadrive/k3s-rancher/</code></td>
      </tr>
  </tbody>
</table>
<p>Ahí vive el estado de trabajo: containerd, manifests, pods. Un <code>mv</code> a medias o un start con las rutas vacías rompe el cluster.</p>
<h2 id="trampas">Trampas</h2>
<p><strong><code>/run</code> es tmpfs.</strong> Tras un reboot el symlink <code>/run/k3s</code> desaparece. Recréalo en un unit <code>After=local-fs.target</code> o no muevas <code>/run/k3s</code> y deja el runtime en RAM.</p>
<p><strong><code>k3s-agent</code> no existe en un server-only.</strong> <code>systemctl stop k3s-agent</code> falla; no es un error de la migración.</p>
<p><strong>Crea el padre de los destinos</strong> (<code>mkdir -p /datadrive</code>) y confirma el mount (<code>findmnt /datadrive</code>) <strong>antes</strong> del <code>mv</code>. Un <code>mv</code> a un path que no está montado deja los datos en el disco viejo con otro nombre.</p>
<p><strong>containerd y kubelet a veces no quieren symlink.</strong> Si el node no vuelve Ready, cambia a bind mount en <code>/etc/fstab</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">/</span><span class="n">datadrive</span><span class="o">/</span><span class="n">k3s</span><span class="o">-</span><span class="n">rancher</span>  <span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">rancher</span>  <span class="n">none</span>  <span class="n">bind</span>  <span class="mi">0</span>  <span class="mi">0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="alternativa-más-limpia---data-dir">Alternativa más limpia: <code>--data-dir</code></h2>
<p>El path “oficial” de k3s es <code>--data-dir</code> (<code>/var/lib/rancher/k3s</code> por defecto). En un nodo <strong>nuevo</strong>, instala con el data-dir ya en el disco grande. En uno <strong>existente</strong>, el <code>mv</code> + symlink (o bind) de <code>/var/lib/rancher</code> es el atajo; no reescribas el unit a ciegas a mitad de un cluster.</p>
<p>Guía que documenta este <code>mv</code> + symlink: <a href="https://devopskit.tech/en/posts/migrate-k3s-data/">How to Move K3s Data to a New Location</a>.</p>
]]></content:encoded></item><item><title>Navegar la web moderna en Windows XP y Server 2003</title><link>https://inet.sh/es/posts/windows/navegador-moderno-xp-2003/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/windows/navegador-moderno-xp-2003/</guid><description>Cómo abrir sitios HTTPS actuales en Windows XP SP3 o Server 2003 SP2 cuando Chrome, Firefox e IE ya no sirven: Supermium, un Chromium para sistemas legacy.</description><content:encoded><![CDATA[<p>Microsoft dejó de dar soporte a <strong>Windows XP</strong> en abril de 2014 y a <strong>Windows Server 2003 / 2003 R2</strong> en julio de 2015. Desde entonces no hay parches oficiales, no hay actualizaciones de Schannel/TLS y casi ningún fabricante prueba software contra esas plataformas.</p>
<p>El efecto práctico: <strong>ya no puedes “abrir Internet Explorer y listo”</strong>. IE 8 habla TLS 1.0 (a lo sumo 1.2 con hacks frágiles). <strong>Google Chrome</strong> dejó de soportar XP/Vista hace años; los instaladores actuales ni arrancan. <strong>Mozilla Firefox</strong> también abandonó XP (el último canal usable fue ESR antiguo). Los sitios bancarios, GitHub, paneles cloud y casi cualquier SaaS exigen TLS 1.2+ y HTTP/2 o Chromium reciente. El resultado en un ProLiant o un lab con 2003: el navegador muestra certificados inválidos, páginas en blanco o “esta página no se puede mostrar”.</p>
<p>Si aún tienes que operar un host legacy (firmware, SCADA, licencia de software, laboratorio), necesitas un navegador <strong>moderno</strong> que compile para Win32 viejo. La opción que funciona en lab: <strong><a href="https://www.win32subsystem.live/supermium/">Supermium</a></strong>.</p>
<h2 id="qué-es-supermium">Qué es Supermium</h2>
<p>Es un fork de <strong>Chromium</strong> mantenido para Windows XP SP3, Server 2003 SP2, Vista, 7, 8.x y versiones nuevas. Se comporta como un drop-in de Chrome (extensiones, <code>chrome://flags</code>, sandbox) pero sigue empaquetando builds 32-bit con SSE2 para CPUs de esa época.</p>
<p>Requisitos oficiales (resumen):</p>
<ul>
<li>Windows XP SP3 <strong>o</strong> Server 2003 SP2 (o posterior)</li>
<li>CPU con <strong>SSE2</strong> (Pentium 4 en adelante; dual-core recomendado)</li>
<li>≥ 768 MB RAM (2 GB+ para que no se sienta a pedales)</li>
</ul>
<p>Descargas: <a href="https://www.win32subsystem.live/supermium/">win32subsystem.live/supermium</a> — instaladores 32-bit y 64-bit.</p>
<h2 id="instalación-rápida">Instalación rápida</h2>
<ol>
<li>En una máquina <strong>con Internet moderno</strong>, descarga el Setup 32-bit (casi todo XP/2003 de lab es x86) o 64-bit si el OS es x64.</li>
<li>Copia el instalador al host legacy (USB, SMB, iLO virtual media).</li>
<li>Instala como administrador. Acepta el UAC/legacy prompts.</li>
<li>Abre Supermium y prueba <code>https://example.com</code> y el sitio que realmente necesitas.</li>
</ol>
<p>Si el instalador no corre: confirma SP3/SP2, SSE2 (<code>coreinfo</code> / ficha de CPU) y que no estés en un Windows 2000 / XP RTM sin service pack.</p>
<h2 id="extensiones-y-privacidad">Extensiones y privacidad</h2>
<p>A diferencia de Chrome actual, Supermium <strong>no tiene fecha de muerte para Manifest V2</strong>. Puedes sideloadear <a href="https://github.com/gorhill/uBlock">uBlock Origin</a> desde GitHub y seguir bloqueando anuncios en un OS que ya no debería tocar la red pública.</p>
<p>También arrastra flags estilo ungoogled-chromium y opciones de UI (Aero, tabs clásicos). Útil; no confíes en eso como “hardening” del sistema operativo.</p>
<h2 id="advertencias-léelas">Advertencias (léelas)</h2>
<ul>
<li><strong>El OS sigue sin parches.</strong> Un navegador nuevo no arregla SMB1, RDP viejo ni vulnerabilidades de kernel. Usa el host solo en VLAN aislada, VPN, o jump host; no lo expongas a Internet.</li>
<li>Supermium reduce el riesgo de <em>sitios</em> rotos por TLS; <strong>no</strong> convierte a XP/2003 en un sistema seguro.</li>
<li>Descarga el binario desde el sitio oficial. Un “Chrome para XP” de un foro random es un vector clásico de malware.</li>
<li>Para trabajo real, el objetivo sigue siendo <strong>migrar</strong> (VM nueva, contenedor, o saltar el servicio a un OS soportado). Esto es un puente, no una estrategia.</li>
</ul>
<h2 id="cuándo-tiene-sentido">Cuándo tiene sentido</h2>
<ul>
<li>Entrar al iLO / iDRAC / panel web de un appliance que solo documentaste en un 2003 de lab.</li>
<li>Bajar un driver o EULA desde un portal que rechaza IE8.</li>
<li>Demostrar un fallo de compatibilidad sin levantar una VM Windows 10 solo para un click.</li>
</ul>
<p>Descarga y docs: <a href="https://www.win32subsystem.live/supermium/">Supermium</a>.</p>
]]></content:encoded></item><item><title>SSH a Windows Server 2003 con Bitvise</title><link>https://inet.sh/es/posts/windows/ssh-server-2003-bitvise/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/windows/ssh-server-2003-bitvise/</guid><description>Cómo exponer SSH en Windows Server 2003 o 2003 R2: OpenSSH de Microsoft no existe ahí; Bitvise SSH Server (7.x en lab) da shell y SFTP.</description><content:encoded><![CDATA[<p><strong>Windows Server 2003 / 2003 R2</strong> no incluye un servidor SSH. Microsoft tampoco publicó <strong>OpenSSH for Windows</strong> para esa generación (eso llegó mucho después, acoplado a Windows 10 / Server 2019+). PowerShell Remoting / WinRM tampoco es el camino: en 2003 el stack remoto usable es RDP, SMB y, si lo instalaste, Telnet.</p>
<p>Si necesitas <code>ssh user@2003-box</code> desde un jump host moderno (scripts, <code>scp</code>, Ansible legacy, copiar logs sin RDP), instala un <strong>SSH server de terceros</strong>. En lab uso <strong><a href="https://bitvise.com/ssh-server-download">Bitvise SSH Server</a></strong>; <strong>7.x</strong> es la línea validada en Server 2003.</p>
<p>Bitvise sigue listando <a href="https://bitvise.com/winsshd">XP SP3 y Server 2003</a> en su matriz de compatibilidad. Para un host sin parches desde 2015, quédate con un instalador <strong>probado</strong> en tu imagen (7.x si ya lo validaste) o prueba el current solo en un clon — no en producción a ciegas.</p>
<h2 id="por-qué-no-otras-opciones">Por qué no otras opciones</h2>
<table>
  <thead>
      <tr>
          <th>Opción</th>
          <th>En Server 2003</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>OpenSSH (Win32-OpenSSH / feature de Windows)</td>
          <td>No</td>
      </tr>
      <tr>
          <td>Cygwin <code>sshd</code></td>
          <td>Posible, frágil y pesado</td>
      </tr>
      <tr>
          <td>FreeSSHd / forks abandonados</td>
          <td>Evítalos (sin mantenimiento, superficie de ataque)</td>
      </tr>
      <tr>
          <td>Solo RDP</td>
          <td>Sirve para GUI; no para automatización por SSH</td>
      </tr>
      <tr>
          <td>Bitvise SSH Server</td>
          <td>Sí — shell + SFTP en Win32 viejo</td>
      </tr>
  </tbody>
</table>
<h2 id="instalación-resumen">Instalación (resumen)</h2>
<ol>
<li>En una máquina con Internet moderno, descarga el instalador desde <a href="https://bitvise.com/ssh-server-download">bitvise.com/ssh-server-download</a> (o el paquete <strong>7.x</strong> que guardaste en el lab).</li>
<li>Verifica la firma digital del <code>.exe</code> (Properties → Digital Signatures → Bitvise).</li>
<li>Copia el instalador al 2003 (USB, SMB, iLO virtual media). <strong>No</strong> lo bajes con IE8 desde un mirror random.</li>
<li>Ejecuta el instalador <strong>como Administrador</strong>.</li>
<li>Reinicia cuando el propio Bitvise lo pida (recomendado tras el primer install, sobre todo si vas a usar auth por llave).</li>
<li>Abre <strong>Bitvise SSH Server Control Panel</strong>, arranca el servicio si no está en Automatic.</li>
</ol>
<p>Guía oficial de install: <a href="https://bitvise.com/getting-started-install-ssh-server">Installing Bitvise SSH Server</a>.</p>
<h2 id="config-mínima-que-no-debes-saltarte">Config mínima que no debes saltarte</h2>
<ul>
<li><strong>Cuentas:</strong> permite solo el/los usuarios Windows que necesitas (o cuentas virtuales de Bitvise). No dejes “everyone with a local account”.</li>
<li><strong>Puerto:</strong> 22 por defecto. Si el host está en una VLAN de management, déjalo; si no, cambia el puerto <strong>y</strong> restringe por firewall / ACL de switch.</li>
<li><strong>Firewall de Windows 2003:</strong> abre TCP/22 (o el puerto que elegiste) para la red de management únicamente.</li>
<li><strong>Auth por llave:</strong> importa la pubkey del jump host; desactiva password auth cuando ya funcione la llave.</li>
<li><strong>SFTP root:</strong> monta solo el path que necesitas (p. ej. <code>D:\logs</code>), no <code>C:\</code>.</li>
</ul>
<p>Desde el cliente:</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">ssh Administrador@192.168.x.x
</span></span><span class="line"><span class="cl"><span class="c1"># o el usuario que habilitaste</span>
</span></span><span class="line"><span class="cl">scp archivo.log Administrador@192.168.x.x:D:/logs/
</span></span></code></pre></td></tr></table>
</div>
</div><p>OpenSSH del cliente moderno habla bien con Bitvise; no hace falta el cliente Bitvise salvo que quieras su GUI.</p>
<h2 id="seguridad-contexto-legacy">Seguridad (contexto legacy)</h2>
<p>El servidor <strong>sigue sin parches de Microsoft</strong>. Abrir SSH mejora la operativa; <strong>aumenta</strong> la superficie de red si el puerto es alcanzable desde más que el jump host.</p>
<ul>
<li>VLAN / firewall: solo la IP del bastion.</li>
<li>No expongas el 2003 a Internet “porque ya tiene SSH”.</li>
<li>Licencia: Personal Edition es free no comercial; Standard es evaluación / pago. Respeta eso en lab vs trabajo.</li>
<li>Objetivo real: migrar el workload. SSH es el puente para sacar datos y apagar el caja.</li>
</ul>
<h2 id="relacionado">Relacionado</h2>
<p>Para abrir un portal HTTPS desde el mismo host (IE8 ya no sirve): <a href="/es/posts/windows/navegador-moderno-xp-2003/">navegador moderno en XP/2003 con Supermium</a>.</p>
<p>Docs y descarga: <a href="https://bitvise.com/ssh-server-download">Bitvise SSH Server</a>.</p>
]]></content:encoded></item><item><title>Temas</title><link>https://inet.sh/es/temas/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/temas/</guid><description>Temas de los runbooks: ZFS, HP iLO, Proxmox, Windows y k3s.</description><content:encoded><![CDATA[<p>Los <strong>temas</strong> son las carpetas del sitio (ZFS, iLO, …). No son lo mismo que los <em>tags</em>: un tag es un detalle (<code>encryption</code>, <code>bitvise</code>); un tema es la familia entera.</p>
<h2 id="temas">Temas</h2>
<ul>
<li><a href="/es/posts/zfs/">ZFS</a> — pools, snapshots, cifrado, send/recv</li>
<li><a href="/es/posts/ilo/">HP iLO</a> — CLI, firmware, licencia</li>
<li><a href="/es/posts/proxmox/">Proxmox</a> — plantillas cloud-init y VMs</li>
<li><a href="/es/posts/windows/">Windows</a> — legacy XP/2003, disco, SSH</li>
<li><a href="/es/posts/k3s/">k3s</a> — cluster ligero, data-dir, migración de discos</li>
</ul>
<h2 id="tags">Tags</h2>
<p>Si buscas por palabra clave suelta (extensión, herramienta, síntoma): <a href="/es/tags/">todos los tags</a>.</p>
]]></content:encoded></item><item><title>WinDirStat: ver qué se come el disco en Windows</title><link>https://inet.sh/es/posts/windows/windirstat-uso-disco/</link><pubDate>Thu, 20 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/windows/windirstat-uso-disco/</guid><description>WinDirStat es un analizador de uso de disco para Windows: como du, pero con treemap, tipos de archivo y búsqueda de duplicados. Descarga en windirstat.net.</description><content:encoded><![CDATA[<p>En Linux, cuando el disco se llena, el reflejo es:</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">du -xh --max-depth<span class="o">=</span><span class="m">1</span> / <span class="p">|</span> sort -h
</span></span><span class="line"><span class="cl"><span class="c1"># o ncdu /</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>En <strong>Windows</strong> no hay un <code>du</code> decente en la caja. Explorer → Properties es lento y opaco. La herramienta que uso en lab y en escritorios: <strong><a href="https://windirstat.net/">WinDirStat</a></strong> — free, open source, treemap interactivo.</p>
<p>Piensa en <code>du</code> con esteroides: escanea un drive o una carpeta y te muestra <strong>dónde</strong> está el espacio, no solo cuántos GB.</p>
<h2 id="qué-hace-más-allá-de-sumar-bytes">Qué hace (más allá de sumar bytes)</h2>
<table>
  <thead>
      <tr>
          <th>Vista</th>
          <th>Para qué</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Lista de directorios</td>
          <td>Ordenar por tamaño, como <code>du | sort -h</code></td>
      </tr>
      <tr>
          <td>Estadísticas por extensión</td>
          <td>Ver si <code>.iso</code>, <code>.vmdk</code>, <code>.log</code> o <code>.bak</code> dominan</td>
      </tr>
      <tr>
          <td>Treemap</td>
          <td>Cada rectángulo = un archivo; área = tamaño; color = tipo</td>
      </tr>
      <tr>
          <td>Largest files / duplicados</td>
          <td>Candidatos obvios a borrar o mover</td>
      </tr>
  </tbody>
</table>
<p>El <a href="https://windirstat.net/">sitio del proyecto</a> documenta scan multithread, scan NTFS directo cuando aplica, dark mode e integración con Explorer.</p>
<h2 id="uso-rápido">Uso rápido</h2>
<ol>
<li>Descarga el instalador (o portable) desde <a href="https://windirstat.net/">windirstat.net</a> / GitHub releases del proyecto.</li>
<li>Ejecuta <strong>como Administrador</strong> si vas a escanear <code>C:\</code> entero (permisos en <code>Windows</code>, perfiles de otros usuarios, etc.).</li>
<li>Elige el volumen o una carpeta concreta (<code>D:\VMs</code>, <code>C:\Users\…\AppData</code>).</li>
<li>Espera el scan. En discos grandes tarda; no es <code>du</code> sobre un tmpfs.</li>
<li>En el treemap, haz zoom en el bloque gordo. Abre la carpeta en Explorer o borra desde la UI solo si sabes lo que es.</li>
</ol>
<h2 id="cuándo-usarlo">Cuándo usarlo</h2>
<ul>
<li>Disco “lleno” y no sabes si es <code>Downloads</code>, hibernación, pagefile, ISOs o snapshots de VM.</li>
<li>Comparar <strong>antes/después</strong> de limpiar un perfil o un share.</li>
<li>Enseñar a alguien no-CLI qué está ocupando espacio (el treemap vende solo).</li>
</ul>
<h2 id="qué-no-es">Qué no es</h2>
<ul>
<li>No sustituye <code>du</code>/<code>ncdu</code> en Linux o en un NAS por SSH.</li>
<li>No es un limpiador mágico: borrar System Volume Information, WinSxS o bases de datos “porque son grandes” rompe el host.</li>
<li>Un scan de todo <code>C:\</code> en un file server con millones de archivos puede tardar mucho; acota la raíz.</li>
</ul>
<h2 id="equivalente-mental">Equivalente mental</h2>
<table>
  <thead>
      <tr>
          <th>Mundo</th>
          <th>Herramienta</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Linux CLI</td>
          <td><code>du</code>, <code>ncdu</code></td>
      </tr>
      <tr>
          <td>Windows GUI</td>
          <td><strong>WinDirStat</strong></td>
      </tr>
      <tr>
          <td>macOS</td>
          <td>DaisyDisk / OmniDiskSweeper (otra familia)</td>
      </tr>
  </tbody>
</table>
<p>Descarga y docs: <a href="https://windirstat.net/">https://windirstat.net/</a>.</p>
]]></content:encoded></item><item><title>Actualizar firmware de HP iLO por SSH</title><link>https://inet.sh/es/posts/ilo/actualizar-firmware-ssh/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/ilo/actualizar-firmware-ssh/</guid><description>Cómo actualizar el firmware de HP iLO por SSH con SMASH CLP: show /map1/firmware1 y load -source http://…</description><content:encoded><![CDATA[<p>Cuando el firmware de iLO está tan viejo que el navegador ya no habla TLS con él, SSH + HTTP sigue funcionando.</p>
<h2 id="1-sirve-el-bin-por-http">1. Sirve el <code>.bin</code> por HTTP</h2>
<p>El iLO <strong>descarga</strong> el firmware; no se lo empujas por SCP. Un <code>python3 -m http.server</code> en la red de management basta, o nginx. El archivo es el <code>ilo*.bin</code> oficial de HPE.</p>
<h2 id="2-entra-y-carga">2. Entra y carga</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">ssh -c aes256-cbc Administrator@&lt;ilo-ip&gt;
</span></span><span class="line"><span class="cl">show /map1/firmware1
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /map1/firmware1
</span></span><span class="line"><span class="cl">load -source http://&lt;http-server&gt;/ilofirmware.bin
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>-c aes256-cbc</code> es el truco en iLO 2/3: OpenSSH moderno rechaza los ciphers del iLO si no se los pides.</p>
<p><code>show /map1/firmware1</code> imprime la versión actual <strong>antes</strong> de tocar nada. Guárdala.</p>
<h2 id="qué-esperar">Qué esperar</h2>
<ul>
<li>El <code>load</code> tarda minutos. No cortes la sesión.</li>
<li>El iLO se reinicia solo. El host <strong>no</strong> se apaga (el firmware vive en el BMC).</li>
<li>Si el HTTP no es alcanzable desde la NIC del iLO, <code>load</code> falla con un error opaco: prueba <code>oemhp_ping</code> al servidor HTTP.</li>
</ul>
<p>Después del reboot, <code>show /map1/firmware1</code> otra vez y confirma el version string.</p>
<p>Referencia: <a href="https://ajmckean.com/upgrade-hp-ilo-via-ssh/">Upgrade HP iLO via SSH</a>.</p>
<p>Ver también: <a href="/es/posts/ilo/comandos-cli/">comandos CLI de iLO</a>.</p>
]]></content:encoded></item><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[<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[<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[<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>HP iLO CLI: usuarios, red, ISO y power</title><link>https://inet.sh/es/posts/ilo/comandos-cli/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/ilo/comandos-cli/</guid><description>Comandos SMASH CLP de HP iLO por SSH: crear usuario, cambiar password, IP estática, montar ISO HTTP y encender o apagar el servidor.</description><content:encoded><![CDATA[<p>Si tienes SSH al iLO y no quieres abrir la consola web, el canal es <strong>SMASH CLP</strong> (<code>/map1</code>, <code>oemhp_*</code>). Esto es el dialecto de iLO 2/3/4 clásico, no Redfish.</p>
<h2 id="conectarte">Conectarte</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">ssh Administrator@&lt;ilo-ip&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>En firmware viejo a veces hace falta un cipher débil:</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">ssh -c aes256-cbc Administrator@&lt;ilo-ip&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="cuentas">Cuentas</h2>
<p>Crear un usuario con grupos típicos de admin (el iLO se puede resetear después de cambios de red; las cuentas no):</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">create /map1/accounts1 <span class="nv">username</span><span class="o">=</span>ops <span class="nv">password</span><span class="o">=</span><span class="s1">&#39;&lt;password&gt;&#39;</span> <span class="nv">group</span><span class="o">=</span>admin,config,oemhp_vm,oemhp_rc,oemhp_power
</span></span></code></pre></td></tr></table>
</div>
</div><p>Cambiar el password de <code>Administrator</code> (hazlo en el primer boot; <code>hpinvent</code> / <code>Administrator</code> es el default de HP):</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"><span class="nb">set</span> /map1/accounts1/Administrator <span class="nv">password</span><span class="o">=</span><span class="s1">&#39;&lt;nuevo-password&gt;&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="red-el-ilo-se-reinicia">Red (el iLO se reinicia)</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"><span class="nb">set</span> map1/dhcpendpt1 <span class="nv">EnabledState</span><span class="o">=</span>no
</span></span><span class="line"><span class="cl"><span class="nb">set</span> map1/enetport1/lanendpt1/ipendpt1 <span class="nv">IPv4Address</span><span class="o">=</span>192.168.1.213 <span class="nv">SubnetMask</span><span class="o">=</span>255.255.255.0
</span></span><span class="line"><span class="cl"><span class="nb">set</span> map1/enetport1 <span class="nv">SystemName</span><span class="o">=</span>merlin
</span></span></code></pre></td></tr></table>
</div>
</div><p>Tras cada <code>set</code> de red, espera a que el iLO vuelva y reconecta SSH a la IP nueva.</p>
<h2 id="montar-un-iso-por-http-y-boot-una-vez">Montar un ISO por HTTP y boot una vez</h2>
<p>El ISO tiene que ser HTTP alcanzable <strong>desde el iLO</strong>, no desde tu laptop.</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"><span class="nb">set</span> /map1/oemhp_vm1/cddr1 <span class="nv">oemhp_image</span><span class="o">=</span>http://10.254.0.50/ssp2017.iso
</span></span><span class="line"><span class="cl"><span class="nb">set</span> /map1/oemhp_vm1/cddr1 <span class="nv">oemhp_boot</span><span class="o">=</span>Once
</span></span><span class="line"><span class="cl">show /map1/oemhp_vm1/cddr1
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="power">Power</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">show /system1
</span></span><span class="line"><span class="cl">start /system1
</span></span><span class="line"><span class="cl">stop /system1
</span></span><span class="line"><span class="cl">reset /system1
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="ping-desde-el-ilo">Ping desde el iLO</h2>
<p>Útil para ver si el iLO ve la red de management:</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">oemhp_ping /map1 10.1.1.50
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="manual">Manual</h2>
<p>La referencia de HP para este árbol CLP: <a href="http://h10032.www1.hp.com/ctg/Manual/c02237707.pdf">iLO scripting and command line</a>.</p>
<p>Ver también: <a href="/es/posts/ilo/actualizar-firmware-ssh/">actualizar firmware por SSH</a>, <a href="/es/posts/ilo/obtener-licencia/">leer la licencia</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[<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>Leer la license key de HP iLO sin entrar a la UI</title><link>https://inet.sh/es/posts/ilo/obtener-licencia/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/ilo/obtener-licencia/</guid><description>Cómo extraer la license key de HP iLO con el endpoint XML xmldata?item=CpqKey, sin login en la consola web.</description><content:encoded><![CDATA[<p>iLO Advanced se licencia por key. Si heredaste un ProLiant y la UI no abre (certificado, Java, firmware), el BMC igual publica un XML de inventario.</p>
<h2 id="el-endpoint">El endpoint</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">curl -sk <span class="s2">&#34;https://&lt;ilo-ip&gt;/xmldata?item=CpqKey&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>En el navegador: <code>https://&lt;ilo-ip&gt;/xmldata?item=CpqKey</code>.</p>
<p>La respuesta es XML con el producto y la key (o el estado unlicensed). No es Redfish; es el interfaz <code>xmldata</code> de iLO, el mismo que usan los scripts viejos de HP SIM.</p>
<h2 id="notas">Notas</h2>
<ul>
<li><code>-k</code> porque el certificado del iLO casi nunca es de un CA público.</li>
<li>Algunos iLO sirven esto en <strong>HTTP</strong> (<code>http://&lt;ilo-ip&gt;/xmldata?item=CpqKey</code>) si HTTPS ya no negocia.</li>
<li>Trata la key como secreto. No la subas a git ni a un paste.</li>
<li>Leerla no activa nada: solo <strong>lee</strong> lo que ya está grabado en el BMC. Para aplicar otra key sigue siendo <code>license</code> en CLP o la UI.</li>
</ul>
<p>Ver también: <a href="/es/posts/ilo/comandos-cli/">comandos CLI</a>.</p>
]]></content:encoded></item><item><title>Plantillas Proxmox con cloud images (qm + cloud-init)</title><link>https://inet.sh/es/posts/proxmox/plantillas-cloud-init/</link><pubDate>Wed, 19 Aug 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/plantillas-cloud-init/</guid><description>Crear un template de Proxmox a partir de un qcow2 GenericCloud: wget, qm create, import-from, cloud-init y qm clone. Alma, Rocky, Ubuntu y más.</description><content:encoded><![CDATA[<p>El ISO de instalador sobra si solo quieres un Linux que arranque con usuario, llave SSH y DHCP. Las distros publican un <strong>GenericCloud / cloudimg</strong> (qcow2): lo importas, le pegas un drive de cloud-init y lo conviertes en template.</p>
<p>Probado en <strong>Proxmox 8.0.4</strong>. El flujo es el de este <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist</a> (fork del de zidenis). Las URLs de Fedora 38 / Ubuntu 23.04 envejecen: cambia el <code>wget</code> por el cloud image <strong>actual</strong> de la distro.</p>
<h2 id="1-bajar-el-image">1. Bajar el image</h2>
<p>En el nodo, como root, en un storage con espacio (NFS, local, lo que uses):</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><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"><span class="nb">export</span> <span class="nv">IMAGES_PATH</span><span class="o">=</span><span class="s2">&#34;/mnt/pve/nfs-data/images/&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">IMAGES_PATH</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2
</span></span><span class="line"><span class="cl">wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/CHECKSUM -O SHA256SUMS
</span></span><span class="line"><span class="cl">sha256sum -c SHA256SUMS --ignore-missing
</span></span></code></pre></td></tr></table>
</div>
</div><p>Otras distros (descomenta la que toque):</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><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><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</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"># Amazon Linux 2 — https://cdn.amazonlinux.com/os-images/latest/</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cdn.amazonlinux.com/os-images/2.0.20230727.0/kvm/amzn2-kvm-2.0.20230727.0-x86_64.xfs.gpt.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CentOS Stream 9</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Fedora (ajusta la versión)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Oracle Linux 9 — el .qcow no es qcow2; conviértelo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://yum.oracle.com/templates/OracleLinux/OL9/u2/x86_64/OL9U2_x86_64-kvm-b197.qcow</span>
</span></span><span class="line"><span class="cl"><span class="c1"># qemu-img convert -O qcow2 -o compat=0.10 OL9U2_x86_64-kvm-b197.qcow OL9U2_x86_64-kvm-b197.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># RHEL 9 — hace falta login en access.redhat.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Rocky 9</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://dl.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ubuntu cloudimg</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="2-variables-de-la-vm-y-de-cloud-init">2. Variables de la VM y de cloud-init</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><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</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="nb">export</span> <span class="nv">QEMU_CPU_MODEL</span><span class="o">=</span><span class="s2">&#34;host&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_CPU_SOCKETS</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_CPU_CORES</span><span class="o">=</span><span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_MEMORY</span><span class="o">=</span><span class="m">4098</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_RESOURCE_POOL</span><span class="o">=</span><span class="s2">&#34;CustomResourcePool&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_USER</span><span class="o">=</span><span class="s2">&#34;user&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_SSHKEY</span><span class="o">=</span><span class="s2">&#34;/home/user/.ssh/id_rsa.pub&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_IP</span><span class="o">=</span><span class="s2">&#34;dhcp&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_NAMESERVER</span><span class="o">=</span><span class="s2">&#34;1.1.1.1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">CLOUD_INIT_SEARCHDOMAIN</span><span class="o">=</span><span class="s2">&#34;example.com&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">TEMPLATE_ID</span><span class="o">=</span><span class="m">1001</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_NAME</span><span class="o">=</span><span class="s2">&#34;alma9&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">VM_DISK_IMAGE</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">IMAGES_PATH</span><span class="si">}</span><span class="s2">/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--cpu host</code> pasa las flags de la CPU del nodo (mejor rendimiento; el template no es portable a otro CPU vendor sin rehacer). <code>VM_MEMORY=4098</code> es el valor del gist; 4096 también vale.</p>
<p>El usuario de cloud-init <strong>no</strong> es <code>root</code>. La llave tiene que ser el <code>.pub</code> que vas a usar desde tu laptop.</p>
<h2 id="3-crear-la-vm-base-e-importar-el-disco">3. Crear la VM base e importar el disco</h2>
<p>Cambia <code>local-lvm</code> y <code>vmbr0</code> por tu storage y bridge reales.</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><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">qm create <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --name <span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span> --cpu <span class="si">${</span><span class="nv">QEMU_CPU_MODEL</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --sockets <span class="si">${</span><span class="nv">VM_CPU_SOCKETS</span><span class="si">}</span> --cores <span class="si">${</span><span class="nv">VM_CPU_CORES</span><span class="si">}</span> --memory <span class="si">${</span><span class="nv">VM_MEMORY</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --numa <span class="m">1</span> --net0 virtio,bridge<span class="o">=</span>vmbr0 --ostype l26 --agent <span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --pool <span class="si">${</span><span class="nv">VM_RESOURCE_POOL</span><span class="si">}</span> --scsihw virtio-scsi-single
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --scsi0 local-lvm:0,import-from<span class="o">=</span><span class="si">${</span><span class="nv">VM_DISK_IMAGE</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ide2 local-lvm:cloudinit --boot <span class="nv">order</span><span class="o">=</span>scsi0
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ipconfig0 <span class="nv">ip</span><span class="o">=</span><span class="si">${</span><span class="nv">CLOUD_INIT_IP</span><span class="si">}</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --nameserver <span class="si">${</span><span class="nv">CLOUD_INIT_NAMESERVER</span><span class="si">}</span> --searchdomain <span class="si">${</span><span class="nv">CLOUD_INIT_SEARCHDOMAIN</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --ciupgrade <span class="m">1</span> --ciuser <span class="si">${</span><span class="nv">CLOUD_INIT_USER</span><span class="si">}</span> --sshkeys <span class="si">${</span><span class="nv">CLOUD_INIT_SSHKEY</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm cloudinit update <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>--agent 1</code> pide qemu-guest-agent. Alma/Rocky/Fedora lo traen o cloud-init lo instala (<code>ciupgrade</code>). Amazon Linux 2 y algunos Ubuntu cloudimg <strong>no</strong> muestran la IP en la GUI de Proxmox hasta que instalas el agent a mano.</p>
<h2 id="4-convertir-a-template">4. Convertir a template</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">qm <span class="nb">set</span> <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> --name <span class="s2">&#34;</span><span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span><span class="s2">-Template&#34;</span>
</span></span><span class="line"><span class="cl">qm template <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>A partir de aquí esa VM no se arranca: se clona.</p>
<h2 id="5-clonar-y-arrancar">5. Clonar y arrancar</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"><span class="nb">export</span> <span class="nv">VM_ID</span><span class="o">=</span><span class="k">$(</span>pvesh get /cluster/nextid<span class="k">)</span>
</span></span><span class="line"><span class="cl">qm clone <span class="si">${</span><span class="nv">TEMPLATE_ID</span><span class="si">}</span> <span class="si">${</span><span class="nv">VM_ID</span><span class="si">}</span> --name <span class="si">${</span><span class="nv">VM_NAME</span><span class="si">}</span>
</span></span><span class="line"><span class="cl">qm start <span class="si">${</span><span class="nv">VM_ID</span><span class="si">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>SSH con la llave <strong>privada</strong> pareja del <code>.pub</code> que metiste en cloud-init:</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">ssh user@192.168.0.123 -i ~/.ssh/id_rsa
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si no ves la IP en Proxmox: consola serial, o <code>ip neigh</code> en el bridge, o DHCP leases del router.</p>
<p>Fuente: <a href="https://gist.github.com/inetshell/f1d0206d5319c11062845901e4f3d06b">gist inetshell/f1d0206d5319c11062845901e4f3d06b</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[<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[<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[<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[<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>