- La estructura de subsistema de Windows NT ha estado compuesta por una capa de conversión de llamadas a API para ejecutar programas de otros sistemas operativos.
- WSL1 siguió esta tradición y funciona como una capa de traducción liviana que convierte llamadas de Linux en llamadas al kernel de Windows.
- WSL2 evolucionó a una VM Linux completa basada en Hyper-V para resolver problemas de rendimiento y ejecuta un kernel Linux real.
- WSL2 ofrece una integración más alta que una VM típica mediante administración dinámica de memoria, montaje de unidades de Windows y integración de GUI mediante WSLg.
- Aunque hay limitaciones como la incomodidad en la gestión de archivos y la dependencia de la imagen del disco, es importante la flexibilidad de aprovechar de manera selectiva las ventajas de WSL1 y WSL2.
Concepto de subsistema de Windows NT
- El subsistema (subsystem) de Windows NT significa un conjunto de API y capa de transformación de llamadas para ejecutar programas de otros sistemas operativos.
- En el NT anterior existían OS/2 subsystem (OS2SS.EXE), POSIX subsystem (PSXSS.EXE) y otros.
- CSRSS.EXE es la capa de transformación de la API Win32, y algunas funcionalidades se trasladaron al modo kernel (
WIN32K.SYS).
- El subsistema POSIX fue una implementación mínima para certificación gubernamental y luego fue reemplazado por Windows Services for Unix basado en Interix.
WSL1: Capa Linux basada en traducción
- WSL1 (Windows Subsystem for Linux) es una capa de traducción delgada que transforma las llamadas del sistema Linux en llamadas de Windows.
- Al ejecutar se usa solo unos pocos MB de memoria con el proceso
bash, y en el Task Manager se muestra como un proceso normal.
- El sistema de archivos raíz existe como una estructura de archivos individuales sobre NTFS, por lo que la sobrecarga de espacio de almacenamiento es casi nula.
- Limitaciones
- Degradación de rendimiento de I/O: costo de conversión debido a diferencias entre las API de sistema de archivos de Linux y Win32.
- Requiere un servidor X externo para ejecutar GUI (por ejemplo: X410).
- No admite raw sockets, por lo que no se pueden ejecutar
traceroute, nmap, tcpdump, entre otros.
WSL2: VM Linux basada en Hyper-V
- Según la demanda de los usuarios, Microsoft introdujo una VM Linux completa que funciona sobre Hyper-V.
- El sistema de archivos raíz se administra como un único archivo VHDX.
- Se puede convertir entre WSL1 y WSL2 con el comando
wsl --set-version "Ubuntu" 2.
- Características de rendimiento
- El arranque inicial es más lento, pero ejecuta un kernel Linux nativo.
- El uso de memoria es dinámico y puede expandirse hasta la mitad de la memoria física máxima.
- En pruebas con
stress, el uso de memoria aumenta según la carga y luego se reduce automáticamente.
- Si hace falta, se puede apagar la VM con el comando
wsl --shutdown.
Integración y límites de WSL2
- WSL2, a diferencia de una VM tradicional, fortalece la integración con Windows.
- Montaje automático de unidades de Windows, acceso a unidades de Linux mediante la ruta
\\wsl$\, y ejecución de aplicaciones GUI con WSLg.
- Las aplicaciones GUI se transmiten por el protocolo Remote Desktop, y la configuración de DPI o escala de texto debe hacerse por separado.
- Problemas de gestión de archivos
- Los datos de trabajo en Linux se guardan dentro de la imagen
ext4.vhdx, con riesgo de portabilidad y recuperación.
- Al ejecutar
wsl --unregister Distro, todos los datos se eliminan de inmediato.
- Al usar unidades de Windows (
/mnt/c) hay degradación de rendimiento por la sobrecarga de NTFS + VM.
- Protocolo de sistema de archivos
- WSL1 usa
drvfs, WSL2 usa el protocolo 9p de Plan 9.
- Se mencionan casos de bugs en los que queda
drvfs durante el proceso de conversión.
- Alternativa
- Se recomienda separar los datos de trabajo creando una imagen VHDX adicional y montándola con
wsl --mount --vhd.
- La configuración automática desde
.wslconfig no es posible; debe manejarse mediante scripts.
Conclusión
- El diseño modular y ABI de kernel estable de Windows NT mantiene compatibilidad con controladores antiguos.
- WSL1 tiene como ventaja su bajo uso de memoria, y WSL2 brinda mayor compatibilidad y rendimiento con un kernel Linux real.
- WSL2 minimiza las desventajas de una VM y fortalece la integración con el sistema operativo host.
- Aunque por definición tradicional se parece a una VM, tiene valor como “subsistema” por ser un entorno de integración ligera.
3 comentarios
Vaya, hasta está Ssuk, el desarrollador.
Comentario de Hacker News
WSL2 funciona sobre un subconjunto de Hyper-V, y en esencia es una VM sobre un hipervisor
Pero tiene diferencias frente a una VM normal de Hyper-V. Por ejemplo, las distribuciones Linux de WSL2 pueden usar aceleración por GPU incluso en entornos X o Wayland mediante particionado de GPU (es decir, PCI/GPU passthrough) y una implementación especial de DirectX
Estas funciones también se pueden lograr en Hyper-V normal con hacks vía PowerShell y similares, pero oficialmente solo están soportadas en Windows Server
Eso sí, es un malentendido decir que “X o Wayland se encargan del renderizado”. Quien realmente usa la GPU es la propia aplicación, y X/Wayland solo se encargan más o menos de la composición de ventanas después de que termina el renderizado
También hay tareas complejas como la conversión de color, pero la carga de cómputo es baja
WSL1 se basa en pico process, una tecnología derivada de la investigación Drawbridge
Ver también The Linux Kernel Hidden Inside Windows 10 y WSL Pico Process Overview
La misma tecnología Drawbridge también se usa para ejecutar SQL Server en Linux
Está explicado en detalle en un artículo de Ars Technica
Entiendo por qué hicieron el cambio a WSL2, pero es una lástima que hayan detenido por completo el desarrollo de WSL1
Nuestro entorno de CI es mayormente Linux, pero algunas toolchains no funcionan bien en Wine, como MSVC
Por eso necesitábamos un entorno donde fuera posible ejecutar compilaciones Linux de forma fluida en Windows. WSL1 lo hacía posible, pero WSL2 no comparte namespaces de procesos ni descriptores de archivo, así que hacen falta varios workarounds
La velocidad de IO mejoró, pero compartir archivos es lento, así que no sirve para uso real
/mnt/cHace tiempo compilé así un módulo de extensión C para Python
WSL2 es una VM muy estrechamente integrada con el entorno Windows
En mi empresa tengo que usar Windows por política, así que lo uso a diario para desarrollo, y en la mayoría de los casos resulta bastante cómodo
Eso sí, como está basado en RHEL8, me incomoda que solo haya soporte para la familia Debian. Me pregunto cómo anda hoy el soporte para apps gráficas
psotopsolo se ve el proceso de la VM.Con
docker run -it ubuntutambién se logra algo parecido, así que me pregunto cuál es la diferencia real.En lo personal, el espacio de trabajo separado me resultó muy incómodo
WSL2 al final es una VM liviana. Es un concepto parecido a Firecracker, orientado a arranque rápido y bajo uso de memoria
Pero si ejecutas varios contenedores Docker, la demanda de memoria sube bastante. Para estar cómodo, hacen falta al menos más de 20 GB
Personalmente, WSL1 me parece mucho más útil. La mayoría de las herramientas CLI como toolchains de C++ y .NET, además de ssh/scp, funcionan bien
En cambio WSL2 casi no me sirve. Si necesito una VM Linux, uso VMware
VMware ofrece muchas funciones como árbol de snapshots, aceleración 3D, conexión de dispositivos USB y configuración de red virtual, además de una GUI cómoda
Al disco de la VM interna de WSL se puede acceder por la ruta
\\wsl$Si un software antiguo no soporta rutas UNC, se puede resolver mapeándolo a una letra de unidad
Está el problema de que el archivo VHDX sigue creciendo. Hay que compactarlo manualmente
systemd-trimpuede resolver parte del problemaVer el issue relacionado en GitHub WSL #12103
Si aun así no funciona, se puede usar este método de optimización manual
Como referencia, WSL por defecto omite las reglas del firewall de Windows. Me pregunto por qué Microsoft lo diseñó así
Me pregunto si sería posible montar una partición ext4 real para reducir la pérdida de rendimiento causada por la simulación de dispositivos de bloque basada en archivos de imagen
A medida que empecé a usar WSL2 con más frecuencia y fui dejando de usar Linux cada vez menos, me puse a pensar: ¿esto también es EEE?
EEE - adoptar, extender y extinguir (Embrace, Extend, and Extinguish)