Windows Subsystem for Linux: A History from Bash-on-Windows to WSL2

When Microsoft announced “Bash on Ubuntu on Windows” at Build 2016, most of the room assumed it was a joke. A decade later, WSL is one of the most-used developer features Windows ships, and its evolution from translation layer to full VM is a good case study in getting an idea right the second time.

WSL1: Translating Syscalls

The original WSL didn’t run Linux at all — it translated Linux syscalls into equivalent Windows NT kernel calls in real time, via a compatibility layer called the Pico process. This made file access blazing fast (it was genuinely Windows I/O underneath) but broke down for anything relying on syscalls without a clean NT equivalent, like certain networking primitives or Docker’s use of cgroups.

WSL2: An Actual Linux Kernel

WSL2, released in 2019, abandoned translation entirely and instead runs a real, lightweight Linux kernel inside a fast-booting Hyper-V VM. This fixed compatibility completely — full syscall support, real Docker support — at the cost of slower cross-filesystem I/O between Windows and Linux.

Checking Your Version

wsl -l -v
wsl --status

# Convert an existing WSL1 distro to WSL2
wsl --set-version Ubuntu-24.04 2

Where This Is Heading

Recent WSL releases have moved to a Microsoft Store-distributed, independently updatable model decoupled from Windows releases entirely, along with GUI app support (WSLg) and GPU passthrough — steadily closing the gap between “a Linux environment on Windows” and “just running Linux,” without giving up native Windows integration.