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 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 WSLV:\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
Installare un coding agent su WSL con accesso limitato a una sola cartella
In alternativa a Docker Sandboxes, un coding agent può essere eseguito dentro una macchina virtuale WSL, con accesso limitato a una singola cartella del sistema Windows invece che a tutti i dischi. L'esempio seguente usa Grok Build, ma la stessa procedura vale per qualsiasi altro agent da terminale.
1. Installare la VM WSL
Da PowerShell, come amministratore.
wsl --install -d Ubuntu-24.04
Al riavvio si apre il terminale Ubuntu e viene chiesto di creare un utente e una password.
2. Aggiornare il sistema
sudo apt update && sudo apt upgrade -y
3. Disabilitare il montaggio automatico dei dischi Windows
Per impostazione predefinita, WSL monta automaticamente tutti i dischi Windows sotto
/mnt/. Per evitarlo, si modifica il file di configurazione della distribuzione.
sudo nano /etc/wsl.conf
Contenuto del file.
[automount]
enabled = false
[interop]
appendWindowsPath = false
La sezione interop evita che all'avvio compaiano messaggi di errore Failed to translate,
legati al tentativo di importare il PATH di Windows quando i dischi non sono più montati.
4. Riavviare WSL
Da PowerShell, non dal terminale Ubuntu.
wsl --shutdown
Si riapre poi il terminale Ubuntu perché le modifiche abbiano effetto.
5. Montare manualmente solo la cartella di lavoro
Con l'automount disattivato, nessun disco Windows è raggiungibile finché non viene montato esplicitamente. Si crea un mountpoint dedicato e si monta solo la cartella desiderata.
sudo mkdir -p /mnt/project
sudo mount -t drvfs 'E:\SVL\web_site\php_dbbackup' /mnt/project
Verifica del mount.
ls /mnt/project
mount | grep project
Da questo momento /mnt/project è l'unico punto di accesso al filesystem Windows: nessun'altra
cartella o disco è raggiungibile dall'interno della VM.
6. Installare l'agent
L'installazione va eseguita nella home di Ubuntu, non dentro il mountpoint.
curl -fsSL https://x.ai/cli/install.sh | bash
7. Configurare l'autenticazione
Per evitare il login via browser, si imposta la chiave API come variabile d'ambiente permanente.
echo 'export XAI_API_KEY="xai-il-tuo-token"' >> ~/.bashrc
source ~/.bashrc
8. Avviare l'agent sulla cartella montata
cd /mnt/project
grok
Cambiare cartella di lavoro
Per lavorare su un progetto diverso non serve modificare wsl.conf né reinstallare nulla: basta
smontare la cartella corrente e montarne una nuova sullo stesso mountpoint.
sudo umount /mnt/project
sudo mount -t drvfs 'E:\altro-progetto' /mnt/project
cd /mnt/project
grok
Nota sulla persistenza del mount
Il mount manuale non è permanente: va ripetuto a ogni riavvio della VM (wsl --shutdown o riavvio del PC).
Per automatizzare il mount di una cartella fissa a ogni avvio, si può aggiungere una sezione
boot in wsl.conf, con il percorso scritto con doppio backslash.
[boot]
command = "mkdir -p /mnt/project && mount -t drvfs 'E:\\SVL\\web_site\\php_dbbackup' /mnt/project"
Se si cambia spesso cartella di lavoro, è comunque più pratico rimontare a mano con il comando
dello step precedente piuttosto che modificare wsl.conf ogni volta.