<?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>Kvm on inetshell</title><link>https://inet.sh/es/tags/kvm/</link><description>Recent content in Kvm on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Sat, 26 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/kvm/index.xml" rel="self" type="application/rss+xml"/><item><title>Montar un disco qcow2 en el host con qemu-nbd (leer o reparar archivos de una VM apagada)</title><link>https://inet.sh/es/posts/linux/montar-qcow2-qemu-nbd/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/linux/montar-qcow2-qemu-nbd/</guid><description>Un qcow2 no se puede montar con loop: qemu-nbd lo expone como dispositivo de bloques (/dev/nbd0) y de ahí salen las particiones. Cómo hacerlo en modo lectura o escritura, qué pasa si el disco de la VM lleva LVM (nombres de VG duplicados, vgimportclone), cómo montar un snapshot interno, guestmount como alternativa sin nbd, y por qué nunca con la VM encendida.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Con la VM <strong>apagada</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><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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">modprobe nbd <span class="nv">max_part</span><span class="o">=</span><span class="m">16</span>
</span></span><span class="line"><span class="cl">qemu-nbd --connect<span class="o">=</span>/dev/nbd0 /var/lib/vz/images/100/vm-100-disk-0.qcow2   <span class="c1"># añade -r para solo lectura</span>
</span></span><span class="line"><span class="cl">partprobe /dev/nbd0
</span></span><span class="line"><span class="cl">lsblk /dev/nbd0                                  <span class="c1"># nbd0p1, nbd0p2…</span>
</span></span><span class="line"><span class="cl">mount /dev/nbd0p2 /mnt/vm
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ... leer, copiar o reparar ...</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">umount /mnt/vm
</span></span><span class="line"><span class="cl">qemu-nbd --disconnect /dev/nbd0
</span></span></code></pre></td></tr></table>
</div>
</div><p>Sin el <code>--disconnect</code> la VM no vuelve a arrancar: QEMU se encuentra la imagen bloqueada.</p>
<h2 id="por-qué-nbd">Por qué nbd</h2>
<p>Un <code>.qcow2</code> no es un volcado del disco: tiene cabecera, tabla de clusters, snapshots internos y a veces un archivo base detrás. <code>losetup</code> no lo entiende. <code>qemu-nbd</code> sí, y lo publica como un dispositivo de bloques a través del cliente NBD del kernel; a partir de ahí es un disco más para <code>lsblk</code>, <code>mount</code>, <code>fsck</code> o <code>dd</code>.</p>
<p><code>max_part</code> importa: sin él el kernel no crea los nodos <code>nbd0p1</code>, <code>nbd0p2</code>… <code>partprobe</code> los fuerza si tras el <code>--connect</code> no aparecen.</p>
<h2 id="si-el-disco-de-la-vm-lleva-lvm">Si el disco de la VM lleva LVM</h2>
<p>Lo normal en Ubuntu Server, RHEL y Fedora: dentro de la partición hay un VG. Actívalo, monta el LV y, al terminar, desactívalo antes de desconectar:</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">vgscan
</span></span><span class="line"><span class="cl">vgchange -ay                                   <span class="c1"># activa lo que encuentre en nbd0</span>
</span></span><span class="line"><span class="cl">lvs                                            <span class="c1"># ubuntu-vg/ubuntu-lv, rhel/root…</span>
</span></span><span class="line"><span class="cl">mount /dev/ubuntu-vg/ubuntu-lv /mnt/vm
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">umount /mnt/vm
</span></span><span class="line"><span class="cl">vgchange -an ubuntu-vg
</span></span><span class="line"><span class="cl">qemu-nbd --disconnect /dev/nbd0
</span></span></code></pre></td></tr></table>
</div>
</div><p>Trampa clásica: el host tiene un VG con el <strong>mismo nombre</strong> que el de la VM (<code>ubuntu-vg</code> contra <code>ubuntu-vg</code>, <code>pve</code> contra <code>pve</code>). LVM se niega a activar dos iguales. La herramienta para eso es <code>vgimportclone</code>, que renombra el VG del disco importado sin tocar el del host:</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">vgimportclone -n vm100-vg /dev/nbd0p3
</span></span><span class="line"><span class="cl">vgchange -ay vm100-vg
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si prefieres no cambiar nada dentro de la VM, <code>guestmount</code> (abajo) resuelve el LVM por su cuenta y no toca el LVM del host.</p>
<h2 id="windows-ntfs-y-snapshots-internos">Windows, NTFS y snapshots internos</h2>
<ul>
<li><strong>NTFS</strong>: <code>mount -t ntfs3 /dev/nbd0p3 /mnt/vm</code> (kernel 5.15+) o <code>ntfs-3g</code>. Si Windows quedó hibernado o con <em>Fast Startup</em>, NTFS solo se deja montar en lectura; apágalo bien desde dentro antes de escribir.</li>
<li><strong>Snapshot interno de qcow2</strong> (<code>qemu-img snapshot -l vm.qcow2</code>): <code>qemu-nbd -r -l antes-del-cambio --connect=/dev/nbd0 vm.qcow2</code> monta el estado de ese snapshot, solo lectura, sin tocar el disco actual.</li>
<li><strong>Otros formatos</strong>: <code>qemu-nbd</code> habla también vmdk, vhdx y vdi (<code>-f vhdx</code> si no lo detecta); <code>qemu-img convert -O raw</code> es la alternativa si vas a trabajar mucho tiempo con la imagen.</li>
</ul>
<h2 id="guestmount-lo-mismo-sin-nbd-ni-root">guestmount: lo mismo sin nbd ni root</h2>
<p>libguestfs monta la imagen por FUSE, detecta particiones y LVM solo, y no interfiere con el host:</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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">apt install libguestfs-tools          <span class="c1"># dnf install guestfs-tools en Fedora/RHEL</span>
</span></span><span class="line"><span class="cl">virt-filesystems --long -h --all -a vm.qcow2      <span class="c1"># qué hay dentro</span>
</span></span><span class="line"><span class="cl">guestmount -a vm.qcow2 -i --ro /mnt/vm            <span class="c1"># -i: monta el sistema operativo que encuentre</span>
</span></span><span class="line"><span class="cl">guestunmount /mnt/vm
</span></span></code></pre></td></tr></table>
</div>
</div><p>Más lento que nbd para copiar gigas, pero imposible de dejar mal cerrado.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>Nunca con la VM encendida.</strong> En escritura corrompes el sistema de archivos con seguridad; en <code>-r</code> ves un estado inconsistente (lo que el guest tiene en caché no está en disco). Si necesitas mirar una VM viva, haz un snapshot y monta el snapshot.</li>
<li><strong>La imagen queda bloqueada</strong> mientras <code>qemu-nbd</code> esté conectado: <code>qm start 100</code> falla con <code>Failed to get &quot;write&quot; lock</code>. <code>qemu-nbd -d /dev/nbd0</code> lo suelta; <code>ls /sys/block/nbd*/pid</code> dice cuáles siguen en uso.</li>
<li><strong><code>--disconnect</code> con &ldquo;device busy&rdquo;</strong>: queda algo montado o un VG activo (<code>vgchange -an</code>). <code>lsof /dev/nbd0*</code> lo encuentra.</li>
<li><strong>Proxmox con LVM-thin o ZFS</strong> no necesita nbd: el disco de la VM ya es un dispositivo de bloques (<code>/dev/pve/vm-100-disk-0</code>, <code>/dev/zvol/rpool/data/vm-100-disk-0</code>); <code>kpartx -av</code> sobre él saca las particiones. <code>qemu-nbd</code> es para qcow2 en storages de directorio y NFS.</li>
<li><strong>Archivos base</strong>: una imagen con <code>backing file</code> se monta igual; lo que escribas va a la capa superior. No muevas la base mientras esté conectada.</li>
</ul>
<p>Ver también: <a href="/es/posts/windows/disk2vhd-p2v-vhdx-maquina-encendida/">convertir una máquina física a VHDX</a> y el <a href="/es/posts/proxmox/plantillas-cloud-init/">import de discos en Proxmox</a>. Referencia: <a href="https://www.qemu.org/docs/master/tools/qemu-nbd.html">qemu-nbd</a> en la documentación de QEMU.</p>
]]></content:encoded></item><item><title>pfSense virtualizado con VirtIO: sin tráfico hasta desactivar hardware checksum offload</title><link>https://inet.sh/es/posts/pfsense/virtio-desactivar-hardware-checksum-offload/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/pfsense/virtio-desactivar-hardware-checksum-offload/</guid><description>pfSense u OPNsense en Proxmox, KVM o bhyve con NICs VirtIO (vtnet): el firewall arranca pero no pasa tráfico, o no se llega a los equipos detrás de él desde el host y otras VMs. Es el checksum offload de vtnet en FreeBSD. System &amp;gt; Advanced &amp;gt; Networking &amp;gt; Disable hardware checksum offload y reinicio obligatorio.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p><strong>System → Advanced → Networking → Disable hardware checksum offload</strong> ✔ → <strong>Save</strong> → <strong>reinicia la VM</strong>. La GUI no avisa, pero el cambio no aplica a las interfaces <code>vtnet</code> hasta el reinicio.</p>
<p>Para probar sin reiniciar (se pierde al arrancar):</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">ifconfig vtnet0 -rxcsum -txcsum -tso -lro
</span></span><span class="line"><span class="cl">ifconfig vtnet1 -rxcsum -txcsum -tso -lro
</span></span></code></pre></td></tr></table>
</div>
</div><p>En OPNsense: <strong>Interfaces → Settings → Hardware CRC → Disable hardware checksum offload</strong>, y el mismo reinicio.</p>
<h2 id="síntomas">Síntomas</h2>
<p>La VM arranca, las interfaces están <code>UP</code>, el DHCP de la LAN reparte direcciones y aun así:</p>
<ul>
<li>Los equipos detrás del firewall no llegan a Internet, o la conexión se queda a medias (el ping pasa, TCP se cuelga).</li>
<li>Desde el propio host de virtualización o desde otras VMs del mismo host no se llega a nada protegido por pfSense, ni a la GUI.</li>
<li>Cambiar la NIC de la VM a <code>e1000</code> lo arregla al momento, lo que confirma el diagnóstico.</li>
</ul>
<h2 id="por-qué-pasa">Por qué pasa</h2>
<p>El driver <code>vtnet</code> de FreeBSD, con el offload de checksums activado, entrega a la pila de red paquetes cuyo checksum nunca llegó a calcularse: entre VMs del mismo host, y entre el host y la VM, el tráfico no pasa por una NIC física que lo haga. FreeBSD ve checksums inválidos y descarta (bug 165059 de FreeBSD). Netgate lo documenta en <a href="https://docs.netgate.com/pfsense/en/latest/virtualization/virtio-driver-support.html">VirtIO Driver Support</a>.</p>
<p>pfSense intenta marcar la opción solo cuando detecta interfaces <code>vtnet</code> <strong>en la instalación</strong>. Si la NIC VirtIO se añadió después, si restauraste el <code>config.xml</code> de un firewall físico, o si migraste la VM desde otro hipervisor con otro tipo de NIC, la opción sigue apagada.</p>
<h2 id="procedimiento">Procedimiento</h2>
<ol>
<li>
<p><strong>System → Advanced → Networking</strong>, sección <em>Network Interfaces</em>:</p>
<ul>
<li><strong>Disable hardware checksum offload</strong>: marcar.</li>
<li><strong>Disable hardware TCP segmentation offload</strong> y <strong>Disable hardware large receive offload</strong>: ya vienen marcadas por defecto; déjalas así.</li>
</ul>
</li>
<li>
<p><strong>Save</strong>.</p>
</li>
<li>
<p><strong>Reboot</strong> desde Diagnostics → Reboot. Sin este paso, nada cambia en <code>vtnet</code>.</p>
</li>
<li>
<p>Comprueba:</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">ifconfig vtnet0 <span class="p">|</span> grep options
</span></span></code></pre></td></tr></table>
</div>
</div><p>No deben aparecer <code>RXCSUM</code> ni <code>TXCSUM</code> (ni <code>TSO4</code>, <code>LRO</code>).</p>
</li>
</ol>
<h2 id="si-sigue-igual">Si sigue igual</h2>
<ul>
<li><strong>Todas las NICs de la VM tienen que ser del mismo estilo.</strong> Una <code>vtnet</code> con offload y otra <code>e1000</code> se comportan distinto; revisa cada <code>ifconfig</code>.</li>
<li><strong>Offload en el host.</strong> Netgate señala que a veces también hay que apagar checksums y TSO en el hipervisor. En Proxmox/KVM, sobre la interfaz <code>tap</code> de la VM: <code>ethtool -K tap100i0 tx off</code> (el número es el VMID y <code>i0</code> la NIC). Es raro necesitarlo; pruébalo el último.</li>
<li><strong>Plan B</strong>: modelo de NIC <code>e1000</code> en la VM. Menos rendimiento que VirtIO sin offload, pero sin este bug.</li>
</ul>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>El reinicio no es opcional</strong> y la GUI no lo pide. Es la causa número uno de &ldquo;lo marqué y sigue sin funcionar&rdquo;.</li>
<li><strong>No es un problema de reglas.</strong> Con el offload activo, los paquetes se descartan antes de llegar a <code>pf</code>; el log del firewall no muestra nada.</li>
<li><strong><code>e1000</code> también en OPNsense</strong> como plan B; el ajuste equivalente está en <em>Interfaces → Settings</em>.</li>
<li><strong>Multiqueue</strong> (<code>queues=N</code> en Proxmox) funciona bien con <code>vtnet</code> una vez desactivado el offload; no lo confundas con la causa.</li>
</ul>
]]></content:encoded></item><item><title>PiKVM: forzar 1080p (o el modo que quieras) editando el EDID</title><link>https://inet.sh/es/posts/pikvm/pikvm-forzar-1080p-edid/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/pikvm/pikvm-forzar-1080p-edid/</guid><description>El PiKVM V3 (y los DIY V0–V2) captura 1080p solo a 50 Hz y por eso anuncia 720p por defecto; algunas consolas, como la de Proxmox, se ven mal. kvmd-edidconf --import-preset=v3.1080p-by-default --apply cambia el EDID que ve el host. Cómo comprobarlo, cambiar el nombre de monitor para que Windows lo redetecte y volver al preset original.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">rw
</span></span><span class="line"><span class="cl">kvmd-edidconf --import-preset<span class="o">=</span>v3.1080p-by-default --apply    <span class="c1"># V3, y DIY V0–V2 con su preset (v0, v1, v2)</span>
</span></span><span class="line"><span class="cl">ro
</span></span></code></pre></td></tr></table>
</div>
</div><p>Después, <strong>reinicia el host</strong> o desconecta y reconecta el HDMI: el EDID solo se lee cuando el host detecta el monitor. En <strong>V4 Mini</strong> y <strong>V4 Plus</strong> no hace falta nada de esto: capturan 1080p a 60 Hz de fábrica.</p>
<h2 id="por-qué">Por qué</h2>
<p>El PiKVM se presenta ante el host como un monitor, y lo que ese monitor &ldquo;sabe hacer&rdquo; va en el <strong>EDID</strong>: resoluciones, frecuencias y cuál es la preferida. El host elige a partir de eso.</p>
<p>El V3 (y los DIY con el capturador CSI TC358743) tiene un límite de hardware: <strong>1080p solo a 50 Hz</strong>. Como 50 Hz es una frecuencia poco habitual, el EDID por defecto marca <strong>720p60</strong> como modo preferido y muchos hosts se quedan ahí. Es correcto para la mayoría, pero algunos sistemas se ven mal en 720p: la consola de Proxmox, algunos BIOS, escritorios que escalan raro. El preset <code>v3.1080p-by-default</code> mantiene los mismos modos pero pone <strong>1080p50</strong> como preferido.</p>
<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></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kvmd-edidconf                 <span class="c1"># sin argumentos: fabricante, producto, serie, nombre y audio del EDID actual</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>En la interfaz web, el indicador de video muestra la resolución y los fps que está capturando; tras el reinicio del host debe decir <code>1920x1080</code> y <code>50</code>. Si el host tiene una utilidad de pantalla (<code>xrandr</code>, Configuración de Windows), el &ldquo;monitor&rdquo; aparecerá con el nombre del EDID.</p>
<h2 id="otros-ajustes-del-edid">Otros ajustes del EDID</h2>
<p>Windows guarda la configuración por monitor usando fabricante, producto y serie. Si el host sigue en un modo viejo después de cambiar el EDID, cámbiale la identidad para que lo trate como un monitor nuevo:</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">rw
</span></span><span class="line"><span class="cl">kvmd-edidconf --set-monitor-name<span class="o">=</span>PIKVM --set-mfc-id<span class="o">=</span>PKV --set-product-id<span class="o">=</span><span class="m">34953</span> --set-serial<span class="o">=</span><span class="m">1234567890</span> --apply
</span></span><span class="line"><span class="cl">ro
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><code>--set-audio=1</code> anuncia audio por HDMI (para capturar sonido en los modelos que lo soportan).</li>
<li>En <strong>V4 Plus</strong>, con un monitor real conectado a la salida OUT2, <code>--import-display-ids</code> copia su identidad al EDID del PiKVM.</li>
<li>Volver al original: <code>kvmd-edidconf --import-preset=v3 --apply</code> (o <code>v4mini</code>, <code>v4plus</code> según el modelo).</li>
</ul>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong><code>rw</code> antes, <code>ro</code> después.</strong> El sistema de archivos del PiKVM es de solo lectura; sin <code>rw</code> el cambio no se guarda y sin <code>ro</code> te lo recuerda en cada login.</li>
<li><strong>El host tiene que releer el EDID.</strong> <code>--apply</code> aplica en el PiKVM al instante, pero el host no se entera hasta un reinicio, un reconectar de cable, o en algunos BIOS solo en el POST.</li>
<li><strong>50 Hz en V3 no es un fallo</strong>, es el límite del capturador. Para 60 Hz, V4.</li>
<li><strong>Pantalla negra tras un EDID a mano</strong>: vuelve a importar el preset del modelo y aplica.</li>
<li><strong>Proxmox</strong> y otras consolas de framebuffer fijan el modo al arrancar; después de cambiar el EDID hay que reiniciar el nodo, no solo la sesión.</li>
</ul>
<p>Referencia: <a href="https://docs.pikvm.org/edid/">EDID</a> en la documentación de PiKVM.</p>
]]></content:encoded></item><item><title>Proxmox: Windows lento con CPU type host (md_clear y flush_l1d)</title><link>https://inet.sh/es/posts/proxmox/windows-lento-cpu-type-host/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/proxmox/windows-lento-cpu-type-host/</guid><description>Por qué una VM Windows en Proxmox VE va lenta y a tirones con CPU type &amp;#39;host&amp;#39; y vuela con x86-64-v2-AES: los flags md_clear y flush_l1d activan las mitigaciones de MDS y L1TF dentro del guest y disparan la latencia de memoria. Qué tipo de CPU elegir y qué pasa si insistes en host.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></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="m">102</span> --cpu x86-64-v2-AES    <span class="c1"># o x86-64-v3 si todos los hosts son Haswell / EPYC o más nuevos</span>
</span></span><span class="line"><span class="cl">qm stop <span class="m">102</span> <span class="o">&amp;&amp;</span> qm start <span class="m">102</span>       <span class="c1"># un reboot desde dentro de Windows NO aplica el cambio</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="síntomas">Síntomas</h2>
<p>Windows 10, 11 o Server con <code>cpu: host</code>: arranque lento, escritorio a tirones, congelamientos de segundos, todo lo que toque memoria va mal. La misma VM con <code>x86-64-v2-AES</code> responde normal. Una VM Linux con <code>host</code> en el mismo nodo no nota nada.</p>
<h2 id="por-qué-pasa">Por qué pasa</h2>
<p><code>host</code> le pasa a la VM <strong>todos</strong> los flags del CPU físico, incluidos dos que existen para las mitigaciones de vulnerabilidades de Intel:</p>
<table>
  <thead>
      <tr>
          <th>Flag</th>
          <th>Mitigación</th>
          <th>Qué hace Windows al verlo</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>md_clear</code></td>
          <td>MDS (Microarchitectural Data Sampling)</td>
          <td>Ejecuta <code>VERW</code> en cada transición kernel ↔ usuario para vaciar buffers</td>
      </tr>
      <tr>
          <td><code>flush_l1d</code></td>
          <td>L1TF (L1 Terminal Fault)</td>
          <td>Vacía la caché L1D en cada entrada a la VM / cambio de contexto</td>
      </tr>
  </tbody>
</table>
<p>Dentro de una VM esas operaciones salen carísimas. Las mediciones del <a href="https://forum.proxmox.com/threads/the-reasons-for-poor-performance-of-windows-when-the-cpu-type-is-host.163114/">hilo original en el foro de Proxmox</a>: en un Xeon E5-2667 v2 la latencia de lectura de RAM pasa de <strong>~100 ns a ~2000 ns</strong>; en un i9-13900K, de 30 a 90 ns. Windows, que toca memoria del kernel todo el tiempo, se arrastra.</p>
<p>Los tipos genéricos (<code>x86-64-v2-AES</code>, <code>x86-64-v3</code>, <code>IvyBridge-IBRS</code>, …) no exponen esos dos flags, así que Windows ni ve la vulnerabilidad ni enciende la mitigación.</p>
<h2 id="qué-tipo-elegir">Qué tipo elegir</h2>
<table>
  <thead>
      <tr>
          <th>Tipo</th>
          <th>Requiere en el host</th>
          <th>Notas</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>x86-64-v2-AES</code></td>
          <td>Intel Westmere / AMD Opteron 4.ª gen o más nuevo</td>
          <td>Default de la GUI desde PVE 8. Migra entre hosts distintos</td>
      </tr>
      <tr>
          <td><code>x86-64-v3</code></td>
          <td>Intel Haswell / AMD EPYC o más nuevo</td>
          <td>AVX2. Migra entre hosts que lo cumplan</td>
      </tr>
      <tr>
          <td><code>x86-64-v4</code></td>
          <td>Skylake-SP / Zen 4 o más nuevo</td>
          <td>AVX-512</td>
      </tr>
      <tr>
          <td><code>host</code></td>
          <td>Todos iguales</td>
          <td>Máximo de flags, pero no migra entre CPUs distintos y trae este problema en Windows</td>
      </tr>
  </tbody>
</table>
<p>Elige el más alto que soporten <strong>todos</strong> los nodos del clúster:</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">grep -o -w -E <span class="s1">&#39;avx2|avx512f&#39;</span> /proc/cpuinfo <span class="p">|</span> sort -u   <span class="c1"># avx2 → v3 ok; avx512f → v4 ok</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Es la recomendación del staff de Proxmox en ese mismo hilo: usar el <code>x86-64-v*</code> que corresponda al hardware en vez de apagar flags de seguridad a ciegas.</p>
<h2 id="si-insistes-en-host">Si insistes en host</h2>
<p>Hay casos en los que <code>host</code> hace falta: virtualización anidada (Hyper-V, WSL2 dentro de la VM, un lab de ESXi), porque los tipos <code>x86-64-v*</code> no exponen <code>vmx</code>/<code>svm</code>. Puedes quitar <code>md_clear</code> con la opción <code>flags</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-shell" data-lang="shell"><span class="line"><span class="cl">qm <span class="nb">set</span> <span class="m">102</span> --cpu host,flags<span class="o">=</span>-md-clear
</span></span></code></pre></td></tr></table>
</div>
</div><p>Pero <code>flush_l1d</code> no está en la lista de flags que Proxmox deja tocar, así que te quedas con la mitad del problema. Y ocultarle mitigaciones al guest es una decisión de seguridad: razonable en un nodo de un solo dueño, no en uno con inquilinos que no controlas.</p>
<h2 id="comprobar-desde-dentro-de-windows">Comprobar desde dentro de Windows</h2>
<p>El módulo oficial de Microsoft muestra qué mitigaciones tiene activas el guest:</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">Install-Module</span> <span class="n">SpeculationControl</span> <span class="n">-Scope</span> <span class="n">CurrentUser</span>
</span></span><span class="line"><span class="cl"><span class="nb">Get-SpeculationControlSettings</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Con <code>host</code>, <code>MDSWindowsSupportEnabled</code> y <code>L1TFWindowsSupportEnabled</code> salen <code>True</code>; con <code>x86-64-v2-AES</code>, <code>False</code>. Es la forma rápida de confirmar que el cambio aplicó.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>El cambio pide stop/start.</strong> El tipo de CPU se fija al lanzar el proceso QEMU; un reinicio desde dentro del guest no lo toca.</li>
<li><strong>Es un tema de Intel.</strong> <code>md_clear</code> y <code>flush_l1d</code> no existen en AMD; con <code>host</code> en EPYC/Ryzen no verás esta caída (aunque <code>host</code> sigue impidiendo migrar entre CPUs distintos).</li>
<li><strong>Aplica a VMs nuevas también.</strong> Las plantillas creadas con <code>host</code> heredan el problema; cámbialo en la plantilla.</li>
<li><strong>Con ambos tipos Windows sigue seguro contra lo que importa dentro de una VM</strong>: las mitigaciones que cuentan (Spectre v2, etc.) siguen activas; lo que desaparece es la doble mitigación de vulnerabilidades que ya mitiga el host.</li>
</ul>
<p>Referencias: <a href="https://forum.proxmox.com/threads/the-reasons-for-poor-performance-of-windows-when-the-cpu-type-is-host.163114/">hilo del foro de Proxmox</a> y la sección <a href="https://pve.proxmox.com/pve-docs/chapter-qm.html#qm_cpu">CPU</a> de la guía de administración.</p>
]]></content:encoded></item></channel></rss>