1,634 25/03/2026 07/04/2026 7 min

Se usi WSL2 su Windows 11 per strumenti di build, script o servizi interni, il problema non è avviarlo. Il problema è tenerlo affidabile dopo un reboot, senza aprire porte inutili e senza perdere i dati del VHDX.

Qui imposto un profilo da produzione. Il caso è concreto: una distro WSL2 espone un servizio locale, il firewall di Windows deve consentire solo la porta necessaria, e il backup deve essere automatizzato con wbadmin più una verifica del file VHDX.

Il punto chiave è ridurre le sorprese. WSL2 non è una VM tradizionale, ma in produzione va trattato come un componente di servizio. Serve disciplina su rete, permessi e ripristino.

Prerequisiti

  • Windows 11 Pro o Enterprise aggiornato.
  • WSL2 già abilitato con una distro Linux installata.
  • PowerShell avviato come amministratore.
  • Spazio libero sufficiente per il backup del volume che contiene il VHDX.
  • Accesso al firewall di Windows Defender.

Note: i comandi di backup con wbadmin sono disponibili solo da riga di comando. La parte firewall si può fare anche da GUI.

Step 1: definire il servizio e la porta esposta

In produzione devi partire dal servizio, non dal tool. Se WSL2 ospita, per esempio, un agent HTTP interno, fissa una porta precisa e non lasciare ascolti casuali. Qui uso la porta 8080 come esempio, perché è comune per dashboard o health endpoint.

Dentro la distro, verifica l’ascolto con un test semplice. Se il servizio parte da systemd nella distro, controlla anche lo stato.

ss -lntp | grep ':8080'
systemctl status myservice --no-pager

# Output:

LISTEN 0 4096 0.0.0.0:8080 0.0.0.0:* users:("myservice",pid=1234,fd=7)
● myservice.service - Internal app Active: active (running)

Se il servizio non è un demone vero, meglio lanciarlo tramite un task schedulato o un servizio Windows che richiama wsl.exe. Evita avvii manuali da terminale utente.

Step 2: aprire il firewall solo per l’host giusto

Se il servizio deve essere raggiunto solo dal PC locale, non aprire la porta su tutte le interfacce. La regola più pulita è limitare il traffico all’host o a una subnet interna.

Da interfaccia grafica vai in Windows Defender Firewall con sicurezza avanzata → Regole in ingresso → Nuova regola. Scegli Porta, poi TCP, quindi 8080. Nella schermata Ambito restringi gli IP remoti consentiti. Se puoi, usa solo 127.0.0.1 per servizi locali o la rete di management.

Da PowerShell, la regola equivalente è più ripetibile e più facile da auditare.

New-NetFirewallRule ` -DisplayName "WSL2 Internal App 8080" ` -Direction Inbound ` -Action Allow ` -Protocol TCP ` -LocalPort 8080 ` -Profile Domain,Private ` -RemoteAddress 127.0.0.1

# Output:

Name : {a1b2c3d4-1111-2222-3333-444455556666}
DisplayName : WSL2 Internal App 8080
Enabled : True

Warning: non usare -RemoteAddress Any se il servizio non è pensato per essere esposto. Su laptop e workstation è il classico errore che trasforma una porta interna in una superficie d’attacco.

Step 3: fissare il comportamento di rete di WSL2

WSL2 usa una rete NAT virtuale e, dopo riavvii o aggiornamenti, può cambiare l’IP della distro. Se il servizio è consumato da tool locali, conviene puntare a localhost con il port-forwarding naturale di WSL2, oppure usare un alias stabile in Windows.

Controlla la versione WSL e lo stato delle distro.

wsl --status
wsl -l -v

# Output:

Default Version: 2 NAME STATE VERSION
* Ubuntu-24.04 Running 2

Se hai problemi con la risoluzione tra host e distro, aggiorna WSL e riavvia il sottosistema.

wsl --update
wsl --shutdown

# Output:

Checking for updates.
The latest version of Windows Subsystem for Linux is already installed.

Per un ambiente di produzione, aggiungi anche un controllo post-boot. Un task pianificato può verificare che il servizio sia vivo e che la porta risponda.

Test-NetConnection -ComputerName 127.0.0.1 -Port 8080

# Output:

ComputerName : 127.0.0.1
RemotePort : 8080
TcpTestSucceeded : True

Step 4: rendere persistente l’avvio del servizio

In una distro moderna, la soluzione migliore è usare systemd dentro WSL2. Così il servizio si comporta in modo prevedibile dopo il login o dopo un reboot dell’host.

Dentro la distro, abilita il servizio e verifica che parta automaticamente.

sudo systemctl enable myservice
sudo systemctl start myservice
sudo systemctl is-enabled myservice

# Output:

enabled

Se il servizio deve avviarsi solo quando arriva traffico locale, valuta un socket activation. In molti casi è più pulita di un demone sempre acceso.

Note: la configurazione di systemd dentro WSL2 dipende dalla distro e dalla versione. Se hai già abilitato systemd, non reinventare l’avvio con script fragili in .bashrc.

Step 5: preparare il backup del VHDX con wbadmin

Il backup vero non è il file copiato a mano mentre la distro è aperta. Serve una copia coerente del volume che ospita il VHDX, più un controllo sulla presenza del file. In scenari piccoli, wbadmin è la scelta più pratica.

Prima individua dove si trova il VHDX. Di solito è sotto il profilo utente, dentro LocalState.

Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter *.vhdx | Select-Object FullName, Length

# Output:

FullName Length
-------- ------
C:\Users\alice\AppData\Local\Packages\...\ext4.vhdx 26843545600

Poi lancia un backup del volume che contiene quel file. Se il VHDX sta su C:, fai l’immagine del volume con destinazione su disco esterno o share dedicata.

wbadmin start backup -backupTarget:E: -include:C: -quiet

# Output:

wbadmin 1.0 - Backup command-line tool
The backup operation completed successfully.

Warning: se il VHDX cresce molto, controlla la retention. Un backup pieno di un volume quasi pieno ti porta presto a finire spazio senza avviso.

Step 6: aggiungere un controllo di integrità dopo il backup

Il backup senza verifica è una scommessa. Dopo il job, controlla che il file VHDX esista, che non sia a dimensione zero e che il volume di backup risponda.

$vhdx = Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter *.vhdx | Select-Object -First 1
Test-Path $vhdx.FullName
Get-Item $vhdx.FullName | Select-Object FullName, Length

# Output:

True
FullName ...
Length 26843545600

Se vuoi un livello in più, pianifica un restore test su una macchina di laboratorio. È il solo modo per sapere se il backup è davvero utile.

Step 7: schedulare tutto con Attività pianificate

La produzione non vive di click ripetuti. Usa l’Utilità di pianificazione per avvio servizio, controllo porta e backup. La GUI resta comoda per la prima impostazione.

Vai in Utilità di pianificazione → Crea attività. Nella scheda Generale usa un account amministrativo o un service account dedicato. Nella scheda Trigger scegli all’avvio del sistema o ogni notte. Nella scheda Azioni inserisci PowerShell con questi parametri:

-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\check-wsl2.ps1

# Output:

Task Scheduler: The operation completed successfully.

Nel file check-wsl2.ps1 puoi unire controllo servizio, test porta e avvio backup. Mantieni il file breve e leggibile. Un job opaco diventa impossibile da gestire al primo incidente.

Verifica finale

La verifica finale deve essere breve e concreta. Devi vedere tre cose: il servizio è vivo, la porta risponde, il backup è partito e il VHDX è presente.

wsl -d Ubuntu-24.04 -- systemctl is-active myservice
Test-NetConnection 127.0.0.1 -Port 8080
Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter *.vhdx | Select-Object -First 1 | Format-Table FullName, Length

# Output:

active
TcpTestSucceeded : True
FullName Length

Se questi tre controlli passano, l’assetto è già buono per un ambiente interno o una workstation critica.

Troubleshooting

Errore: “The system cannot find the file specified.”

Causa: il task punta a un path del VHDX o dello script che è cambiato dopo un update o una reinstallazione della distro.

Fix:

Get-ChildItem "$env:LOCALAPPDATA\Packages" -Recurse -Filter *.vhdx
Get-Item C:\Scripts\check-wsl2.ps1

# Output:

FullName ... ext4.vhdx
Mode LastWriteTime Length Name

Errore: “TCP connect to (127.0.0.1 : 8080) failed”

Causa: il servizio non ascolta, oppure WSL2 non ha ancora rialzato la rete dopo il reboot.

Fix:

wsl --shutdown
wsl -d Ubuntu-24.04 -- sudo systemctl restart myservice
Test-NetConnection 127.0.0.1 -Port 8080

# Output:

TcpTestSucceeded : True

Errore: “wbadmin failed to create the backup”

Causa: il disco di destinazione è pieno, scollegato o non ha permessi sufficienti.

Fix:

Get-PSDrive E
wbadmin get versions -backupTarget:E:

# Output:

Name Used (GB) Free (GB)
E ... ...

Conclusione

Un WSL2 usato in produzione non va trattato come sandbox. Serve una porta controllata, un servizio stabile e un backup che sia davvero ripristinabile.

Il passo successivo è fare un restore test del VHDX su una seconda macchina o su una VM di laboratorio. Solo lì scopri se il tuo piano regge un incidente reale.