← Default view
Rung Zero · Bench Test Console

WSL2 measures your userland. It has no probe for your machine.

MOD. WSL 2.9.3  ·  KERNEL linux-msft-wsl-6.18.y  ·  TRANSPORT plan9 (default) / virtiofs (opt-in)  ·  CAL. Jul 2026
Analog CRT oscilloscope beside a digital storage oscilloscope on a bench
Unit under test · 38 probes attached
▸ Primary readout

Spend 3–6 months in WSL2 to retire the userland risk — bash, coreutils, apt, git, Docker, dotnet/bun on Linux. That part is genuinely identical, and WSL2 now runs a real Microsoft-built Linux 6.18 kernel with systemd[1][2][3].

Then stop. WSL2 cannot teach you a display server, a bootloader, drivers, suspend/resume, or package-manager-owns-the-machine — and it hides the one decision that dominates day-one pain: your repos must live on ext4, not /mnt/c, which is exactly where a Dropbox-synced Windows folder puts them[4][5].

Channels live
8
Channels dead
9
Worst penalty
34×
Probes
38 sources
Depth
survey · 7 min
BANK A

Live channels

what WSL2 genuinely validates — transfers 1:1 to bare metal
CH 01
Kernel + syscall compatibility
readingMicrosoft-built kernel, branch linux-msft-wsl-6.18.y ⭐ 10k, serviced by Windows Update[1][2]
CH 02
bash / coreutils / apt / man
readingUnmodified distro userland — the shell you learn here is the shell you keep[1]
CH 03
systemd
readingSince WSL 0.67.6. Set [boot] systemd=true in /etc/wsl.conf, then wsl --shutdown[6][3]
CH 04
Docker / containers
readingFull syscall compat; native wslc runtime in public preview since 29 Jun 2026 (WSL 2.9.3), GA targeted autumn 2026[7]
CH 05
.NET CLI + debugging on Linux
readingVisual Studio ships a WSL launch profile; the runtime is the real linux-x64 runtime[8]
CH 06
GPU compute (CUDA)
compute onlyVia GPU-PV and /dev/dxg; nvidia-smi works with only the Windows driver installed[9][10]
CH 07
Linux GUI apps (WSLg)
windows onlyWSLg ⭐ 12k — Wayland + XWayland, Weston with an RDP backend, PulseAudio in/out, GPU accel via Mesa d3d12[11]
CH 08
Raw CPU / IO ceiling
85–95% of nativePhoronix, 15 Sep 2025, Ryzen 9 9950X3D, Ubuntu 24.04 vs bare metal: ~10–15% CPU overhead, up to ~20% on I/O[12][13]

Access panel open

WSL went open source at Build 2025 under MIT, so the seams are now inspectable: wsl.exe, wslservice.exe, the Linux-side init/gns/localhost daemons and the plan9 server[14][15]microsoft/WSL ⭐ 33k (Jul 2026)[16].

Still sealed: lxcore.sys (WSL1) and p9rdr.sys/p9np.dll, the \\wsl.localhost redirector[15].

BENCH TEST

Filesystem throughput

the number that decides your setup

Microsoft's own guidance: "We recommend against working across operating systems with your files… store your files in the WSL file system if you are working in a Linux command line."[4] The mechanism is a plan9 file server inside wslservice.exe reached over a Hyper-V socket — one round-trip per operation[17].

Sequential read · 1 MBfull scale 2400 MB/s
WSL ext4 (VHDX)
2393 MB/s
WSL → /mnt/c
86 MB/s
Windows → \\wsl$
156 MB/s
Sequential write · 100 MBfull scale 2830 MB/s
WSL ext4 (VHDX)
2827 MB/s
WSL → /mnt/c
294 MB/s
Windows → \\wsl$
10 MB/s
Random readfull scale 24 600 IOPS
WSL ext4 (VHDX)
24 554 IOPS
WSL → /mnt/c
725 IOPS
Windows → \\wsl$
1271 IOPS
Directory traversalfull scale 343 000 files/s
WSL ext4 (VHDX)
343 338 f/s
WSL → /mnt/c
13 561 f/s
Windows → \\wsl$
28 045 f/s
Source: wsl-filesystem-benchmark ⭐ 3 (Jul 2026)[5]. The canonical bug — microsoft/WSL#4197, 40.4 MB/s on /mnt under WSL2 vs 442 MB/s under WSL1 — is still open[18].
34×
slower on random reads the moment your repo sits under /mnt/c instead of ~/code.
<1%
of native write throughput when Windows writes into \\wsl$ — 10 MB/s against 2827.
50s
Hugo build on native ext4 · 75 s on virtiofs · 3–5 m or more on plan9[20]

⚠ 2026 change · virtiofs is selectable, not default

Set virtiofs=true under [wsl2] with kernel 6.18.26.3-1+ and /mnt/* stops going through plan9. A PR merged 27 May 2026 gave each virtio device its own DMA pool, removing the last SWIOTLB contention point. plan9 remains the default[19][17].

virtiofs closes most of the gap. It does not close it — see the build-time gauge above.

Alarm · the Dropbox trap

A repo under C:\Users\you\Dropbox\… is doubly penalised. Every git status, dotnet build and node_modules walk pays the cross-OS tax on the gauges above — and the sync client indexes tens of thousands of dependency files it cannot exclude per-directory[21].

The fix is not tuning. It is git clone into ~/code, and letting the remote be the sync mechanism. This is a rehearsal for bare metal, where /mnt/c does not exist at all.

▲ MEASUREMENT CEILING ▲

No instrument in this rack reads above this line. Every channel below is a real migration risk that WSL2 cannot retire — not badly, not partially. Structurally.

BANK B

Dead channels

substituted, simulated, or simply absent
No signal A GNOME Shell desktop session on Fedora Workstation

Display server

Substitute: WSLg remotes individual windows onto the Windows desktop via Weston + RDP

You never pick Wayland vs X11, never configure a compositor, never hit fractional scaling or multi-monitor bugs. A real DE needs an XRDP hack; GNOME Shell wants 3D accel XRDP can't give, and KDE Plasma 6.8 is Wayland-only[22][23].

No signal An NVIDIA discrete graphics card

GPU drivers

Substitute: /dev/dxg + stub libcuda.so in /usr/lib/wsl/lib, forwarding to the Windows driver

Installing a real Linux GPU driver breaks it — the stub symlinks get overridden and passthrough stops. You never do DKMS, kernel-module signing, or a Nouveau→proprietary switch[10].

No signal Tux, the Linux kernel mascot

Kernel ownership

Substitute: a Microsoft-built kernel, serviced by Windows Update

No apt-owned kernel, no headers or module rebuild, no bad-kernel rollback. The one thing that makes Linux yours is the one thing Windows keeps[1].

No signal A Linux distribution boot menu on a black screen

Bootloader / firmware

Substitute: none — the VM simply boots

No GRUB, no Secure Boot, no UEFI, and — the one that actually costs you a weekend — no "it doesn't boot" recovery drill.

No signal A closed laptop resting on a patterned surface

Suspend / resume

Substitute: none — Windows sleeps, the VM doesn't notice

Surfaces only as clock skew: "the VM for the WSL Linux distro doesn't have its clock updated when the host resumes." Fix is sudo hwclock -s — a symptom, not the test[24].

No signal A lithium-ion laptop battery pack

Battery / thermal / power

Substitute: Windows owns all of it

TLP, powertop, CPU governors, lid actions: untested, in every direction. On a laptop this is usually the deciding channel — and it reads nothing here.

No signal USB flash drives

Peripherals

Substitute: USB only via usbipd-win ⭐ 6.0k — attach-by-busid, exclusive to WSL while attached

Serial ports are unsupported outright. No udev-rules-for-a-real-device, no printer/scanner/webcam/fingerprint reality check[25][26][1].

No signal An Ethernet switch with populated ports

Networking

Substitute: NAT by default — own virtual adapter, unique IP that changes on restart

LAN exposure needs netsh portproxy. mirrored mode fixes most of it but IPv6 ::1 is unsupported and it silently falls back to NAT on builds lacking the feature. You never touch NetworkManager, nmcli, or Wi-Fi/VPN driver reality[27][28].

No signal A row of installed circuit breakers in a distribution board

Init / service ownership

Substitute: systemd runs — inside a distro cgroup managed by WSL

snapd still doesn't work[29], and systemd ≥ 256 needed plain cgroup v2 support that WSL's hybrid hierarchy lacked[30]. You get the syntax, not the ownership.

LOG

2026 sharp edges

known faults · read before first power-on
F-01 · MEM

Memory ballooning

The Linux page cache grows and Windows can't see it as reclaimable — Microsoft's own example shows 2 GB attributed to the VM while Linux is using 50 MB[31]. autoMemoryReclaim now defaults to dropCache; gradual is the gentler option[3].

F-02 · VHD

The disk only grows

Default max is 1 TB and deleting files does not shrink the file. Enable sparseVhd=true (or wsl --manage <distro> --set-sparse true) — but once sparse, Optimize-VHD refuses to compact it, so you are committed to automatic reclaim[3][32][33].

F-03 · FS

inotify does not cross the boundary

File-watching on /mnt/c doesn't fire, so Vite / Angular / dotnet watch HMR silently dies. The workaround is polling — or, correctly, moving the repo to ext4[34].

F-04 · FS

Case sensitivity inverts per tree

Windows drives mount case-insensitive by default (case=off); ext4 is case-sensitive. Mixed-case files created in WSL become unopenable from Windows tools, and git config core.ignorecase disagreements produce phantom conflicts[35].

F-05 · INIT

cgroup v1 is gone

WSL now isolates each distro's systemd into its own cgroup v2 hierarchy. IsolateDistroCgroup (default true) is the escape hatch for legacy v1 workloads[36][37].

F-06 · CFG

The 8-second rule

Config edits need the VM fully stopped (wsl --shutdown), not just the terminal closed[3].

CFG

Panel settings

%UserProfile%\.wslconfig · sane baseline for a 32 GB dev box
%UserProfile%\.wslconfig
[wsl2]
memory=16GB
processors=8
networkingMode=mirrored
virtiofs=true

[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
hostAddressLoopback=true
hostAddressLoopback and ignoredPorts only apply under mirrored[3]; virtiofs needs kernel 6.18.26.3-1+[19].
VERDICT

Risk matrix

which questions the console can answer at all
✓ Retired by WSL2
  • Will my .NET/TS toolchain build and debug on Linux?
  • Can I live in bash instead of PowerShell?
  • Do my Docker/compose/homelab deploy scripts work?
  • Will my ML/CUDA work run? — compute only
✗ Untouched by WSL2
  • Can I package-manage my own machine?
  • Will my laptop suspend, wake, and hold charge?
  • Will my GPU / Wi-Fi / fingerprint / dock work?
  • Which desktop environment do I actually want?
  • Can I recover an unbootable system?

Power-down condition

Stop learning from WSL2 when your friction stops being "how do I do X in Linux" and becomes "I want Linux to be the machine" — the point where WSL2 mistakes are still trivially unwound but the questions it can answer have run out[38]. Concretely, when all three read true:

  • aAll repos on ext4, with no /mnt/c dependency left anywhere in your workflow.
  • bsystemd units you wrote yourself — not units a tutorial pasted for you.
  • cA dotfiles repo you can git clone onto a fresh box and be at home in minutes.

At that point the next rung is a machine WSL2 can't simulate, and everything on the ✗ column has to be learned on real hardware.

PATCH BAY

38 probes

every reading on this console traces to one of these
survey

The staged ladder: what each rung of a Windows→Linux move actually proves

What each rung proves, what it structurally hides, the go/no-go signal, and the cost of retreating.

survey

Trial hardware and VM paths for evaluating Linux before you commit (2026)

Live USB first (€10, 15 minutes, proves your actual hardware), then a full install on an external NVMe SSD.

survey

Dual-boot Linux next to Windows in 2026 without wrecking the Windows install

Buy a second NVMe, keep the two OSes ignorant of each other, and pick Linux from the firmware boot menu.

survey

Dropbox on Linux and shared folders: what actually works in 2026

btrfs/zfs/xfs are supported now — but you cannot share one Dropbox folder between a Windows and a Linux install.

survey

Living in both OSes: running Windows and Linux for months without your setup rotting

One source of truth per asset class, replicated by a tool that knows the OS difference.

recon

Exit criteria and the blocker inventory: decide the Linux switch on evidence, not vibes

A fill-in blocker inventory plus tickable go/no-go criteria and a pre-committed rollback date.

Rung Zero Test Console · survey · 38 sources · Jul 2026 Full report · Expedition · Atlas