# Subsistema de Windows para Linux

Subsistema de Windows para Linux (WSL) es una capa de compatibilidad desarrollada por Microsoft para ejecutar binarios de Linux (en formato ELF) nativamente en Windows 10, Windows Server 2019, Windows 11 y Windows Server 2022.
A partir de junio de 2019 está disponible WSL versión 2, el cual incorpora cambios importantes, como el uso de un núcleo Linux real.

## Visión general

WSL provee una interfaz que simula un kernel de Linux (sin contener código de Linux propiamente dicho), el cual puede ejecutar aplicaciones de espacio de usuario GNU, por ejemplo, una instalación base de Ubuntu, openSUSE, SUSE Linux Enterprise Server, Debian y Kali Linux. Dicho entorno puede contener una shell Bash, junto con ejecutables de línea de comandos GNU/Linux nativos (sed, awk, etc.), lenguajes de programación (Ruby, Python, etc.), e incluso algunas aplicaciones gráficas (con la ayuda de un servidor X11).
Se puede considerar la contraparte de Wine, y al igual que este, Windows no es capaz de arrancar ejecutables ELF por sí mismo, sino que requiere de un entorno provisto por las distribuciones (descargables desde Microsoft Store e instaladas como Aplicaciones), y un lanzador provisto por dicho entorno. (véase Arquitectura más adelante para más detalles).

## Introducción y disponibilidad

Cuando fue introducido junto con el Anniversary Update, solo una imagen de Ubuntu estuvo disponible. Fall Creators Update movió el proceso de instalación de las distribuciones de Linux al Microsoft Store, y fueron introducidas imágenes de Fedora y Suse.
WSL está disponible sólo para las ediciones de Windows 10 de 64 bit, y puede ser activado a partir de la versión 1607. También está disponible en Windows Server 2019.
El 6 de mayo de 2019 se anunció la versión 2 de WSL, el cual incorpora un núcleo Linux real. A partir de junio de 2019 está disponible a través del programa Windows Insider en todas las ediciones de Windows 10 (incluyendo Home). Ambas versiones pueden coexistir, y Microsoft no tiene planes para relegar WSL 1.

## Desarrollo

Los primeros intentos de Microsoft para alcanzar compatibilidad con sistemas tipo UNIX comenzó con Microsoft POSIX subsystem, posteriormente reemplazado por Windows Services for UNIX vía MKS/Interix, el cual se volvería obsoleto tras el lanzamiento de Windows 8.1. La tecnología detrás de WSL tiene sus orígenes en el Proyecto Astoria, el cual permitió correr algunas aplicaciones Android en Windows 10 Mobile. Esta característica está disponible a partir de la entrega de Windows 10 Insider Preview build 14316.
Mientras que proyectos previos de Microsoft y otros de terceros como Cygwin se han enfocado en crear sus propios entornos tipo UNIX basados en los estándares POSIX, WSL se enfoca en la compatibilidad con los ejecutables de Linux (de manera similar a Wine con los ejecutables de Windows). En lugar de envolver funcionalidades no nativas dentro de las llamadas al sistema en la API de Win32, WSL aprovecha el modo Executive de Windows NT para correr los programas de Linux como un proceso especial aislado (conocido como "pico-processes") unidos al modo Kernel ("pico-providers") como manejadores de excepciones y llamadas al sistema diferentes de los procesos de Windows NT normales.
Microsoft prevé a WSL como una "herramienta enfocada principalmente a desarrolladores que trabajen con proyectos de código abierto". WSL usa menos recursos que una máquina virtual, la forma más directa de ejecutar Linux en un entorno Windows, al tiempo de permitir a los usuarios trabajar con las aplicaciones de Windows y Linux sobre el mismo conjunto de archivos.

## Arquitectura
### Versión 1

LXSS Manager Service es el servicio encargado de interactuar con el subsistema (a través de los drivers lxss.sys y lxcore.sys), y la forma en cómo Bash.exe (no confundir con las Shell provistas por las distribuciones Linux instaladas) lanza los procesos de Linux, así como también manejar las llamadas al sistema de Linux y el bloqueo de los binarios mientras la operación de ejecución está en curso.
Todos los procesos Linux invocados por un usuario en particular van dentro de una "Instancia de Linux" (usualmente, el primer proceso invocado es init). Una vez que todas las aplicaciones son cerradas, se cierra la instancia (de ser necesario, se deberá cerrar forzadamente el proceso init).

#### Acceso al hardware y sistema de archivos

Como no hay emulación/virtualización de hardware (a diferencia de otros proyectos como coLinux), WSL hace uso directo del sistema de archivos anfitrión (a través de VolFS y DrvFS) y parte del hardware, como la red (los servidores web por ejemplo, podrán ser accedidos a través de las mismas interfaces y direcciones IP configuradas en el host, y comparte las mismas restricciones de uso de puertos que requieren permisos administrativos, o puertos ya ocupados por otras aplicaciones), lo que garantiza la interoperabilidad.
Hay ciertas ubicaciones (como las carpetas del sistema) y configuraciones cuyo acceso/modificación está restringido, incluso ejecutando sudo desde la shell. Se debe lanzar una instancia con privilegios elevados para obtener un "sudo real" y permitir dicho acceso.

#### Limitaciones

Este subsistema no es capaz de correr todo el software Linux, como los binarios de 32 bits, o esos que requieren servicios específicos del núcleo Linux sin implementar en WSL. Dado que no existe un núcleo Linux "real" en WSL, tampoco se han lanzado las cabeceras del kernel, lo que impide construir controladores y otros programas que dependen del kernel (como drivers, o contenedores como Docker).
Es posible ejecutar algunas aplicaciones gráficas (como Mozilla Firefox) instalando un servidor X11 dentro del entorno de Windows (como Xming), aunque no exento de problemas, como la falta de soporte de audio o aceleración por hardware (dando como resultado un pobre rendimiento gráfico). El soporte para OpenCL y CUDA tampoco está implementando, aunque planificado para futuros lanzamientos.
Dado lo anterior, Microsoft indica explícitamente que WSL está orientado al desarrollo de aplicaciones, y no como un entorno de escritorio o servidor de producción, recomendando el uso de máquinas virtuales (Hyper-V o Kubernetes) y Azure para esos propósitos.

### Versión 2

La versión 2 introduce cambios radicales en la arquitectura. Microsoft ha optado por la virtualización a través de un subconjunto de características de Hyper-V, junto con un núcleo Linux real altamente optimizado (basado en la rama principal 4.19), lo que habilita acceso completo a la API de Linux, permitiendo ejecutar servicios como Docker. Los desarrolladores no necesitan hacer cambios en sus distribuciones, manteniendo la compatibilidad con WSL 1. A diferencia de una máquina virtual, las instancias de WSL2 arrancan instantáneamente.
La instalación de la distribución reside en su propia imagen de disco virtual con formato ext4, y el acceso al sistema de archivos anfitrión se lleva a cabo de manera transparente a través del protocolo 9P. Se promete un incremento sustancial en el rendimiento de lectura y escritura.

## Capturas de pantalla

* Firefox para Linux corriendo sobre WSL
* Synaptic corriendo sobre WSL