Interoperabilità WSL : integrazione di Windows e Linux

sottosistema Windows per Linux (WSL) fornisce interoperabilità bidirezionale tra Windows e Linux. È possibile avviare comandi Linux da processi Windows, eseguire Windows eseguibili da una shell Linux, condividere file in entrambi i file system e inoltrare le connessioni di rete. Questa pagina riepiloga i modelli di interoperabilità chiave e i relativi compromessi.

Important

L'interoperabilità WSL richiede l'installazione di WSL e la registrazione di almeno una distribuzione Linux. Non dare per scontato che WSL sia presente — verifica sempre prima di invocare wsl.exe o accedere ai percorsi \\wsl$\. Nei sistemi in cui WSL non è installato, wsl.exe restituisce un codice di uscita diverso da zero con un messaggio di errore e \\wsl$\ i percorsi UNC non vengono risolti.

Interoperabilità della riga di comando

Eseguire comandi Linux da Windows

Usa wsl.exe da qualsiasi shell di Windows (PowerShell, Prompt dei comandi o Terminale Windows) per eseguire comandi Linux:

# Run a single command in the default distribution
wsl ls -la /home

# Run a command in a specific distribution
wsl -d Ubuntu-22.04 -- cat /etc/os-release

# Pipe Windows output into a Linux command
ipconfig | wsl grep "IPv4"

Eseguire gli eseguibili di Windows da Linux

All'interno di una shell WSL, richiama qualsiasi eseguibile Windows usando il nome completo (compresa l'estensione .exe):

# Open File Explorer in the current Linux directory
explorer.exe .

# Run a PowerShell command from Linux
powershell.exe -Command "Get-Date"

# Pipe Linux output into a Windows command
cat /etc/hosts | clip.exe

Annotazioni

Gli eseguibili di Windows richiamati da WSL usano il PATH di Windows. L'estensione .exe è obbligatoria, senza di essa, la shell cerca un file binario Linux.

Rilevare se WSL è disponibile

Prima di basarsi sull'interoperabilità WSL nell'app o nello script, verificare la disponibilità:

# PowerShell: Check if wsl.exe exists and WSL is functional
try {
    $wslStatus = wsl --status 2>&1
    if ($LASTEXITCODE -eq 0) {
        Write-Host "WSL is available"
    } else {
        Write-Host "WSL is installed but not functional"
    }
} catch {
    Write-Host "WSL is not installed"
}
// C#: Check WSL availability before use
var wslPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.System), "wsl.exe");

if (!File.Exists(wslPath))
{
    // WSL is not installed — handle gracefully
    return;
}

var process = Process.Start(new ProcessStartInfo
{
    FileName = wslPath,
    Arguments = "--status",
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true
}) ?? throw new InvalidOperationException("Failed to start wsl.exe process.");

process.WaitForExit();
if (process.ExitCode != 0)
{
    // WSL is installed but no distribution is registered
}

Interoperabilità del file system

Accedere ai file Linux da Windows

Usare il \\wsl$\ percorso UNC (o \\wsl.localhost\) per accedere ai file system Linux da Windows:

\\wsl$\Ubuntu-22.04\home\username\project
\\wsl.localhost\Ubuntu-22.04\home\username\project

Important

Il \\wsl$\ percorso è disponibile solo quando l'istanza WSL è in esecuzione. Se la distribuzione viene arrestata, il percorso non viene risolto. Avviare prima la distribuzione con wsl -d <distro-name> o usare wsl.localhost che può avviare automaticamente la distribuzione in Windows 11.

Accedere ai file di Windows da Linux

Le unità di Windows vengono montate in /mnt/ per impostazione predefinita:

# Access C: drive
ls /mnt/c/Users/username/Documents

# Access D: drive
ls /mnt/d/projects

Considerazioni sulle prestazioni

Operation Performance Raccomandazione
Processo Linux che legge i file Linux (/home/...) Veloce (ext4 nativo) Mantenere i file di progetto qui per gli strumenti basati su Linux
Processo Windows che legge file di Windows (C:\...) Veloce (NTFS nativo) Mantenere i file di progetto qui per gli strumenti basati su Windows
Processo Linux che legge file di Windows (/mnt/c/...) Lento (protocollo 9P tra filesystem) Evitare per i sistemi di compilazione, node_modules, repository Git
Processo Windows che legge file Linux (\\wsl$\...) Lento (protocollo 9P tra filesystem) Da usare per l'accesso occasionale ai file, non per cicli molto frequenti

Suggerimento

L'errore di prestazioni più comune consiste nell'archiviare i file di progetto nel file system Windows (/mnt/c/...) durante l'esecuzione di strumenti di compilazione Linux (npm, cargo, make). Ciò causa un sovraccarico di I/O significativo. Clonare invece i repository nel file system Linux (~/projects/) quando si usano principalmente strumenti Linux.

Traduzione del percorso

Usare wslpath in WSL per eseguire la conversione tra percorsi Windows e Linux:

# Windows path → Linux path
wslpath "C:\Users\username\file.txt"
# Output: /mnt/c/Users/username/file.txt

# Linux path → Windows path
wslpath -w /home/username/file.txt
# Output: \\wsl.localhost\Ubuntu-22.04\home\username\file.txt

# Linux path → Windows path (with drive letter format)
wslpath -m /mnt/c/Users/username/file.txt
# Output: C:/Users/username/file.txt

Interoperabilità di rete

Inoltro di localhost

Per impostazione predefinita, WSL 2 inoltra le porte dal guest Linux a localhost in Windows. Un server in esecuzione sulla porta 3000 all'interno di WSL è accessibile da Windows all'indirizzo http://localhost:3000.

Annotazioni

L'inoltro localhost funziona da Windows a WSL automaticamente nella maggior parte delle versioni Windows. Tuttavia, la connessione da WSL a un server ospitato Windows richiede l'ip host Windows (trovarlo con cat /etc/resolv.conf | grep nameserver nelle configurazioni WSL precedenti o usare localhost direttamente se è abilitata la rete con mirroring).

Modalità di rete rispecchiata (Windows 11)

Windows 11 (versione 22H2 e successive) supporta la rete con mirroring, in cui WSL condivide lo stesso stack di rete di Windows. Abilitalo in .wslconfig:

# %USERPROFILE%\.wslconfig
[wsl2]
networkingMode=mirrored

Con la modalità speculare:

  • WSL e Windows condividono lo stesso indirizzo IP
  • Entrambi possono raggiungere i servizi su localhost in entrambe le direzioni
  • Le connessioni VPN in Windows sono automaticamente disponibili in WSL
  • IPv6 funziona all'interno di WSL

Condivisione di variabili di ambiente

Passare le variabili di ambiente di Windows a WSL usando la variabile WSLENV:

# Windows: Share GOPATH with WSL (translate the path)
$env:WSLENV = "GOPATH/p"
$env:GOPATH = "C:\Users\username\go"
wsl echo $GOPATH
# Output: /mnt/c/Users/username/go

L'opzione /p traduce i percorsi di Windows nel formato Linux. Altri flag: /l (elenco delimitato da due punti), /u (solo WSL→Windows), /w (solo Windows→WSL).

Errori comuni

Suggerimento

Errori generati frequentemente da LLMs e generatori di codice:

  1. Supponendo \\wsl$\ che sia sempre accessibile , il percorso viene risolto solo quando la distribuzione WSL di destinazione è in esecuzione. Il codice che apre \\wsl$\ i percorsi senza avviare prima la distribuzione ha esito negativo e viene visualizzato un errore di percorso di rete.
  2. Mancata gestione di WSL-not-installed — molte macchine (in particolare Windows Server o PC gestiti a livello aziendale) non dispongono di WSL. Verificare sempre l'esistenza di wsl.exe prima di utilizzarlo.
  3. L'archiviazione dei file di progetto nel file system errato: l'uso /mnt/c/ di per i progetti Linux o \\wsl$\ per i progetti Windows causa una grave riduzione delle prestazioni di I/O a causa della conversione del file system 9P.
  4. Hardcoding /mnt/c/ — il punto di montaggio è configurabile in /etc/wsl.conf (tramite [automount] root). Usa wslpath per una traduzione affidabile del percorso.
  5. Se si dimentica .exe quando si chiamano programmi Windows da WSL — notepad non funziona; serve notepad.exe. Si tratta di un comune errore di copia-incolla nella documentazione solo per Windows.
  6. Topologia di rete presunta — la modalità predefinita (NAT) e la modalità con mirroring di WSL 2 hanno comportamenti di rete diversi. Il codice che funziona in un computer dello sviluppatore potrebbe non riuscire in un altro a seconda delle impostazioni .wslconfig .
  7. L'uso di presupposti WSL 1 per WSL 2 — WSL 1 ha condiviso lo stack di rete Windows e ha avuto accesso diretto al file system. WSL 2 usa una macchina virtuale leggera con una scheda di rete virtuale e una condivisione file 9P. Le caratteristiche delle prestazioni e la rete sono diverse.