WSL lets developers run a GNU/Linux environment — including most command-line tools, utilities, and applications — directly on Windows, unmodified, without the overhead of a traditional virtual machine or dual-boot setup.

Installing Linux on Windows with WSL

https://learn.microsoft.com/en-us/windows/wsl/install

  • Open PowerShell or Windows Command Prompt in administrator mode, enter the wsl --install command, then restart your machine.
wsl --install
  • Display information about the version of Ubuntu installed
lsb_release -a
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy

WSLg

WSLg (Windows Subsystem for Linux GUI) is integrated into WSL2 and provides native GUI support for Linux applications (X11 and Wayland)

  • Verify that you are running Windows 11 with WSLg
echo $WSL_INTEROP

Enable suport for Linux GUI apps

Networking and Firewall Configuration

https://learn.microsoft.com/en-us/windows/wsl/networking

Mirrored mode networking

https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking

Configure Windows Firewall for WSL

  • Configure Hyper-V firewall to disable firewall

    • Get WSL VM id
    Get-NetFirewallHyperVVMCreator
    VMCreatorId  : {40E0AC32-46A5-438A-A0B2-2B479E8F2E90}
    FriendlyName : WSL
    
    • Disable firewall
    Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Enabled False
  • List existing firewall rules

Get-NetFirewallRule -DisplayName *WSL*
  • Allow all traffic
New-NetFirewallRule -DisplayName "Allow All WSL Traffic" -Direction Inbound -Action Allow -Protocol Any
Name                          : {5a95604b-9e6b-456b-b649-70d64afb4793}
DisplayName                   : Allow All WSL Traffic
Description                   :
DisplayGroup                  :
Group                         :
Enabled                       : True
Profile                       : Any
Platform                      : {}
Direction                     : Inbound
Action                        : Allow
EdgeTraversalPolicy           : Block
LooseSourceMapping            : False
LocalOnlyMapping              : False
Owner                         :
PrimaryStatus                 : OK
Status                        : The rule was parsed successfully from the store. (65536)
EnforcementStatus             : NotApplicable
PolicyStoreSource             : PersistentStore
PolicyStoreSourceType         : Local
RemoteDynamicKeywordAddresses : {}
PolicyAppId                   :
  • To remove the rule
Remove-NetFirewallRule -DisplayName "Allow All WSL Traffic"
New-NetFirewallHyperVRule `
-DisplayName 'Allow All Inbound Traffic to WSL in Private Network' `
-Name 'WSL Rule' `
-Profiles Private `
-Direction Inbound `
-Action Allow `
-VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' `
-Enabled True

Connecting USB devices to wsl2

[1/14/25]

Using USBIPD-WIN on WSL

https://learn.microsoft.com/en-us/windows/wsl/connect-usb

  • Install USBIPD
winget install --interactive --exact dorssel.usbipd-win
  • Open PowerShell in administrator mode and list USB devices connected to Windows
usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-9    13d3:56eb  USB2.0 HD UVC WebCam, USB2.0 IR UVC WebCam, Camera DFU De...  Not shared
1-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not shared
3-1    093a:2533  USB Input Device                                              Not shared
3-2    20d6:2035  Xbox Gaming Device                                            Shared
3-3    1532:0016  USB Input Device                                              Not shared
3-4    1532:010d  USB Input Device                                              Not shared

Persisted:
GUID                                  DEVICE
  • Share the USB device using the bus ID
usbipd bind --busid 3-2 
  • Attach the USB device to WSL (a WSL command prompt must also be open open )
    • Note that as long as the USB device is attached to WSL, it cannot be used by Windows
usbipd attach --wsl --busid 3-2
  • Open Ubuntu/WSL and list the attached USB devices
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 127.0.0.1 to reach the host.
  • Verify that the device is attached using usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-9    13d3:56eb  USB2.0 HD UVC WebCam, USB2.0 IR UVC WebCam, Camera DFU De...  Not shared
1-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not shared
4-1    093a:2533  USB Input Device                                              Not shared
4-2    20d6:2035  Xbox Gaming Device                                            Attached
4-3    046d:c08b  G502 HERO, USB Input Device, Virtual HID Framework (VHF) ...  Not shared
4-4    1532:010d  USB Input Device                                              Not shared
  • From the WSL prompt, verify that the device is listed
lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 20d6:2035 PowerA Xbox Series X Wired Controller Black
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  • Disconnect the device once you are done
usbipd detach --busid <busid>
  • Note: You will still likely need to recompile the Linux kernel to make the drivers available in WSL (See below)

Compile your own Linux kernel

Enable gamepad support in WSL

  • Check device permissions and user group
ls -l /dev/bus/usb/001/002
crw-rw-r-- 1 root root 189, 1 Jan 15 04:14 /dev/bus/usb/001/002
  • Check for joystick device
ls /dev/input
by-id  by-path  event0  js0
  • run jstest
jstest /dev/input/js0
Driver version is 2.1.0.
Joystick (Generic X-Box pad) has 8 axes (X, Y, Z, Rx, Ry, Rz, Hat0X, Hat0Y)
and 11 buttons (BtnA, BtnB, BtnX, BtnY, BtnTL, BtnTR, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).
Testing ... (interrupt to exit)
Axes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:     0  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:     0  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:     0  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:   278  4:     0  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:   278  4:   161  5:     0  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:   278  4:   161  5:-32767  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:   278  4:   161  5:-32767  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:oAxes:  0:     0  1:    90  2:-32767  3:   278  4:   161  5:-32767  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:off  4:off  5:off  6:off  7:off  8:off  9:off 10:off

Enable Joystick integration with ROS