wsl-labs GitHub

📜 WSL — Historia, fundamentos y referencia completa de comandos#

Documento vivo. Pensado para crecer con el proyecto: aquí se consolidan la historia de WSL, sus fundamentos técnicos (WSL 1 vs WSL 2) y una referencia completa de comandos de wsl.exe y de configuración. Si echas algo en falta, este es el lugar para añadirlo. Complementa —no duplica— a docs/00-que-es-wsl.md, docs/02-comandos-basicos.md y cheatsheets/comandos-wsl.md.

1. 🏛️ Historia de WSL — por qué Microsoft lo creó#

El contexto: "Microsoft loves Linux"#

Cuando Satya Nadella asumió como CEO en 2014, Microsoft giró de forma radical su relación con el software libre. Ese mismo año acuñó públicamente la frase "Microsoft loves Linux" y empezó una apertura sostenida al open source: .NET pasó a ser open source, y Azure —el negocio en la nube que Nadella quería hacer crecer— empezaba a alojar muchísima carga de trabajo Linux.

La clave no fue idealismo, fue negocio: la nube que Microsoft quería vender corría, en buena parte, Linux. Pelearse con Linux era pelearse con sus propios clientes.

El problema de negocio: se iban los desarrolladores#

Los desarrolladores web, backend y cloud necesitaban herramientas Unix en su día a día: bash, grep, ssh, git, node, python, ruby, contenedores… En Windows, conseguir eso significaba doble arranque (dual-boot) o VMs pesadas. Resultado: mucha gente se pasaba a macOS o Linux de escritorio. Windows estaba perdiendo a la comunidad dev, justo el público que decide qué plataforma usan los equipos.

La respuesta de Microsoft fue traer Linux dentro de Windows, sin dual-boot y sin la fricción de una VM tradicional.

🧱 WSL 1 — traducción de syscalls (2016)#

(agosto de 2016)**.

mediante un driver de kernel (lxcore, apoyado en el mecanismo de pico processes). No había kernel Linux: los binarios ELF de Linux corrían y sus syscalls se traducían al kernel de Windows en tiempo real.

correr apps Android en Windows).

(por ejemplo, Docker no corría bien) y rendimiento pobre en ciertas operaciones del sistema.

🚀 WSL 2 — un kernel Linux real (2020)#

Linux realcompilado por Microsoft, bajo licencia GPL y distribuido vía Windows Update— dentro de una VM utilitaria ligera sobre Hyper-V**.

sistema de archivos Linux mucho mejor** que WSL 1.

más lento que en WSL 1, porque cruza la frontera entre la VM y el host.

Regla práctica: guarda tus proyectos dentro del sistema de archivos de Linux (~/ o \\wsl$\...), no en /mnt/c. En WSL 2 la E/S sobre /mnt/c es notablemente más lenta.

🖼️ WSLg y ⚙️ systemd#

directamente en el escritorio de Windows.

vía /etc/wsl.conf ([boot] systemd=true). Esto habilitó gestionar servicios con systemctl de forma nativa.

📊 Razones fundamentadas (resumen)#

RazónQué resolvía WSL
🧑‍💻 Retención de desarrolladoresEvitar que la comunidad dev migrara a macOS/Linux
🌐 Tooling web/backendbash, git, node, python, ruby, ssh nativos en Windows
🐳 Contenedores / DockerUn kernel Linux real (WSL 2) para correr Docker sin fricción
☁️ Cargas Linux de AzureDesarrollar en local igual que corre en la nube
💽 Evitar dual-boot / VMLinux integrado, sin reinicios ni VMs pesadas
🔵 Integración con VS CodeEditar en Windows, ejecutar en Linux, sin copiar archivos

🗓️ Línea de tiempo de hitos#

timeline
    title Hitos de WSL (2014 → 2026)
    2014 : Satya Nadella CEO
         : "Microsoft loves Linux"
         : .NET open source · Azure con carga Linux
    2016 : WSL 1 (Build 2016)
         : Windows 10 Anniversary Update (ago)
         : Traducción de syscalls (lxcore / pico processes)
    2019 : WSL 2 anunciado
         : Enfoque de kernel Linux real
    2020 : WSL 2 general
         : Windows 10 v2004 (may) · VM ligera sobre Hyper-V
    2021 : WSLg
         : Apps Linux con GUI en Windows
    2022 : systemd oficial
         : /etc/wsl.conf [boot] systemd=true
    2023 : Mirrored networking · Sparse VHD
         : App WSL Settings (GUI) · wsl --manage
    2025 : WSL open source (Build 2025)
         : github.com/microsoft/WSL
    2026 : WSL Containers (WSLC)
         : imágenes, volúmenes y redes nativas (wslc)

2. 🔬 WSL 1 vs WSL 2 — arquitectura#

La diferencia central es cómo se ejecuta Linux:

las syscalls** de Linux a llamadas del kernel NT.

sobre Hyper-V**; Windows habla con esa VM.

flowchart TB
    subgraph WSL1["🧱 WSL 1 · traducción de syscalls"]
        A1["Binarios ELF Linux"]
        A2["lxcore (driver)<br/>traduce syscalls Linux → NT"]
        A3["Kernel NT (Windows)"]
        A1 --> A2 --> A3
    end

    subgraph WSL2["🚀 WSL 2 · kernel real en VM"]
        B1["Binarios ELF Linux"]
        B2["Kernel Linux real<br/>(compilado por Microsoft, GPL)"]
        B3["VM utilitaria ligera"]
        B4["Hyper-V"]
        B1 --> B2 --> B3 --> B4
    end

Tabla comparativa#

Aspecto🧱 WSL 1🚀 WSL 2
Compatibilidad de syscallsParcial (traducción)Total (kernel real)
Rendimiento FS Linux (~/)BuenoMuy bueno
Rendimiento /mnt/c (archivos Windows)Más rápidoMás lento (cruza la VM)
ArranqueCasi instantáneoLigeramente mayor (levanta la VM)
Docker❌ Problemático✅ Nativo y recomendado
Uso de memoriaMenorMayor (VM; se libera con --shutdown)
Cuándo usarloTrabajo intensivo sobre archivos de WindowsPor defecto: contenedores, servicios, dev general
WSL 2 es el recomendado para casi todo, y es lo que asume este repo. Fija WSL 2 como versión por defecto con wsl --set-default-version 2.

3. 🖥️ WSL y la "plataforma desktop" (la brecha con Docker se está cerrando)#

Históricamente, frente a Docker —que trae Docker Desktop con GUI oficial, panel de contenedores, imágenes y volúmenes— WSL se gestionaba solo por CLI (wsl.exe + Windows Terminal), sin panel de escritorio para operar servicios de un vistazo. Eso ya no es del todo cierto: Microsoft ha ido añadiendo piezas de "plataforma".

configuración de WSL (equivale a editar .wslconfig, pero con categorías y validación). Ya hay una interfaz de escritorio, aunque orientada a ajustes, no a operar servicios.

incluidas distros WSL.

nativas con el comando wslc (ver la sección §4 más abajo). Esto acerca WSL a la paridad con Docker sin depender de Docker Desktop**.

Dónde encaja wsl-labs: WSLC cubre contenedores; lo que sigue sin tener una GUI oficial es operar servicios Linux "clásicos" (nginx, apache, postgres…) directamente sobre la distro. Ese es el hueco que llena este repo:

detener esos servicios y ver su salud (📦 Instalar → ▶ Levantar), al estilo panel.

abre el navegador.

Ver el detalle en el README y en la guía docs/DASHBOARD_SETUP.md.

Esta pieza es deliberadamente extensible: el Control Center puede crecer con más servicios y funcionalidades a futuro (nuevos labs, métricas, acciones, e incluso integrarse con wslc para contenedores).

4. 🆕 WSL hoy (2025-2026): open source y contenedores nativos (WSLC)#

WSL dejó de ser una caja negra y se acercó mucho a Docker. Dos cambios grandes:

🔓 WSL es open source (Build 2025)#

El 19 de mayo de 2025, en Microsoft Build, WSL se liberó como open source. El código vive en github.com/microsoft/WSL.

ComponenteRolEstado
wsl.exe, wslconfig.exe, wslg.exeEjecutables de entrada desde Windows✅ Open source
wslservice.exeServicio que levanta la VM y las distros✅ Open source
init, gns, localhost, plan9Daemons Linux (arranque, red, port-forward, archivos)✅ Open source
microsoft/WSL2-Linux-KernelKernel Linux de WSL 2✅ Open source
microsoft/wslgGUI de apps Linux (Wayland/X)✅ Open source
Lxcore.sys (driver WSL 1), P9rdr.sys/p9np.dllKernel de WSL 1 y redirección \\wsl.localhost🔒 Aún cerrados

🐳 WSL Containers (WSLC) — imágenes, volúmenes y redes nativas#

Esto es lo que probablemente escuchaste: Windows metió, dentro de WSL, un motor de contenedores tipo Docker — con imágenes, volúmenes y redes — para correr cargas Linux sin necesidad de Docker Desktop (cuyo backend WSL2 es una fuente habitual de fallos para muchos usuarios). Tiene dos caras:

``powershell # Correr un contenedor wslc run --rm -it ubuntu:latest bash -c "echo Hola desde un contenedor WSL" # Listar imágenes wslc image ls # Servidor web publicando puerto wslc run -it --rm -d -p 8080:80 --name web nginx curl localhost:8080 # Ver y detener contenedores wslc container ps wslc container stop web ``

(proyecciones C, C# y C++/WinRT) para que apps de Windows usen contenedores Linux programáticamente (objetos WslcService, Session, Container, Process; soporta montajes de archivos, red, GPU y stdin/stdout).

Capacidades (preview): imágenes (build, pull, push, import, save, inspect, prune) · contenedores (create/run/start/kill/export con límites --cpus, --memory, --shm-size) · redes (crear/gestionar, alias, publicar puertos) · volúmenes respaldados por VHD.

Comparativa mental: wslcdocker nativo dentro de WSL. Para contenedores usa wslc; para servicios Linux "de sistema" (nginx/apache/postgres como demonios de la distro) usa el panel de wsl-labs. Son complementarios.

📦 Distros desde imágenes de contenedor#

También puedes construir una distro WSL a partir de una imagen Docker/OCI: exportas el rootfs de un contenedor a un .tar (gzip) y lo importas con wsl --import. Ver Build a Custom Linux Distro for WSL en la documentación de Microsoft.

🌐 Otras mejoras recientes#

FunciónQué aportaCómo
Mirrored networkingEspeja las interfaces de red de Windows en Linux (mejor compatibilidad)networkingMode=mirrored en .wslconfig (Win 11 22H2+)
Sparse VHDEl disco de la distro se encoge solowsl --manage <distro> --set-sparse true
DNS tunneling / autoProxyMejor DNS y proxy heredado de Windows.wslconfig
wsl --manageGestión avanzada de la distro (mover, sparse, default-user)CLI
Documento vivo: WSL evoluciona rápido. Fuentes oficiales: WSL Containers · WSL open source · anuncio Build 2025.

5. ⌨️ Referencia completa de comandos WSL (wsl.exe desde Windows)#

Estos comandos se ejecutan desde PowerShell / CMD / Windows Terminal, no dentro de la distro. Para comandos de dentro de Linux, ve a la sección 6.

📦 Instalación y actualización#

ComandoDescripción
wsl --installInstala WSL 2 + la distro por defecto (Ubuntu). Requiere reinicio la 1.ª vez
wsl --install -d <distro>Instala una distro concreta (p. ej. -d Debian)
wsl --updateActualiza el kernel Linux de WSL (vía Windows Update)
wsl --versionMuestra versiones de WSL, kernel, WSLg, etc.
wsl --statusEstado general: distro por defecto, versión por defecto, kernel
wsl --list --onlineLista las distros disponibles para instalar desde el catálogo
# Instalar WSL 2 + Ubuntu (reinicia si es la primera vez)
wsl --install

# Instalar una distro específica
wsl --install -d Debian

# Actualizar el kernel de WSL
wsl --update

🗂️ Gestión de distribuciones#

ComandoDescripción
wsl -l -vLista distros instaladas con estado y versión (1 o 2)
wsl --set-default <distro>Fija la distro por defecto (la que abre wsl sin argumentos)
wsl --set-version <distro> 2Convierte una distro existente a WSL 2 (o 1)
wsl --set-default-version 2Fija la versión por defecto para nuevas distros
wsl --unregister <distro>Elimina la distro y todos sus datos
wsl -l -v
wsl --set-default Ubuntu
wsl --set-version Ubuntu 2
wsl --set-default-version 2
wsl --unregister <distro> es destructivo: borra la distro y sus datos sin vuelta atrás. Haz un wsl --export antes (ver Backup y portabilidad).

🔄 Ciclo de vida#

ComandoDescripción
wslAbre una shell en la distro por defecto
wsl -d <distro>Abre una shell en una distro concreta
wsl --shutdownApaga todas las distros y la VM de WSL 2 (libera memoria)
wsl --terminate <distro>Detiene una distro concreta
wsl -u <user> / wsl -u rootEntra como un usuario concreto (p. ej. root)
wsl -e <cmd>Ejecuta un comando en la distro y sale
wsl -- <cmd>Todo lo que va tras -- se pasa tal cual a la distro
wsl --cd <path>Abre la shell en un directorio de trabajo concreto
wsl -d Ubuntu                 # shell en Ubuntu
wsl --shutdown                # apaga todo WSL (libera RAM)
wsl --terminate Ubuntu        # detiene solo Ubuntu
wsl -u root -d Ubuntu         # shell como root
wsl -d Ubuntu -e uname -a     # ejecuta un comando y sale
wsl --cd ~ -d Ubuntu          # abre en el home de Linux

💾 Backup y portabilidad#

ComandoDescripción
wsl --export <distro> <archivo.tar>Exporta la distro completa a un .tar
wsl --import <nombre> <carpeta> <archivo.tar>Importa un .tar como nueva distro
wsl --import-in-place <nombre> <archivo.vhdx>Registra un .vhdx existente como distro
wsl --mount <disco>Monta un disco/partición física dentro de WSL
wsl --unmount [<disco>]Desmonta un disco montado (todos si se omite)
# Backup completo de la distro
wsl --export Ubuntu .\ubuntu-backup.tar

# Restaurar como una distro nueva en WSL 2
wsl --import Ubuntu-Lab .\Ubuntu-Lab .\ubuntu-backup.tar --version 2

Más detalle en el cheatsheet de comandos WSL.

🧭 Ejemplos reales de wsl-labs#

El Control Center invoca la distro desde Windows con esta forma —usuario root, shell de login, comando entre comillas— para instalar y levantar servicios:

# Patrón que usa el Control Center para operar la distro
wsl -d Ubuntu -u root -- bash -lc "systemctl start nginx && ss -tlnp | grep :8080"

# Levantar el stack y comprobar salud de un servicio
wsl -d Ubuntu -u root -- bash -lc "service postgresql start && pg_isready"

6. 🐧 Comandos dentro de la distro (Linux) útiles en WSL#

Una vez dentro de la distro, la gestión es Linux estándar:

ComandoUso
`service <svc> start\stop\status`Gestión clásica de servicios (SysV)
`systemctl start\status\enable <svc>`Gestión de servicios con systemd (requiere [boot] systemd=true)
ss -tlnpPuertos en escucha (sustituto moderno de netstat)
curl -I http://localhost:8080Probar un servicio HTTP local
sudo apt update && sudo apt upgrade -yActualizar paquetes
journalctl -u <svc> -eVer logs de un servicio bajo systemd
Para el detalle de comandos Linux del día a día, cruza a docs/02-comandos-basicos.md, cheatsheets/comandos-linux.md y cheatsheets/systemd.md.

7. ⚙️ Configuración: .wslconfig y /etc/wsl.conf#

Hay dos archivos de configuración con ámbitos distintos:

ArchivoÁmbitoUbicación
.wslconfigGlobal (toda la VM de WSL 2)%UserProfile%\.wslconfig (Windows)
/etc/wsl.confPor distroDentro de cada distro Linux

.wslconfig — límites globales de la VM#

Controla memoria, CPU, swap y red de la VM utilitaria de WSL 2.

# %UserProfile%\.wslconfig
[wsl2]
memory=4GB              # RAM máxima para la VM
processors=2            # núcleos asignados
swap=2GB                # tamaño del swap
vmIdleTimeout=60000     # ms de inactividad antes de suspender la VM
networkingMode=mirrored # modo de red (p. ej. mirrored)
Tras editar .wslconfig, aplica los cambios con wsl --shutdown y vuelve a abrir la distro.

/etc/wsl.conf — ajustes por distro#

Configura systemd, montajes automáticos, red y usuario por defecto de esa distro.

# /etc/wsl.conf (dentro de la distro)
[boot]
systemd=true            # habilita systemd (systemctl, journalctl)

[automount]
enabled=true            # monta discos de Windows en /mnt
options=metadata        # permite permisos/propietario en /mnt

[network]
generateHosts=true      # gestiona /etc/hosts

[user]
default=vlad            # usuario por defecto al entrar
Los cambios en /etc/wsl.conf no se aplican en caliente: ejecuta wsl --shutdown en Windows y reinicia la distro.

8. 🔗 Ver también#

Fuente: docs/wsl-historia-y-referencia.md