DEV Community

karleeov
karleeov

Posted on

wsl2 config

I have being using wsl2 for development for like 4 years i tested arch and other linux but i still find the Ubuntu 24 still more stable for work

here my wsl2 setup to share
https://github.com/karleeov/wslsetup

WSL2 can deliver near-native Linux performance on Windows when configured correctly. This post documents a proven configuration optimized for a workstation with an Intel i9-12900 (16C/24T) and 128GB RAM. It includes the global .wslconfig, per-distro /etc/wsl.conf, rationale for each setting, and reproducible setup steps.

Note: Settings are safe defaults for heavy development. Adjust to your hardware and workload.

Hardware profile and targets

  • CPU: Intel i9-12900 (16 cores, 24 threads)
  • RAM: 128GB
  • WSL allocation: 64GB RAM, 20 CPU cores
  • Goals: fast builds/containers, stable networking, WSLg apps, GPU access, sane memory reclaim

Global WSL2 config (Windows) — .wslconfig

Place at %UserProfile%\.wslconfig (for example C:\Users\YOUR_USER\.wslconfig). Applies to all WSL2 distros.

# WSL2 Global Configuration # Settings apply across all Linux distros running on WSL 2 # Place this file at: %UserProfile%\.wslconfig (C:\Users\li_sz\.wslconfig)  [wsl2] # Memory allocation - With 128GB RAM, allocate generous amount for development # Using 64GB (50%) for heavy development workloads memory=64GB # CPU cores - Using 20 of 24 logical processors for optimal performance # Leaving 4 cores for Windows host system processors=20 # Network settings for better connectivity localhostForwarding=true networkingMode=mirrored # DNS and proxy settings for better internet connectivity dnsProxy=true autoProxy=true # Swap configuration for memory management swap=2GB # Enable GUI applications (WSLg) for development tools guiApplications=true # Enable nested virtualization for Docker/containers nestedVirtualization=true # VM idle timeout (60 seconds) to balance performance and resource usage vmIdleTimeout=60000 # Firewall settings for development firewall=true # Enable DNS tunneling for better name resolution dnsTunneling=true # Experimental features for better performance [experimental] # Automatic memory reclaim for better host system performance autoMemoryReclaim=gradual # Sparse VHD for efficient disk usage sparseVhd=true # Better DNS parsing bestEffortDnsParsing=true # Auto proxy timeout for corporate environments initialAutoProxyTimeout=1000 
Enter fullscreen mode Exit fullscreen mode

Why these choices:

  • memory=64GB: ample headroom for compilers, databases, ML, containers; adjust down on smaller hosts.
  • processors=20: reserves 4 logical CPUs for Windows UI/background tasks to keep the host responsive.
  • networkingMode=mirrored + localhostForwarding=true: simpler, more reliable networking and service access across host/guest.
  • dnsProxy, autoProxy, dnsTunneling, bestEffortDnsParsing: resilient name resolution, especially in corporate networks/VPNs.
  • swap=2GB: prevents abrupt OOM with modest overhead; increase if workloads spike memory.
  • guiApplications=true: WSLg enables Linux GUI apps.
  • nestedVirtualization=true: better Docker/VM-in-WSL scenarios.
  • vmIdleTimeout=60000: power/perf balance; increase if WSL shuts down too eagerly during pauses.
  • [experimental].autoMemoryReclaim=gradual: returns idle memory to Windows over time.
  • sparseVhd=true: reduces VHD growth; compacts better over time.
  • firewall=true: routes through Windows Firewall for consistent policy.

Per-distro config (Linux) — /etc/wsl.conf

Copy this into each distro at /etc/wsl.conf. Tailor the [user] section to your username.

# Sample wsl.conf - Copy this to /etc/wsl.conf in your WSL distributions # This file configures per-distribution settings  [boot] # Enable systemd for modern Linux distributions (Ubuntu, Arch, etc.) systemd=true # Optional: Run commands on boot (uncomment and modify as needed) # Examples: # command="service docker start" # command="service ssh start && service nginx start"  [automount] # Enable automatic mounting of Windows drives enabled=true # Mount Windows drives under /mnt (default) or change to your preference root=/mnt # Set proper permissions and metadata support # uid=1000,gid=1000 should match your Linux user ID options="metadata,uid=1000,gid=1000,umask=0022,fmask=0111,case=off" # Process /etc/fstab for additional mounts mountFsTab=true [network] # Generate /etc/hosts automatically generateHosts=true # Generate /etc/resolv.conf automatically generateResolvConf=true # Set hostname (optional - uncomment to customize) # hostname=dev-machine  [interop] # Enable Windows/Linux interoperability enabled=true # Add Windows PATH to Linux PATH appendWindowsPath=true [user] # Set default user (replace with your actual username) # Find your username with: whoami # default=yourusername  [gpu] # Enable GPU access for development and ML workloads enabled=true [time] # Sync timezone with Windows useWindowsTimezone=true 
Enter fullscreen mode Exit fullscreen mode

Key notes:

  • systemd=true: enables modern service management (systemctl).
  • [automount] with metadata and uid/gid: correct permissions on /mnt/c/....
  • mountFsTab=true: honors custom mounts via /etc/fstab.
  • appendWindowsPath=true: convenient access to Windows tools from Linux.
  • [gpu].enabled=true: unlocks CUDA/DirectML where supported.
  • [user]: set default= to your Linux username to avoid root logins.

Setup — automated or manual

Automated (recommended):

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser .\setup.ps1 
Enter fullscreen mode Exit fullscreen mode

Manual:

1) Apply global config

Copy-Item "C:\Users\li_sz\wslsetup\.wslconfig" "$env:USERPROFILE\.wslconfig" -Force wsl --shutdown Start-Sleep -Seconds 8 
Enter fullscreen mode Exit fullscreen mode

2) Configure each distro

# Example for Ubuntu; repeat for Arch/Kali/NixOS by changing the name wsl -d Ubuntu-24.04 sudo cp /mnt/c/Users/li_sz/wslsetup/wsl.conf /etc/wsl.conf sudo nano /etc/wsl.conf # set [user].default to your username 
Enter fullscreen mode Exit fullscreen mode

3) Final restart

wsl --shutdown Start-Sleep -Seconds 8 
Enter fullscreen mode Exit fullscreen mode

Verify

free -h # memory accounting nproc # CPU cores available lscpu # CPU details df -h # disk space systemctl status # systemd active? ls -la /mnt/ # windows drives ip addr show # interfaces ping google.com # outbound connectivity nvidia-smi # GPU (if NVIDIA) 
Enter fullscreen mode Exit fullscreen mode

Windows-side diagnostics:

wsl --status wsl --list --verbose wsl --version please comment if you have idea how to develop better on wsl2 working environment 
Enter fullscreen mode Exit fullscreen mode

Expected results

  • Build times: significant improvements vs default WSL2 (fewer stalls under load).
  • Memory behavior: stable under large compiles/containers; unused memory gradually returned to Windows.
  • Networking: mirror mode produces fewer surprises on VPNs and corporate Wi-Fi.
  • File I/O: consistent experience accessing Windows paths via /mnt.

Troubleshooting

  • WSL won’t start: confirm wsl --version and Windows features are enabled.
  • Memory limits ignored: ensure .wslconfig resides in your user profile, then wsl --shutdown.
  • DNS/Network: restart WSL and verify generateResolvConf=true; watch for VPN DNS overrides.
  • Permissions under /mnt: confirm options="metadata,uid=1000,gid=1000,..." and your UID/GID.

Tips

  • Use Arch for cutting-edge dev, Ubuntu 24.04 for stability, Kali for security work, NixOS for reproducibility.
  • Monitor with htop, iotop, and Windows Task Manager to fine-tune memory/processors.
  • For container-heavy work, consider increasing swap to 4–8GB if builds occasionally OOM.

This configuration balances raw performance with host stability and is a solid baseline for demanding daily development on Windows 11 with WSL2.

Top comments (0)