<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>WSL2 on kenji.blog</title><link>http://kenji.blog/es/tags/wsl2/</link><description>Recent content in WSL2 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 07:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/tags/wsl2/index.xml" rel="self" type="application/rss+xml"/><item><title>Hyper-V vs WSL2: Comparación de tecnologías de virtualización en Windows</title><link>http://kenji.blog/es/p/hyper-v-vs-wsl2-windows-virtualization/</link><pubDate>Sun, 13 Sep 2026 07:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/hyper-v-vs-wsl2-windows-virtualization/</guid><description>&lt;img src="http://kenji.blog/p/hyper-v-vs-wsl2-windows-virtualization/img/eyecatch.jpg" alt="Featured image of post Hyper-V vs WSL2: Comparación de tecnologías de virtualización en Windows" />&lt;h2 id="1-introducción-la-evolución-de-la-virtualización-en-windows">1. Introducción: La evolución de la virtualización en Windows
&lt;/h2>&lt;p>La tecnología de virtualización en la plataforma Windows ha experimentado una evolución dramática en las últimas décadas. En el pasado, los hipervisores de Tipo 2 de terceros (como VMware Workstation y VirtualBox) eran la norma, pero desde que Microsoft introdujo &amp;ldquo;Hyper-V&amp;rdquo; en Windows Server 2008, el hipervisor de Tipo 1 también se ha integrado en el sistema operativo de escritorio Windows 10/11.&lt;/p>
&lt;p>En los últimos años, lo que más ha llamado la atención de los desarrolladores es &amp;ldquo;WSL2 (Windows Subsystem for Linux 2)&amp;rdquo;. Mientras que WSL1 dependía de la traducción de llamadas al sistema (translation), WSL2 adopta una &amp;ldquo;Máquina Virtual de Utilidad Ligera (Lightweight Utility VM)&amp;rdquo; que aplica la tecnología de Hyper-V, logrando una compatibilidad total con Linux y una mejora espectacular en el rendimiento.&lt;/p>
&lt;p>En este artículo, compararemos y explicaremos exhaustivamente estas dos potentes tecnologías de virtualización: el &amp;ldquo;Hyper-V&amp;rdquo; con todas sus funciones y el &amp;ldquo;WSL2&amp;rdquo; centrado en la experiencia del desarrollador, analizando su arquitectura, rendimiento (CPU, memoria, E/S de disco), configuración de red y los mejores casos de uso, junto con detalles técnicos profundos.&lt;/p>
&lt;hr>
&lt;h2 id="2-teoría-básica-del-hipervisor-y-comparación-de-arquitectura">2. Teoría básica del hipervisor y comparación de arquitectura
&lt;/h2>&lt;p>Para comprender la tecnología de virtualización, es esencial clasificar los tipos de hipervisores (Monitores de Máquinas Virtuales: VMM).&lt;/p>
&lt;h3 id="21-diferencias-entre-los-hipervisores-de-tipo-1-y-tipo-2">2.1. Diferencias entre los hipervisores de Tipo 1 y Tipo 2
&lt;/h3>&lt;p>Un hipervisor es una capa de software que abstrae el acceso al hardware y permite que múltiples sistemas operativos (SO invitados) se ejecuten simultáneamente en una sola máquina física.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Tipo 1 (Bare-metal)&lt;/strong>: Se ejecuta directamente sobre el hardware. No existe el concepto de SO host (estrictamente hablando, puede existir un SO de gestión con privilegios), tiene una sobrecarga extremadamente baja y ofrece alto rendimiento y seguridad. Ejemplos: Hyper-V, VMware ESXi, Xen.&lt;/li>
&lt;li>&lt;strong>Tipo 2 (Hosted)&lt;/strong>: Se ejecuta como una aplicación sobre un SO host (como Windows o macOS). Dado que todo el acceso al hardware pasa por el SO host, la sobrecarga es mayor. Ejemplos: VMware Workstation, Oracle VirtualBox.&lt;/li>
&lt;/ul>
&lt;p>El Hyper-V de Windows es un &lt;strong>hipervisor de Tipo 1&lt;/strong> puro. Cuando se habilita Hyper-V, de hecho, el propio sistema operativo Windows que el usuario normalmente opera también comienza a ejecutarse dentro de una máquina virtual especial llamada &amp;ldquo;Partición Raíz (Root Partition)&amp;rdquo;.&lt;/p>
&lt;h3 id="22-detalles-de-la-arquitectura-de-hyper-v">2.2. Detalles de la arquitectura de Hyper-V
&lt;/h3>&lt;p>La arquitectura de Hyper-V adopta un diseño de microkernel y se basa en unidades lógicas de separación llamadas particiones (Partition).&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Hardware (CPU, RAM, Disco, NIC)&amp;#34;] --&amp;gt; B[&amp;#34;Hipervisor de Windows (Anillo -1)&amp;#34;]
B --&amp;gt; C[&amp;#34;Partición Raíz (SO Windows)&amp;#34;]
B --&amp;gt; D[&amp;#34;Partición Hija 1 (VM Windows)&amp;#34;]
B --&amp;gt; E[&amp;#34;Partición Hija 2 (VM Linux)&amp;#34;]
C --&amp;gt; F[&amp;#34;VMBus (Bus de Máquina Virtual)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
C --&amp;gt; G[&amp;#34;VID (Controlador de Infraestructura de Virtualización)&amp;#34;]
C --&amp;gt; H[&amp;#34;VMWP.exe (Proceso Trabajador)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>Windows Hypervisor&lt;/strong>: Se ejecuta en el estado con mayor nivel de privilegios de la CPU (Ring -1 o VMX Root Mode) y se encarga únicamente de la asignación de memoria y la programación de la CPU. No incluye controladores de dispositivos.&lt;/li>
&lt;li>&lt;strong>Root Partition&lt;/strong>: Es la partición donde se ejecuta el SO Windows host. Posee todos los controladores de dispositivos y controla el hardware directamente. También proporciona funciones de gestión para las particiones hijas (como proveedores WMI y VMWP.exe).&lt;/li>
&lt;li>&lt;strong>Child Partition&lt;/strong>: Es la partición donde se ejecuta el SO invitado. No se permite el acceso directo al hardware, y las solicitudes de E/S se envían a la partición raíz (Synthetic I/O) a través de un bus de memoria compartida lógico llamado &amp;ldquo;VMBus&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h3 id="23-wsl2-y-el-mecanismo-de-la-lightweight-utility-vm">2.3. WSL2 y el mecanismo de la Lightweight Utility VM
&lt;/h3>&lt;p>WSL2 utiliza la misma tecnología base de hipervisor de Tipo 1 que Hyper-V, pero emplea un subconjunto de características llamado &amp;ldquo;Plataforma de Máquina Virtual (Virtual Machine Platform: VMP)&amp;rdquo;, que difiere de una máquina virtual Hyper-V con todas las funciones.&lt;/p>
&lt;p>La &amp;ldquo;Máquina Virtual de Utilidad Ligera (Lightweight Utility VM)&amp;rdquo; adoptada en WSL2 elimina por completo la emulación de hardware heredado (como BIOS virtual o placa base virtual) que tienen las VM tradicionales.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;SO Host Windows (Espacio de Usuario)&amp;#34;]
B[&amp;#34;Sistema de Archivos NTFS&amp;#34;]
C[&amp;#34;Servidor del Protocolo 9P (Plan 9)&amp;#34;]
D[&amp;#34;VM de Utilidad Ligera (Kernel de Linux)&amp;#34;]
E[&amp;#34;ext4.vhdx (Disco Virtual)&amp;#34;]
F[&amp;#34;Espacio de Usuario Linux (Distribuciones WSL2)&amp;#34;]
A --&amp;gt; C
C --&amp;gt;| Intercambio de Archivos Multi-SO | D
D --&amp;gt; E
D --&amp;gt; F
&lt;/pre>
&lt;p>La mayor característica de WSL2 es su &lt;strong>velocidad de inicio&lt;/strong> y su &lt;strong>integración perfecta con el SO host&lt;/strong>. El kernel de Linux se inicia en menos de unos pocos segundos, y accede al sistema de archivos del lado de Windows (NTFS) a través del protocolo del sistema de archivos de red &lt;code>9P&lt;/code> de Plan 9.&lt;/p>
&lt;hr>
&lt;h2 id="3-análisis-exhaustivo-del-rendimiento-recursos-computacionales-y-es">3. Análisis exhaustivo del rendimiento: Recursos computacionales y E/S
&lt;/h2>&lt;p>El rendimiento de una máquina virtual se expresa como la suma de la sobrecarga en cada componente: CPU, memoria y E/S de disco.&lt;/p>
&lt;h3 id="31-cpu-y-sobrecarga-de-cambio-de-contexto">3.1. CPU y sobrecarga de cambio de contexto
&lt;/h3>&lt;p>Tanto Hyper-V como WSL2 utilizan virtualización asistida por hardware (Intel VT-x / AMD-V). Las instrucciones de la CPU se ejecutan básicamente a velocidad nativa, pero al ejecutar instrucciones privilegiadas o procesar E/S, se produce una interrupción llamada &amp;ldquo;VM Exit&amp;rdquo; y se realiza un cambio de contexto hacia el hipervisor.&lt;/p>
&lt;p>La sobrecarga de la CPU en este momento, $T_{overhead}$, se puede expresar mediante el siguiente modelo matemático.&lt;/p>
$$ T_{overhead} = \sum_{i=1}^{N} (t_{vm\_exit} + t_{hypercall\_process} + t_{vm\_entry}) $$&lt;p>Donde:&lt;/p>
&lt;ul>
&lt;li>$N$: Número de ocurrencias de VM Exit por unidad de tiempo&lt;/li>
&lt;li>$t_{vm\_exit}$: Tiempo de transición del invitado al hipervisor&lt;/li>
&lt;li>$t_{hypercall\_process}$: Tiempo de procesamiento de E/S o interrupciones a través de VMBus&lt;/li>
&lt;li>$t_{vm\_entry}$: Tiempo de retorno del hipervisor al invitado&lt;/li>
&lt;/ul>
&lt;p>En WSL2, debido a la ausencia de emulación heredada, $t_{hypercall\_process}$ está extremadamente optimizado para ser pequeño. Por lo tanto, en cálculos puros de CPU (como la compilación del kernel o la inferencia de modelos de aprendizaje automático), la degradación del rendimiento se mantiene dentro de un pequeño porcentaje en comparación con un entorno bare-metal.&lt;/p>
&lt;h3 id="32-mecanismo-de-asignación-de-memoria">3.2. Mecanismo de asignación de memoria
&lt;/h3>&lt;p>Existen diferencias claras en la filosofía de diseño en cuanto a los métodos de gestión de memoria entre ambos.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hyper-V (Memoria Dinámica)&lt;/strong>: La partición raíz asigna y recupera memoria dinámicamente según la demanda de memoria de la VM invitada. Sin embargo, la memoria reservada como caché de páginas dentro del SO invitado tiende a no ser liberada a menos que el sistema esté bajo presión.&lt;/li>
&lt;li>&lt;strong>WSL2 (Recuperación de memoria dinámica)&lt;/strong>: WSL2 tiene su propio mecanismo que devuelve (Reclaim) periódicamente al host de Windows la memoria (incluida la caché) que ya no es necesaria dentro de la VM de Linux. En las primeras versiones de WSL2 existía el problema de que la caché de páginas de Linux consumía la memoria de Windows (inflado del proceso Vmmem), pero esto se ha mejorado actualmente mediante parches del kernel.&lt;/li>
&lt;/ul>
&lt;h3 id="33-características-de-es-del-disco-vhdx-vs-ext4vhdx">3.3. Características de E/S del disco (VHDX vs ext4.vhdx)
&lt;/h3>&lt;p>El cuello de botella más probable en el rendimiento de las máquinas virtuales es la E/S de disco.&lt;/p>
&lt;p>La latencia de E/S $L_{total}$ se calcula de la siguiente manera:&lt;/p>
$$ L_{total} = L_{guest\_fs} + L_{vmbus} + L_{host\_fs} + L_{physical\_disk} $$&lt;p>&lt;strong>En el caso de Hyper-V&lt;/strong>:
Un invitado de Hyper-V típico utiliza un disco virtual en formato &lt;code>VHDX&lt;/code>. Las solicitudes de E/S emitidas por el sistema de archivos (ext4 o NTFS) dentro del SO invitado pasan por el controlador de almacenamiento de dispositivos de bloque de VMBus (storvsc) y se procesan como un acceso al archivo VHDX sobre el NTFS del lado de Windows.&lt;/p>
&lt;p>&lt;strong>En el caso de WSL2&lt;/strong>:
Las distribuciones de Linux en WSL2 se ejecutan en un sistema de archivos ext4 nativo construido dentro de un archivo &lt;code>ext4.vhdx&lt;/code> dedicado. Las operaciones de archivos dentro de Linux (como en el directorio &lt;code>~&lt;/code>) ofrecen un rendimiento nativo equivalente al Hyper-V mencionado anteriormente.
Sin embargo, &lt;strong>al acceder a archivos del lado de Windows (como &lt;code>/mnt/c/&lt;/code>) desde el Linux de WSL2&lt;/strong>, o viceversa, el proceso es muy diferente. Para este acceso entre sistemas operativos se utiliza &lt;code>9P (Plan 9 File System Protocol)&lt;/code>.&lt;/p>
$$ L_{cross\_os} = L_{9p\_client} + L_{socket\_transfer} + L_{9p\_server} + L_{ntfs} $$&lt;p>El acceso a través de este protocolo 9P tiene una gran sobrecarga de procesamiento de serialización, y el rendimiento disminuye drásticamente (a veces, con un retraso 10 veces mayor o más) para tareas de lectura y escritura masivas de pequeños archivos (ej: &lt;code>npm install&lt;/code> o operaciones de Git en un proyecto Node.js ubicado en un directorio de Windows).
Por lo tanto, &lt;strong>al usar WSL2, es una regla estricta ubicar siempre los archivos del proyecto en el sistema de archivos nativo de Linux (bajo &lt;code>~/&lt;/code>)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="4-estructura-de-red-nat-default-switch-bridged">4. Estructura de red: NAT, Default Switch, Bridged
&lt;/h2>&lt;p>La flexibilidad de las funciones de red es una de las grandes diferencias entre Hyper-V y WSL2.&lt;/p>
&lt;h3 id="41-red-de-wsl2-basado-en-nat">4.1. Red de WSL2 (Basado en NAT)
&lt;/h3>&lt;p>La red de WSL2 está configurada de manera predeterminada como &amp;ldquo;NAT (Traducción de Direcciones de Red)&amp;rdquo; utilizando la tecnología de conmutador virtual de Hyper-V.
A la VM de Linux se le asigna automáticamente una dirección IP privada diferente a la del host de Windows (ej: &lt;code>172.20.x.x&lt;/code>). El host de Windows tiene incorporado un mecanismo que reenvía &lt;code>localhost&lt;/code> a los servicios (puertos) iniciados dentro de WSL2, lo que permite a los desarrolladores probar servidores web, etc., sin ser conscientes de la red.&lt;/p>
&lt;p>Recientemente, se ha introducido en las versiones preliminares de WSL2 un nuevo modo de red llamado modo &amp;ldquo;Mirrored&amp;rdquo;. Esto tiene como objetivo soportar IPv6 y mejorar la compatibilidad con conexiones VPN (configurable en &lt;code>.wslconfig&lt;/code>).&lt;/p>
&lt;h3 id="42-conmutador-virtual-de-hyper-v-virtual-switch">4.2. Conmutador Virtual de Hyper-V (Virtual Switch)
&lt;/h3>&lt;p>Hyper-V permite la construcción de redes avanzadas a nivel empresarial. A través del &amp;ldquo;Administrador de conmutadores virtuales&amp;rdquo;, ofrece principalmente tres modos:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Externo (External)&lt;/strong>: Vincula la NIC física de la máquina host al conmutador virtual, haciendo que las VM invitadas participen directamente en la red física (conexión puente). La VM obtiene una IP de la misma subred que la red física desde el servidor DHCP.&lt;/li>
&lt;li>&lt;strong>Interno (Internal)&lt;/strong>: Solo permite la comunicación entre el SO host y las VM, y entre las propias VM. No pueden acceder directamente a redes externas.&lt;/li>
&lt;li>&lt;strong>Privado (Private)&lt;/strong>: Solo permite la comunicación entre las VM y bloquea la comunicación con el SO host. Se utiliza para construir entornos de prueba aislados.&lt;/li>
&lt;/ol>
&lt;h3 id="43-construcción-avanzada-de-redes-hyper-v-con-powershell">4.3. Construcción avanzada de redes Hyper-V con PowerShell
&lt;/h3>&lt;p>En entornos de desarrollo o pruebas, cuando se desea construir una red NAT personalizada para las VM, el uso de PowerShell permite un control detallado. A continuación se muestra un ejemplo de un script que crea un conmutador virtual interno, configura NAT en él y proporciona acceso a Internet a la VM.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Creación del conmutador virtual interno&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SwitchName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatSwitch&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-VMSwitch&lt;/span> &lt;span class="n">-SwitchName&lt;/span> &lt;span class="nv">$SwitchName&lt;/span> &lt;span class="n">-SwitchType&lt;/span> &lt;span class="n">Internal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 2. Configuración de la dirección IP en la NIC virtual del lado del host (IP que servirá de puerta de enlace)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mf">24&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$InterfaceAlias&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;vEthernet (&lt;/span>&lt;span class="nv">$SwitchName&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetIPAddress&lt;/span> &lt;span class="n">-IPAddress&lt;/span> &lt;span class="nv">$GatewayIP&lt;/span> &lt;span class="n">-PrefixLength&lt;/span> &lt;span class="nv">$NetPrefix&lt;/span> &lt;span class="n">-InterfaceAlias&lt;/span> &lt;span class="nv">$InterfaceAlias&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Configuración de la red NAT&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HyperV-NatNetwork&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$NatSubnet&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;192.168.100.0/24&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">New-NetNat&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="nv">$NatName&lt;/span> &lt;span class="n">-InternalIPInterfaceAddressPrefix&lt;/span> &lt;span class="nv">$NatSubnet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Comando de verificación&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-NetNat&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Con esta configuración, al asignar manualmente una IP &lt;code>192.168.100.x&lt;/code> y la puerta de enlace &lt;code>192.168.100.1&lt;/code> al invitado de Hyper-V especificado, se puede construir un segmento NAT propio capaz de comunicarse con el exterior a través del host.&lt;/p>
&lt;hr>
&lt;h2 id="5-casos-de-uso-y-guía-de-selección-práctica">5. Casos de uso y guía de selección práctica
&lt;/h2>&lt;p>Con base en las diferencias de arquitectura y rendimiento discutidas hasta ahora, definimos en qué situaciones se debe adoptar cada tecnología.&lt;/p>
&lt;h3 id="51-escenarios-donde-se-debe-elegir-wsl2">5.1. Escenarios donde se debe elegir WSL2
&lt;/h3>&lt;p>WSL2 está diseñado específicamente para &amp;ldquo;mejorar la productividad de los desarrolladores&amp;rdquo;. Es ideal para los siguientes usos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Desarrollo web y desarrollo cloud-native&lt;/strong>: Desarrollo de contenedores utilizando Docker Desktop (backend WSL2) o Podman.&lt;/li>
&lt;li>&lt;strong>Uso de herramientas exclusivas de Linux&lt;/strong>: Cuando se utilizan a diario bash, grep, awk, sed, o compiladores GCC o Clang para Linux.&lt;/li>
&lt;li>&lt;strong>Aplicaciones GUI (WSLg)&lt;/strong>: Cuando se desea ejecutar aplicaciones X11/Wayland de Linux de forma transparente en el escritorio de Windows.&lt;/li>
&lt;li>&lt;strong>Aprendizaje automático y desarrollo de IA&lt;/strong>: Entrenamiento rápido de TensorFlow o PyTorch utilizando la función de paso de GPU (NVIDIA CUDA on WSL).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nota&lt;/strong>: Puede haber restricciones si se desea personalizar el kernel en detalle o construir servicios complejos que dependan fuertemente de systemd (actualmente systemd es compatible, pero está deshabilitado o restringido por defecto).&lt;/p>
&lt;h3 id="52-escenarios-donde-se-debe-elegir-hyper-v">5.2. Escenarios donde se debe elegir Hyper-V
&lt;/h3>&lt;p>Hyper-V tiene como objetivo &amp;ldquo;la virtualización y el aislamiento completo de la infraestructura&amp;rdquo;. Es esencial para los siguientes usos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ejecución de VMs con Windows&lt;/strong>: Cuando se ejecutan diferentes versiones de Windows (Windows Server, Windows 10 antiguo, etc.) como entorno de prueba.&lt;/li>
&lt;li>&lt;strong>Virtualización anidada (Nested Virtualization)&lt;/strong>: Cuando se desea ejecutar otra máquina virtual (Hyper-V o KVM) dentro de una máquina virtual. Indispensable para los entornos de prueba de los ingenieros de infraestructura.&lt;/li>
&lt;li>&lt;strong>Requisitos de red avanzados&lt;/strong>: Cuando es necesario controlar estrictamente la configuración de la red, como conexiones puente externas (participación en la misma LAN), etiquetado VLAN, asignación de múltiples NIC, etc.&lt;/li>
&lt;li>&lt;strong>Instantáneas (Snapshots / Checkpoints)&lt;/strong>: Función que permite guardar el estado de una VM en un punto específico y revertirlo (rollback) instantáneamente en cualquier momento. Extremadamente útil para pruebas destructivas de software o análisis de malware.&lt;/li>
&lt;li>&lt;strong>Asignación fija de recursos&lt;/strong>: Cuando se desea fijar estrictamente el número de núcleos de CPU y la cantidad de memoria, minimizando el impacto en el SO host.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-discusión-sobre-el-rendimiento-de-es-mediante-modelos-matemáticos-apéndice">6. Discusión sobre el rendimiento de E/S mediante modelos matemáticos (Apéndice)
&lt;/h2>&lt;p>Como ingeniero de sistemas, al evaluar los límites de rendimiento de E/S de ambos, es importante comprender teóricamente la relación entre el rendimiento (throughput) $S$ y el tamaño del bloque $B$.&lt;/p>
&lt;p>El rendimiento de transferencia de datos $S$ es la cantidad de datos transferidos por unidad de tiempo y se modela de la siguiente manera:&lt;/p>
$$ S(B) = \frac{B}{L_{setup} + \frac{B}{R_{max}}} $$&lt;ul>
&lt;li>$B$: Tamaño del bloque (Bytes)&lt;/li>
&lt;li>$L_{setup}$: Latencia fija asociada a la configuración de la solicitud de E/S y al cambio de contexto&lt;/li>
&lt;li>$R_{max}$: Ancho de banda máximo del hardware para la copia o transferencia de dispositivos&lt;/li>
&lt;/ul>
&lt;p>En el acceso a archivos a través del protocolo 9P de WSL2, este $L_{setup}$ es muy grande (debido a la comunicación por sockets y a la serialización/deserialización del protocolo). Por lo tanto, cuando el tamaño del bloque $B$ es pequeño (lectura y escritura masivas de archivos pequeños de unos pocos KB), el impacto de $L_{setup}$ en el denominador se vuelve dominante, y el rendimiento $S$ disminuye drásticamente.
Por el contrario, en el acceso VHDX a través de VMBus de Hyper-V, $L_{setup}$ está optimizado a un nivel cercano a la interrupción del hardware, por lo que se pueden mantener altos IOPS incluso con bloques pequeños.&lt;/p>
&lt;p>Esta realidad matemática es la base lógica de la mejor práctica que establece que &amp;ldquo;en WSL2, los archivos del proyecto no deben colocarse en el lado de Windows&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-conclusión-dos-tecnologías-de-virtualización-coexistentes">7. Conclusión: Dos tecnologías de virtualización coexistentes
&lt;/h2>&lt;p>Hyper-V y WSL2 no son tecnologías en las que una sea superior a la otra, sino que son &lt;strong>&amp;ldquo;dos soluciones con propósitos diferentes&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>WSL2&lt;/strong> rompe el caparazón del sistema operativo Windows y es la &amp;ldquo;mejor herramienta de integración&amp;rdquo; para llevar el ecosistema de Linux de forma transparente y rápida a las manos de los usuarios de Windows. No es una exageración decir que es el entorno CLI definitivo para desarrolladores.&lt;/li>
&lt;li>&lt;strong>Hyper-V&lt;/strong> es un &amp;ldquo;hipervisor a gran escala&amp;rdquo; que lleva al escritorio la sólida separación y las capacidades de gestión cultivadas en los centros de datos empresariales. No tiene igual en la construcción de redes, pruebas de sistemas operativos Windows y simulación de entornos de infraestructura.&lt;/li>
&lt;/ul>
&lt;p>En los entornos modernos de Windows, estas dos tecnologías no compiten en igualdad de condiciones, sino que coexisten maravillosamente en la misma plataforma de VM. Al usarlas en el lugar adecuado según el propósito, Windows se convertirá en la estación de trabajo de ingeniería más poderosa y flexible del mundo.&lt;/p></description></item><item><title>Guía de configuración definitiva del entorno de desarrollo para WSL2 (Windows Subsystem for Linux)</title><link>http://kenji.blog/es/p/wsl2-ultimate-development-setup-guide/</link><pubDate>Sat, 12 Sep 2026 23:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/wsl2-ultimate-development-setup-guide/</guid><description>&lt;img src="http://kenji.blog/p/wsl2-ultimate-development-setup-guide/img/eyecatch.jpg" alt="Featured image of post Guía de configuración definitiva del entorno de desarrollo para WSL2 (Windows Subsystem for Linux)" />&lt;p>&amp;ldquo;WSL2 (Windows Subsystem for Linux 2)&amp;rdquo;, que proporciona un entorno de desarrollo nativo de Linux en Windows, se ha convertido en una herramienta indispensable en el desarrollo de software moderno. Sin embargo, existe una gran diferencia en el rendimiento y la experiencia de desarrollo entre usarlo en su estado predeterminado y aplicar los ajustes adecuados al comprender su arquitectura.&lt;/p>
&lt;p>En este artículo, comenzando con una explicación de la arquitectura fundamental de WSL2, explicaremos exhaustivamente todos los pasos para construir el &amp;ldquo;entorno de desarrollo definitivo&amp;rdquo; exigido por ingenieros profesionales, abarcando configuraciones para maximizar el rendimiento, la construcción de un entorno de terminal cómodo, la integración perfecta con Docker y VS Code, y configuraciones de red avanzadas, en un volumen de más de 10,000 caracteres.&lt;/p>
&lt;hr>
&lt;h2 id="1-arquitectura-de-wsl2-y-su-evolución-desde-wsl1">1. Arquitectura de WSL2 y su evolución desde WSL1
&lt;/h2>&lt;p>Para aprovechar todo el potencial de WSL2, es importante comprender primero su estructura interna. El enfoque para ejecutar binarios de Linux en Windows difiere fundamentalmente entre el WSL original (WSL1) y WSL2.&lt;/p>
&lt;h3 id="wsl1-capa-de-traducción-de-llamadas-al-sistema">WSL1: Capa de traducción de llamadas al sistema
&lt;/h3>&lt;p>WSL1 adoptó un mecanismo que traducía (translation) las llamadas al sistema (system calls) de Linux a las APIs NT de Windows en tiempo real. Esto tenía la ventaja de una sobrecarga de recursos (overhead) muy pequeña porque no utilizaba máquinas virtuales (VM). Sin embargo, era difícil emular completamente llamadas al sistema complejas, como operaciones de E/S del sistema de archivos, lo que provocaba una degradación del rendimiento abismal, especialmente al manejar un gran número de archivos pequeños en procesos como &lt;code>npm install&lt;/code> de Node.js u operaciones de repositorios de Git.&lt;/p>
&lt;h3 id="wsl2-máquina-virtual-de-utilidad-ligera-y-un-kernel-de-linux-completo">WSL2: Máquina Virtual de Utilidad Ligera y un Kernel de Linux completo
&lt;/h3>&lt;p>En WSL2, la arquitectura se renovó y un verdadero kernel de Linux construido por Microsoft ahora se ejecuta directamente sobre una &lt;strong>&amp;ldquo;Máquina Virtual de Utilidad Ligera (Lightweight Utility VM)&amp;rdquo; que utiliza un subconjunto de la arquitectura de Hyper-V&lt;/strong>. Esto garantiza el 100% de compatibilidad de llamadas al sistema, y al utilizar un disco virtual (VHDX) que emplea el sistema de archivos nativo ext4 de Linux, el rendimiento de E/S de archivos ha mejorado drásticamente en comparación con WSL1.&lt;/p>
&lt;p>El siguiente diagrama de Mermaid ilustra las diferencias estructurales entre WSL1 y WSL2.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph &amp;#34;Entorno del SO Windows&amp;#34;
A[&amp;#34;Kernel de Windows NT&amp;#34;]
A --&amp;gt; F[&amp;#34;Sistema de archivos NTFS (Disco C:)&amp;#34;]
end
subgraph &amp;#34;Arquitectura de WSL2&amp;#34;
B[&amp;#34;Hipervisor de Hyper-V&amp;#34;]
B --&amp;gt; C[&amp;#34;Máquina Virtual de Utilidad Ligera&amp;#34;]
C --&amp;gt; D[&amp;#34;Kernel de Linux (Microsoft)&amp;#34;]
D --&amp;gt; E[&amp;#34;Espacio de usuario de Ubuntu (glibc, bash, etc.)&amp;#34;]
D --&amp;gt; G[&amp;#34;Disco virtual ext4 (.vhdx)&amp;#34;]
end
A -.-&amp;gt;|&amp;#34;Recurso compartido de archivos de red del protocolo Plan 9 (9P)&amp;#34;| D
style B fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#bbf,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>Una lección importante de esta estructura es que &lt;strong>&amp;ldquo;el acceso a los archivos en el lado de Linux (dentro del VHDX) es extremadamente rápido, pero el acceso a los archivos en el lado de Windows (&lt;code>/mnt/c/&lt;/code>) es muy lento porque pasa por el protocolo 9P&amp;rdquo;&lt;/strong>. El código fuente de tus proyectos siempre debe ubicarse bajo el directorio de inicio (&lt;code>~&lt;/code>) en el lado de WSL.&lt;/p>
&lt;hr>
&lt;h2 id="2-análisis-matemático-del-rendimiento-por-qué-wsl2-es-rápido">2. Análisis matemático del rendimiento: ¿Por qué WSL2 es rápido?
&lt;/h2>&lt;p>Evaluemos cuantitativamente la mejora de rendimiento de WSL2 utilizando un modelo matemático. En el desarrollo de software, una de las operaciones que más tiempo consume es el procesamiento que implica operaciones intensivas de E/S de archivos (por ejemplo, instalación de bibliotecas o compilación).&lt;/p>
&lt;p>El tiempo total de ejecución de cierto proceso $T_{total}$ se expresa como la suma del tiempo computacional por la CPU $T_{compute}$ y el tiempo que tardan las operaciones de E/S de disco $T_{io}$.&lt;/p>
$$ T_{total} = T_{compute} + T_{io} $$&lt;p>En el caso de WSL1, se produce una sobrecarga para traducir las operaciones del lado de Linux en operaciones NTFS, por lo que el tiempo de E/S se modela de la siguiente manera. Aquí, $n$ es el número de operaciones de archivo, $t_{ntfs\_syscall}$ es el tiempo de ejecución de la llamada al sistema en el lado de Windows y $t_{trans}$ es la sobrecarga de la capa de traducción.&lt;/p>
$$ T_{wsl1\_io} = \sum_{i=1}^{n} (t_{ntfs\_syscall_i} + t_{trans_i}) $$&lt;p>Por otro lado, en el caso de WSL2, dado que el kernel emite E/S directamente al sistema de archivos ext4, la sobrecarga es solo el ligero retraso $t_{virt}$ debido a la virtualización.&lt;/p>
$$ T_{wsl2\_io} = \sum_{i=1}^{n} (t_{ext4_i} + t_{virt_i}) $$&lt;p>En los sistemas de archivos generales, como $t_{ext4} \ll t_{ntfs\_syscall} + t_{trans}$, cuando $n$ es muy grande (realizando decenas de miles a cientos de miles de operaciones de archivo), la diferencia en el tiempo de E/S entre WSL1 y WSL2 crece exponencialmente.&lt;/p>
&lt;p>Además, si la relación de sobrecarga del cálculo de la CPU en el entorno de virtualización es $\rho$, en la virtualización asistida por hardware moderna (Intel VT-x / AMD-V) se sitúa en alrededor de $\rho \approx 0.01 \sim 0.03$ (1 a 3%). Por lo tanto, incluso en tareas puramente computacionales, ofrece un rendimiento del $97\% \sim 99\%$, que es comparable al de un entorno Linux nativo.&lt;/p>
&lt;hr>
&lt;h2 id="3-instalación-y-construcción-de-la-base">3. Instalación y construcción de la base
&lt;/h2>&lt;p>En Windows 10/11, la instalación de WSL2 se ha vuelto muy sencilla. Simplemente abre PowerShell con privilegios de administrador y ejecuta el siguiente comando.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># WSL2 y Ubuntu se instalarán por defecto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Si especificas una distribución en particular&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Se puede comprobar con wsl --list --online&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-install&lt;/span> &lt;span class="n">-d&lt;/span> &lt;span class="n">Ubuntu&lt;/span>&lt;span class="p">-&lt;/span>&lt;span class="mf">24.04&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Después de la instalación, tras reiniciar, se te pedirá que configures un nombre de usuario y una contraseña de UNIX en el primer inicio. Este usuario es independiente del usuario de Windows y sólo es válido dentro de WSL.&lt;/p>
&lt;p>Si ya estás usando WSL1, conviértelo a WSL2 con los siguientes comandos.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Convierte una distribución existente a WSL2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-version&lt;/span> &lt;span class="n">Ubuntu&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Establece WSL2 como versión por defecto para las distribuciones que añadas en el futuro&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-set-default-version&lt;/span> &lt;span class="mf">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="4-el-secreto-del-control-de-recursos-wslconfig-y-wslconf">4. El secreto del control de recursos: .wslconfig y wsl.conf
&lt;/h2>&lt;p>Una de las mayores trampas de WSL2 es el &amp;ldquo;consumo ilimitado de memoria (el aumento de tamaño del proceso Vmmem)&amp;rdquo;. Como WSL2 utiliza la caché de páginas (page cache) del kernel de Linux, devora la memoria del host (Windows) sin cesar cada vez que realiza E/S. Para evitar esto, es imprescindible limitar los recursos usando un archivo de configuración.&lt;/p>
&lt;p>Los archivos de configuración de WSL2 se dividen en dos: &lt;strong>&lt;code>.wslconfig&lt;/code> que afecta a todo Windows&lt;/strong> y &lt;strong>&lt;code>wsl.conf&lt;/code> que afecta al interior de cada distribución&lt;/strong>.&lt;/p>
&lt;h3 id="41-wslconfig-lado-de-windows">4.1. .wslconfig (Lado de Windows)
&lt;/h3>&lt;p>Crea un archivo en el directorio de perfil de usuario de Windows (&lt;code>C:\Users\&amp;lt;nombre_de_usuario&amp;gt;\.wslconfig&lt;/code>) para controlar la asignación de recursos a la máquina virtual.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># C:\Users\&amp;lt;nombre_de_usuario&amp;gt;\.wslconfig&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[wsl2]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cantidad máxima de memoria para asignar a la VM. Se recomienda alrededor del 50% al 75% de la memoria total del host&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">memory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">16GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Número de núcleos de CPU a utilizar (si se omite, se usarán todos)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">processors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Tamaño del archivo de intercambio (swap)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">swap&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">8GB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Destino donde guardar el archivo de intercambio (si quieres ahorrar espacio en el disco C)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># swapfile=D:\\wsl\\swap.vhdx&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Habilitar el reenvío de localhost (para acceder a WSL desde Windows a través de localhost)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">localhostForwarding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Liberar memoria automáticamente (solo Windows 11)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Libera dinámicamente la caché de páginas y previene el crecimiento excesivo de Vmmem&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoMemoryReclaim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">dropcache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[experimental]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Funciones de red avanzadas disponibles en Windows 11 22H2 y posteriores&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Esto habilita el soporte de IPv6 y compartir la misma dirección IP entre WSL y Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">networkingMode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">mirrored&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">dnsTunneling&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">firewall&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">autoProxy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="42-wslconf-lado-de-linux">4.2. wsl.conf (Lado de Linux)
&lt;/h3>&lt;p>Edita &lt;code>/etc/wsl.conf&lt;/code> dentro de WSL para controlar el comportamiento específico de la distribución.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># /etc/wsl.conf (editar dentro de WSL)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[network]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Deshabilitar la generación automática de /etc/resolv.conf al iniciar WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Útil si quieres establecer tu propio DNS (ej. 8.8.8.8)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">generateResolvConf&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Establecer tu propio nombre de host&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">hostname&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">WSL-DevNode&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[automount]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Configuración para cuando se montan unidades de Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">enabled&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">options&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;metadata,uid=1000,gid=1000,umask=022&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cambiar el punto de montaje de la unidad C de /mnt/c a /c (hace la ruta más corta)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[boot]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Habilitar systemd (WSL 0.67.6 y posteriores)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Esto permite que snap y varios demonios (Docker, etc.) se ejecuten de forma nativa&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">systemd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[user]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># El usuario que inicia sesión por defecto&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">kenji&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Para aplicar estas configuraciones, es necesario ejecutar &lt;code>wsl --shutdown&lt;/code> en PowerShell para detener por completo la máquina virtual de WSL y luego reiniciarla.&lt;/p>
&lt;hr>
&lt;h2 id="5-el-entorno-de-terminal-definitivo-zsh--powerlevel10k">5. El entorno de terminal definitivo: Zsh + Powerlevel10k
&lt;/h2>&lt;p>La productividad no mejorará con bash por defecto. Combinaremos Zsh, que cuenta con una gran capacidad de autocompletado y visibilidad, con el ultrarrápido tema &amp;ldquo;Powerlevel10k&amp;rdquo; para construir el prompt más potente.&lt;/p>
&lt;h3 id="51-introducción-y-configuración-de-windows-terminal">5.1. Introducción y configuración de Windows Terminal
&lt;/h3>&lt;p>Instala &amp;ldquo;Windows Terminal&amp;rdquo; desde Microsoft Store. Abre la configuración JSON (&lt;code>settings.json&lt;/code>), establece el perfil predeterminado en WSL (Ubuntu) y cambia la fuente a una fuente Nerd para desarrollo (por ejemplo: &lt;code>HackGen Console NF&lt;/code> o &lt;code>MesloLGS NF&lt;/code>).&lt;/p>
&lt;h3 id="52-instalación-de-zsh-y-oh-my-zsh">5.2. Instalación de Zsh y Oh My Zsh
&lt;/h3>&lt;p>Ejecuta los siguientes comandos en el terminal de WSL.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Actualizar los paquetes e instalar Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install -y zsh git curl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ejecutar el script de instalación de Oh My Zsh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sh -c &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="53-introducción-a-powerlevel10k-y-plugins">5.3. Introducción a Powerlevel10k y plugins
&lt;/h3>&lt;p>Instala el tema Powerlevel10k y plugins (resaltado de sintaxis y autocompletado) que potencian aún más a Zsh.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Powerlevel10k&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone --depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> https://github.com/romkatv/powerlevel10k.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="p">/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/themes/powerlevel10k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-autosuggestions&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-autosuggestions &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-autosuggestions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># zsh-syntax-highlighting&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class="si">${&lt;/span>&lt;span class="nv">ZSH_CUSTOM&lt;/span>&lt;span class="k">:-&lt;/span>&lt;span class="p">~/.oh-my-zsh/custom&lt;/span>&lt;span class="si">}&lt;/span>/plugins/zsh-syntax-highlighting
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Edita &lt;code>~/.zshrc&lt;/code> y activa el tema y los plugins.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cambios en ~/.zshrc&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ZSH_THEME&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;powerlevel10k/powerlevel10k&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Añadir a la matriz (array) de plugins&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">plugins&lt;/span>&lt;span class="o">=(&lt;/span>git zsh-autosuggestions zsh-syntax-highlighting&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Al guardar y ejecutar &lt;code>source ~/.zshrc&lt;/code>, se iniciará el asistente de configuración de Powerlevel10k (&lt;code>p10k configure&lt;/code>). Sigue las instrucciones en pantalla para personalizar el prompt a tu gusto (estilo del prompt, con o sin iconos, información que mostrar, etc.). Podrás ver en tiempo real el nombre de la rama (branch) y el estado de Git, la versión de Node.js, el tiempo de ejecución del comando, lo que aumentará espectacularmente tu eficiencia en el desarrollo.&lt;/p>
&lt;hr>
&lt;h2 id="6-vs-code-remote---integración-perfecta-con-wsl">6. VS Code Remote - Integración perfecta con WSL
&lt;/h2>&lt;p>En el desarrollo con WSL2, la extensión &amp;ldquo;Remote - WSL&amp;rdquo; proporciona el mecanismo para acceder sin problemas a los archivos dentro de WSL desde un IDE (Visual Studio Code) instalado en el lado de Windows.&lt;/p>
&lt;h3 id="explicación-de-la-arquitectura">Explicación de la arquitectura
&lt;/h3>&lt;p>El siguiente diagrama de secuencia muestra cómo VS Code se comunica con WSL2.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Desarrollador&amp;#34;
participant V as &amp;#34;Interfaz de usuario de VS Code (Windows)&amp;#34;
participant S as &amp;#34;Servidor de VS Code (WSL2)&amp;#34;
participant F as &amp;#34;Sistema de archivos ext4 (WSL2)&amp;#34;
U-&amp;gt;&amp;gt;V: &amp;#34;Escribe `code .` en el terminal de WSL&amp;#34;
V-&amp;gt;&amp;gt;S: &amp;#34;Establece una conexión RPC a través de Vsock&amp;#34;
Note over V,S: Se comunica a través de un socket de Hyper-V sin utilizar TCP/IP
S-&amp;gt;&amp;gt;F: &amp;#34;Lee archivos fuente / Ejecuta el linter&amp;#34;
F--&amp;gt;&amp;gt;S: &amp;#34;Devuelve datos y análisis&amp;#34;
S--&amp;gt;&amp;gt;V: &amp;#34;Transmite los resultados del servidor de idiomas a la interfaz de usuario&amp;#34;
V--&amp;gt;&amp;gt;U: &amp;#34;Muestra resaltado de sintaxis y errores&amp;#34;
&lt;/pre>
&lt;p>El VS Code en el lado de Windows funciona simplemente como un &amp;ldquo;cliente ligero (thin client / UI)&amp;rdquo;, mientras que el procesamiento pesado, como el Language Server, el depurador (debugger) y la ejecución del terminal, son procesados íntegramente por el &amp;ldquo;Servidor de VS Code&amp;rdquo; en el lado de WSL. Esto te permite mantener tu entorno del lado de WSL limpio sin tener que instalar Node.js o Python en el lado de Windows.&lt;/p>
&lt;h3 id="configuraciones-obligatorias-en-vs-code">Configuraciones obligatorias en VS Code
&lt;/h3>&lt;p>Instala &lt;strong>&amp;ldquo;WSL&amp;rdquo; (ms-vscode-remote.remote-wsl)&lt;/strong> desde la sección &amp;ldquo;Extensiones&amp;rdquo; de VS Code. Luego, ve al directorio del proyecto en el terminal de WSL y simplemente ejecuta &lt;code>code .&lt;/code>, el VS Code del lado de Windows se abrirá en ese directorio.&lt;/p>
&lt;p>&lt;strong>Nota importante (El problema del código de salto de línea):&lt;/strong>
Los códigos de salto de línea difieren entre Windows y Linux (Windows es &lt;code>CRLF&lt;/code>, Linux es &lt;code>LF&lt;/code>). Si estás desarrollando en WSL, asegúrate siempre de unificar la configuración &lt;code>core.autocrlf&lt;/code> de Git o la configuración de archivos por defecto de VS Code a &lt;code>LF&lt;/code>. Si omites este paso, sufrirás errores misteriosos al ejecutar scripts de shell o contenedores de Docker.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Configuración del código de salto de línea para Git en el lado de WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global core.autocrlf input
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Añade también lo siguiente en &lt;code>settings.json&lt;/code> (configuración remota) de VS Code.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;files.eol&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;terminal.integrated.defaultProfile.linux&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;zsh&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-optimización-de-docker-desktop-e-integración-con-wsl2">7. Optimización de Docker Desktop e Integración con WSL2
&lt;/h2>&lt;p>Hay dos enfoques principales para usar Docker en el entorno WSL2:&lt;/p>
&lt;ol>
&lt;li>Instalar &lt;strong>Docker Desktop for Windows&lt;/strong> y habilitar la función de integración con WSL2.&lt;/li>
&lt;li>Instalar el &lt;strong>Docker Engine nativo&lt;/strong> directamente dentro de WSL2 (Ubuntu, etc.).&lt;/li>
&lt;/ol>
&lt;h3 id="enfoque-1-docker-desktop-recomendado">Enfoque 1: Docker Desktop (Recomendado)
&lt;/h3>&lt;p>Se suele recomendar esto en muchos casos porque facilita la gestión mediante interfaz gráfica (GUI) y el acceso transparente de los contenedores entre Windows/WSL. Verifica lo siguiente en la configuración de Docker Desktop (Settings).&lt;/p>
&lt;ul>
&lt;li>Marca la casilla de &lt;code>General&lt;/code> -&amp;gt; &lt;code>Use the WSL 2 based engine&lt;/code>.&lt;/li>
&lt;li>Marca la casilla de &lt;code>Resources&lt;/code> -&amp;gt; &lt;code>WSL Integration&lt;/code> -&amp;gt; &lt;code>Enable integration with my default WSL distro&lt;/code> y activa el interruptor (toggle button) de la distribución que vas a usar (Ubuntu).&lt;/li>
&lt;/ul>
&lt;p>Esto te permitirá ejecutar el comando &lt;code>docker&lt;/code> directamente desde el terminal de WSL2 y la comunicación con el demonio de Docker (Docker daemon) se realizará a través de máquinas virtuales ligeras y exclusivas (&lt;code>docker-desktop&lt;/code> y &lt;code>docker-desktop-data&lt;/code>) gestionadas por Docker Desktop.&lt;/p>
&lt;h3 id="enfoque-2-instalación-directa-de-docker-engine-nativo">Enfoque 2: Instalación directa de Docker Engine nativo
&lt;/h3>&lt;p>Si tienes restricciones por parte de la red corporativa (como evadir los costos de licencia de Docker Desktop) o deseas reducir la sobrecarga de rendimiento al extremo, instala Docker puramente como un servidor Ubuntu con &lt;code>systemd&lt;/code> habilitado en &lt;code>/etc/wsl.conf&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Fragmento de los pasos oficiales de instalación de Docker en WSL2 Ubuntu con systemd habilitado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install ca-certificates curl gnupg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo install -m &lt;span class="m">0755&lt;/span> -d /etc/apt/keyrings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod a+r /etc/apt/keyrings/docker.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Agregar el repositorio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=&amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>dpkg --print-architecture&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&lt;/span>&lt;span class="k">$(&lt;/span>. /etc/os-release &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$VERSION_CODENAME&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34; stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Agregar el usuario actual al grupo docker (para ejecutar sin sudo)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Después de reiniciar, &lt;code>systemctl start docker&lt;/code> funcionará exactamente igual que en un entorno Linux nativo, ofreciendo un alto rendimiento.&lt;/p>
&lt;hr>
&lt;h2 id="8-integración-de-claves-ssh-autenticación-perfecta-entre-windows-y-wsl">8. Integración de claves SSH: Autenticación perfecta entre Windows y WSL
&lt;/h2>&lt;p>Al hacer clones SSH de Git o conectarse por SSH a un servidor remoto, resulta muy molesto gestionar claves SSH separadas entre el lado de Windows y el lado de WSL. Para equilibrar seguridad y conveniencia, configuraremos un puente (bridge) para el agente SSH que se ejecuta en el lado de Windows (o un gestor de contraseñas como 1Password) hacia el lado de WSL.&lt;/p>
&lt;p>Aquí explicaremos cómo reenviar al socket de dominio UNIX (UNIX domain socket) de WSL2 mediante &lt;code>npiperelay&lt;/code> o &lt;code>socat&lt;/code>, empleando la &lt;strong>función del agente SSH de 1Password&lt;/strong> o el &lt;strong>Agente de autenticación de OpenSSH de Windows&lt;/strong>, como los enfoques más modernos y seguros.&lt;/p>
&lt;h3 id="reenvío-de-sockets-de-ssh-agent">Reenvío de sockets de ssh-agent
&lt;/h3>&lt;p>Normalmente, el agente SSH proporcionado como una tubería con nombre (Named Pipe) en Windows debe convertirse en un archivo de socket (socket file) en el lado de WSL. Es fácil utilizando la función de &lt;code>wsl-ssh-agent&lt;/code> o la proporcionada por 1Password.&lt;/p>
&lt;p>En la pantalla de configuración de 1Password, ve a &amp;ldquo;Desarrollador (Developer)&amp;rdquo; -&amp;gt; habilita &amp;ldquo;Usar el agente SSH (Use SSH agent)&amp;rdquo;.
Luego, añade la siguiente configuración a &lt;code>~/.zshrc&lt;/code> o &lt;code>~/.bashrc&lt;/code> en el lado de WSL, para enlazar el socket automáticamente al iniciar sesión.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Apunte en ~/.zshrc (Ejemplo usando 1Password SSH Agent)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">SSH_AUTH_SOCK&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nv">$HOME&lt;/span>/.ssh/agent.sock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Usar socat y npiperelay para reenviar si el socket no existe o el proceso no está enlazado al iniciar WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">ALREADY_RUNNING&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>ps -aux &lt;span class="p">|&lt;/span> grep &lt;span class="s2">&amp;#34;[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> wc -l&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> &lt;span class="nv">$ALREADY_RUNNING&lt;/span> -eq &lt;span class="m">0&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -S &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rm &lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Inicia socat en segundo plano (background) y conecta la tubería con nombre del lado de Windows al socket UNIX del lado de WSL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">(&lt;/span>setsid socat UNIX-LISTEN:&lt;span class="nv">$SSH_AUTH_SOCK&lt;/span>,fork EXEC:&lt;span class="s2">&amp;#34;npiperelay.exe -ei -s //./pipe/openssh-ssh-agent&amp;#34;&lt;/span>,nofork &lt;span class="p">&amp;amp;&lt;/span>&lt;span class="o">)&lt;/span> &amp;gt;/dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;em>Es necesario instalar de antemano &lt;code>npiperelay.exe&lt;/code> en el lado de Windows y añadirlo a la variable PATH (ruta).&lt;/em>&lt;/p>
&lt;p>Una vez completada esta configuración, al ejecutar &lt;code>ssh-add -l&lt;/code> desde el terminal de WSL, se mostrará una lista de claves públicas de las claves SSH registradas en 1Password o en el lado de Windows. Esto permite pasar la autenticación de forma segura sin copiar el archivo de la clave privada (private key) al interior de WSL.&lt;/p>
&lt;hr>
&lt;h2 id="9-mantenimiento-optimización-compresión-de-un-vhdx-inflado">9. Mantenimiento: Optimización (Compresión) de un VHDX inflado
&lt;/h2>&lt;p>Una de las mayores desventajas de WSL2 es la especificación en la que &amp;ldquo;el tamaño de archivo del disco virtual (.vhdx) del lado de Windows no se reduce automáticamente incluso al eliminar imágenes de Docker o borrar archivos&amp;rdquo;. Si el desarrollo continúa durante mucho tiempo, el archivo ext4.vhdx se hincha de decenas a cientos de GB.&lt;/p>
&lt;p>Para liberar espacio en disco, es necesario optimizar (comprimir - Compact) el VHDX periódicamente desde el lado de Windows.&lt;/p>
&lt;ol>
&lt;li>En primer lugar, apaga WSL por completo.
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">wsl&lt;/span> &lt;span class="p">-&lt;/span>&lt;span class="n">-shutdown&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>Abre PowerShell con privilegios de administrador y ejecuta el siguiente comando &lt;code>diskpart&lt;/code>, o el comando &lt;code>Optimize-VHD&lt;/code> del módulo de Hyper-V (este último solo se puede utilizar si Hyper-V está activado).&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Si el módulo Hyper-V está disponible&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Optimize-VHD&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$env:LOCALAPPDATA&lt;/span>&lt;span class="s2">\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span> &lt;span class="n">-Mode&lt;/span> &lt;span class="n">Full&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Si usas diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">diskpart&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Escribe interactivamente en la siguiente línea de comandos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="nb">select &lt;/span>&lt;span class="n">vdisk&lt;/span> &lt;span class="n">file&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s2">&amp;#34;C:\Users\&amp;lt;nombre_de_usuario&amp;gt;\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">attach&lt;/span> &lt;span class="n">vdisk&lt;/span> &lt;span class="n">readonly&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">compact&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">detach&lt;/span> &lt;span class="n">vdisk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DISKPART&lt;/span>&lt;span class="p">&amp;gt;&lt;/span> &lt;span class="n">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Realizar esta operación de forma regular te permitirá recuperar la capacidad desperdiciada del disco C.&lt;/p>
&lt;hr>
&lt;h2 id="10-conclusión">10. Conclusión
&lt;/h2>&lt;p>WSL2 ha superado por completo los límites de ser solo un &amp;ldquo;extra de Linux ejecutándose en Windows&amp;rdquo; y ha evolucionado hacia una potente plataforma de desarrollo equivalente, o incluso superior, a un sistema MacOS o Linux nativo.&lt;/p>
&lt;p>Al aplicar todas las configuraciones explicadas en este momento (optimización de recursos mediante &lt;code>.wslconfig&lt;/code>, potenciación del terminal con Zsh + Powerlevel10k, acceso transparente con VS Code Remote y mantenimiento de VHDX e integración de SSH), se completará el &amp;ldquo;entorno de desarrollo definitivo&amp;rdquo;, sin estrés, rápido y seguro.&lt;/p>
&lt;p>Lleva un poco de tiempo configurarlo, pero una vez que hayas solidificado la configuración, no hay duda de que la productividad de la ingeniería mejorará drásticamente en el futuro. Anímate y explora futuras personalizaciones basadas en esta guía, según tus preferencias y proyectos.&lt;/p></description></item></channel></rss>