Funzionalità di base

Per verificare che WSL 2 sia attivo e vedere la versione del kernel:

wsl --status
wsl --version

Per vedere le distribuzioni installate

wsl --list --verbose

Il comando di seguito abilita i componenti necessari, installa il kernel Linux aggiornato e scarica Ubuntu come distribuzione predefinita. Riavvia il PC quando richiesto.

wsl --install

Per vedere le distribuzioni disponibili online

wsl --list --online

A questo punto per installare una distribuzione specifica

wsl --install -d Debian
wsl --install -d kali-linux
wsl --install -d openSUSE-Tumbleweed
wsl --install -d AlmaLinux-9

Per avviare una distro

# avvia distro di default
wsl 

# avvia una distro specifica
wsl -d Debian
wsl -d kali-linux

Cambiare la distribuzione predefinita associata al comando wsl

wsl --set-default [nomedistro]

Per rimuovere una distribuzione

wsl --unregister [nomedistro]

Di seguito alcuni comandi di gestione generale

# Fermare tutte le distro e il processo WSL
wsl --shutdown

# Terminare una singola distro
wsl --terminate [nomedistro]

# Aggiornare il kernel WSL
wsl --update

# Eseguire come utente specifico
wsl -d [nomedistro] -u root

# Spostare una distro su un altro disco
wsl --export [nomedistro] D:\backup.tar
wsl --unregister [nomedistro]
wsl --import [nomedistro] D:\WSL\Ubuntu D:\backup.tar

Configurazione di WSL

Esistono due file di configurazione con scopi diversi.

  • /etc/wsl.conf — configurazione per singola distro
  • %USERPROFILE%\.wslconfig — configurazione globale

Crea o modifica /etc/wsl.conf dentro la distro Linux:

sudo nano /etc/wsl.conf

[boot]
systemd=true          # abilita systemd (raccomandato)

[user]
default=mioutente     # utente predefinito al login

[network]
hostname=mylinux      # hostname della macchina virtuale
generateResolvConf=true

[interop]
enabled=true          # permette di lanciare .exe da Linux
appendWindowsPath=true # aggiunge il PATH di Windows a Linux

Dopo la modifica, riavvia la distro:

wsl --shutdown
wsl -d [nomedistro]

Crea questo file in C:\Users\[utente]\.wslconfig (da PowerShell):

notepad $env:USERPROFILE\.wslconfig

[wsl2]
memory=8GB            # RAM massima assegnata
processors=4          # numero di CPU virtuali
swap=2GB              # spazio di swap
diskSize=60GB         # dimensione massima del disco virtuale

[experimental]
sparseVhd=true        # disco virtuale a espansione automatica (risparmia spazio)
autoMemoryReclaim=gradual  # rilascia RAM inutilizzata a Windows

Applica modifiche riavviando machina linux

wsl --shutdown

Interazione tra S.O.

Interazione Windows → Linux

Eseguire comandi Linux direttamente da PowerShell/CMD

# Eseguire un comando e tornare a Windows
wsl ls -la /home

# Usare una distro specifica
wsl -d Debian -- apt list --installed

# Pipe tra comandi Windows e Linux
Get-Content C:\log.txt | wsl grep "ERROR"

# Usare tool Linux su file Windows
wsl sort -u <<< "$(Get-Content C:\dati.txt)"

Il filesystem di ogni distro è accessibile tramite il percorso UNC:

\\wsl$\Ubuntu-24.04\home\utente\
\\wsl$\Debian\etc\

Oppure direttamente da Esplora File digitando \\wsl$ nella barra degli indirizzi.

Da PowerShell puoi copiare file:

Copy-Item "C:\Documenti\file.txt" "\\wsl$\Ubuntu-24.04\home\utente\"

I dischi Windows vengono montati automaticamente in /mnt/:

ls /mnt/c/Users/         # Disco C:
ls /mnt/d/               # Disco D: (se esiste)

Per montare manualmente un disco o una partizione:

# Da PowerShell (Admin) — monta un disco fisico
wsl --mount \\.\PHYSICALDRIVE1 --partition 1

Interazione Linux → Windows

Eseguire eseguibili Windows da Linux. Grazie all'interoperabilità, puoi lanciare qualsiasi .exe da dentro WSL:

# Aprire Esplora File nella directory corrente
explorer.exe .

# Aprire un file con il programma predefinito di Windows
cmd.exe /c start documento.pdf

# Usare notepad
notepad.exe /mnt/c/Users/utente/file.txt

# Usare winget per installare software Windows
winget.exe install Git.Git

Accedere al filesystem Windows da Linux

cd /mnt/c/Users/tuoutente/Desktop
ls /mnt/c/Program\ Files/

Copiare file da Linux a Windows

cp miofile.txt /mnt/c/Users/utente/Desktop/

Usare variabili d'ambiente di Windows

# Leggere variabili d'ambiente Windows
echo $WSLENV
cmd.exe /c echo %APPDATA%

Per condividere variabili tra i due ambienti, imposta WSLENV in Windows:

# Aggiunge MYVAR al bridge WSL (valore condiviso)
[Environment]::SetEnvironmentVariable("WSLENV", "MYVAR/u", "User")

Rete e Accesso ai Servizi

IP e hostname

# IP della macchina WSL (varia a ogni riavvio)
ip addr show eth0 | grep "inet "

# IP della macchina Windows (gateway da Linux)
ip route | grep default
cat /etc/resolv.conf | grep nameserver

Accedere a un server avviato in Linux da Windows. Se avvii un server in WSL (es. python3 -m http.server 8080), puoi accedervi dal browser Windows su:

http://localhost:8080

WSL 2 in Windows 11 gestisce automaticamente il port forwarding per localhost.

Accedere a un server Windows da Linux


# Usa l'IP del gateway (la macchina Windows)
curl http://$(ip route | grep default | awk '{print $3}'):3000

Modalità Mirrored Networking (Windows 11 22H2+). Questa modalità avanzata fa sì che Linux e Windows condividano lo stesso stack di rete:


# In .wslconfig
[wsl2]
networkingMode=mirrored

Con questa opzione localhost funziona in entrambe le direzioni senza configurazioni aggiuntive.

Eseguire Applicazioni GUI (WSLg)

WSL 2 su Windows 11 include WSLg, che permette di eseguire applicazioni grafiche Linux nativamente senza configurazione aggiuntiva.

# Installa e avvia Firefox
sudo apt install firefox -y
firefox &

# Editor grafico
sudo apt install gedit -y
gedit &

# Applicazioni GTK/Qt funzionano out-of-the-box
sudo apt install gimp -y
gimp &

Le finestre appaiono direttamente sul desktop Windows come normali applicazioni.

Systemd e Servizi

Con systemd=true in wsl.conf puoi gestire i servizi come su un normale Linux:

# Avviare e abilitare SSH
sudo systemctl start ssh
sudo systemctl enable ssh
sudo systemctl status ssh

# Avviare Docker (senza Docker Desktop)
sudo systemctl start docker
sudo systemctl enable docker

# Controllare tutti i servizi
systemctl list-units --type=service --state=running

Importare ed Esportare Distribuzioni

Esportare una distro (backup)

wsl --export [nomedistro] C:\Backup\ubuntu-backup.tar

Importare una distro (ripristino o clonazione)

wsl --import MioUbuntu C:\WSL\MioUbuntu C:\Backup\ubuntu-backup.tar --version 2

Importare una distro personalizzata (es. Arch Linux/Rocky Linux)

# Scarica il rootfs di Arch
# Da https://gitlab.archlinux.org/archlinux/archlinux-docker/-/releases
# Poi importa:
wsl --import Arch C:\WSL\Arch C:\Downloads\archlinux-rootfs.tar.zst --version 2
wsl -d Arch

# esempio rockylinux
wsl --import RockyLinux10 V:\WSL\RockyLinux10 "Z:\WSL\wsl_distro\Rocky-10-WSL-Base.latest.x86_64.wsl"

# per eseguire la macchina appena importata
wsl -d RockyLinux10

Per rockylinux10 abbiamo che:

  • RockyLinux10 → il nome che vuoi dare alla distro in WSL
  • V:\WSL\RockyLinux10 → la cartella dove WSL salverà il disco virtuale (.vhdx). Verrà creata automaticamente
  • "Z:\WSL\..." → il percorso del file sorgente

Ottimizzazioni e prestazioni

Col tempo il file .vhdx cresce. Per compattarlo:

# Prima, libera spazio dentro Linux
wsl -d Ubuntu-24.04 -- bash -c "sudo fstrim -av"

# Poi compatta da PowerShell (Admin)
wsl --shutdown
Optimize-VHD -Path "$env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx" -Mode Full