Come gestire lo spazio su disco WSL

Questa guida illustra come gestire lo spazio su disco usato dalle distribuzioni Linux installate usando WSL 2, tra cui:

sottosistema Windows per Linux (WSL 2) usa una piattaforma di virtualizzazione per installare distribuzioni Linux insieme al sistema operativo Windows host, creando un disco rigido virtuale (VHD) per archiviare i file per ognuna delle distribuzioni Linux installate. Questi dischi rigidi virtuali usano il tipo di file system ext4 e sono rappresentati nel disco rigido Windows come file ext4.vhdx .

WSL 2 ridimensiona automaticamente questi file VHD per soddisfare le esigenze di archiviazione. Per impostazione predefinita, ogni file VHD usato da WSL 2 viene inizialmente allocato un numero massimo di 1 TB di spazio su disco (prima della versione WSL versione 0.58.0 questa impostazione predefinita è stata impostata su un massimo di 512 GB e 256 GB massimo prima di questo).

Se lo spazio di archiviazione richiesto dai file Linux supera questa dimensione massima, verranno visualizzati errori che indicano che lo spazio su disco è stato esaurito. Per correggere questo errore, seguire le indicazioni seguenti su Come espandere le dimensioni del disco rigido virtuale WSL 2.

Come controllare lo spazio su disco disponibile

Controllare la quantità di spazio su disco disponibile nel disco rigido virtuale per una distribuzione Linux installata con WSL 2 usando il comando Linux Df .

Per controllare lo spazio su disco disponibile, aprire una riga di comando di PowerShell e immettere questo comando (sostituendo <distribution-name> con il nome di distribuzione effettivo):

wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro

L'output includerà:

  • Filesystem: identificatore per il file system VHD
  • Dimensioni: dimensioni totali del disco (quantità massima di spazio allocata al disco rigido virtuale)
  • Usato: quantità di spazio attualmente usata nel disco rigido virtuale
  • Disponibilità: quantità di spazio lasciato nel disco rigido virtuale (dimensioni allocate meno quantità usata)
  • Use%: percentuale di spazio su disco rimanente (usata/dimensione allocata)
  • Montato su: Percorso directory in cui è montato il disco

Se si noterà che si è vicini a raggiungere la quantità di spazio su disco disponibile allocata al disco rigido virtuale o si è già ricevuto un errore a causa di nessuna spazio su disco rimanente, vedere la sezione successiva per i passaggi su come espandere la quantità massima di spazio su disco allocata al disco rigido virtuale associato alla distribuzione Linux. La quantità di spazio su disco allocata al disco rigido virtuale da WSL visualizzerà sempre la quantità massima predefinita (1 TB nella versione più recente di WSL), anche se la quantità di spazio su disco nel dispositivo Windows effettivo è minore di quella. WSL monta un disco rigido virtuale che espanderà le dimensioni durante l'uso, quindi la distribuzione Linux vede che può crescere fino alla dimensione massima allocata di 1 TB. 

Come espandere le dimensioni del disco rigido virtuale WSL 2

Per espandere le dimensioni del disco rigido virtuale per una distribuzione Linux oltre la quantità massima predefinita di 1 TB di spazio su disco allocato, seguire questa procedura. Per le versioni precedenti di WSL non ancora aggiornate, questo valore predefinito massimo può essere impostato su 512 GB o 256 GB.

  1. Termina tutte le istanze di WSL usando questo comando: wsl.exe --shutdown

  2. Copiare il percorso della directory nel file ext4.vhdx associato alla distribuzione Linux installata nel computer. Per informazioni, vedere Come individuare il file vhdx e il percorso del disco per la distribuzione Linux.

  3. Aprire il prompt dei comandi di Windows con privilegi di amministratore e quindi aprire l'interprete dei comandi diskpart immettendo:

    diskpart
    
  4. Sarà ora disponibile un DISKPART> prompt. Immettere il comando seguente, sostituendo <pathToVHD> con il percorso della directory al ext4.vhdx file associato alla distribuzione Linux (copiato nel passaggio 2).

    Select vdisk file="<pathToVHD>"
    
  5. Visualizzare i dettagli associati a questo disco virtuale, incluse le dimensioni virtuali, che rappresentano la dimensione massima corrente allocata dal disco rigido virtuale:

    detail vdisk
    
  6. Sarà necessario convertire le dimensioni virtuali in megabyte. Ad esempio, se dimensioni virtuali: 512 GB, convertirla in 512000. Il nuovo valore immesso deve essere maggiore di questo valore originale. Ad esempio, per raddoppiare le dimensioni virtuali di 512 GB a 1024 GB, si converte in MB e si immette il valore: 1024000. Prestare attenzione a non immettere un valore superiore a quello che si vuole effettivamente quando il processo di riduzione delle dimensioni di un disco virtuale è molto più complicato.

  7. Immettere il valore per la nuova dimensione massima da allocare a questa distribuzione Linux usando il prompt dei prompt DISKPART> dei comandi di Windows:

    expand vdisk maximum=<sizeInMegaBytes>
    
  8. Uscire dal DISKPART> prompt:

    exit
    
  9. Avviare questa distribuzione Linux. Assicurarsi che sia in esecuzione in WSL 2. È possibile confermare questa operazione usando il comando : wsl.exe -l -v. WSL 1 non è supportato.

  10. Rendere WSL consapevole che può espandere le dimensioni del file system per questa distribuzione eseguendo questi comandi dalla riga di comando di distribuzione WSL. Questo messaggio potrebbe essere visualizzato in risposta al primo comando di montaggio : "/dev: none già montato su /dev". Questo messaggio può essere ignorato in modo sicuro.

    sudo mount -t devtmpfs none /dev
    mount | grep ext4
    
  11. Copiare il nome di questa voce, che sarà simile a /dev/sdX (la X rappresenta qualsiasi altro carattere). Nell'esempio seguente il valore di X è b:

   sudo resize2fs /dev/sdb <sizeInMegabytes>M

Usando l'esempio precedente, è stata modificata la dimensione del disco rigido virtuale su 2048000, quindi il comando sarebbe: sudo resize2fs /dev/sdb 2048000M.

Nota

Può essere utile installare resize2fs. In tal caso, è possibile usare questo comando per installarlo: sudo apt install resize2fs.

Il risultato sarà simile al seguente:

resize2fs 1.44.1 (24-Mar-2021)
Filesystem at /dev/sdb is mounted on /; on-line resizing required
old_desc_blocks = 32, new_desc_blocks = 38
The filesystem on /dev/sdb is now 78643200 (4k) blocks long.

L'unità virtuale (ext4.vhdx) per questa distribuzione Linux è stata ora espansa correttamente alle nuove dimensioni.

Importante

È consigliabile non modificare, spostare o accedere ai file correlati WSL all'interno della AppData cartella usando strumenti o editor di Windows. altrimenti rischi di danneggiare la distribuzione Linux. Se si vuole accedere ai file Linux da Windows, è possibile tramite il percorso \\wsl$\<distribution-name>\. Aprire la distribuzione WSL e immettere explorer.exe . per visualizzare tale cartella. Per altre informazioni, vedere il post di blog: Accesso ai file Linux da Windows.

Come ripristinare un errore di montaggio del disco rigido virtuale

Se si verifica un errore relativo al "montaggio del disco di distribuzione", questo potrebbe essere dovuto a un arresto improvviso o a un'interruzione dell'alimentazione e potrebbe comportare la conversione del disco rigido virtuale di distribuzione Linux in sola lettura per evitare la perdita di dati. È possibile ripristinare e ripristinare la distribuzione usando il e2fsck comando Linux seguendo la procedura seguente.

Usare il comando lsblk per identificare il nome del dispositivo a blocchi

Quando WSL 2 installa una distribuzione Linux, monta la distribuzione come disco rigido virtuale (VHD) con il file system. Linux fa riferimento a questi dischi rigidi come "dispositivi bloccati" e è possibile visualizzare le informazioni su di esse usando il lsblk comando .

Per trovare i nomi dei dispositivi a blocchi attualmente usati da WSL 2, aprire la distribuzione e immettere il comando : lsblk. Oppure aprire PowerShell e immettere il comando: wsl.exe lsblk.) L'output avrà un aspetto simile al seguente:

NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda    8:0    0 363.1M  1 disk
sdb    8:16   0     8G  0 disk [SWAP]
sdc    8:32   0   1.5T  0 disk
sdd    8:48   0     1T  0 disk /mnt/wslg/distro

Le informazioni sul dispositivo a blocchi includono:

  • NAME: il nome assegnato al dispositivo sarà sd[a-z], facendo riferimento al disco SCSI con una designazione di lettera per ogni disco usato. sda è sempre la distribuzione del sistema.
  • MAJ:MIN: rappresenta i numeri usati dal kernel Linux per identificare internamente i dispositivi con il primo numero che rappresenta il tipo di dispositivo (8 viene usato per i dischi Small Computer System Interface/SCSI).
  • RM: sappiamo se il dispositivo è rimovibile (1) o meno (0).
  • SIZE: dimensioni totali del volume.
  • RO: sappiamo se il dispositivo è di sola lettura (1) o meno (0).
  • TYPE: fa riferimento al tipo di dispositivo (disco in questo caso).
  • MOUNTPOINTS: fa riferimento alla directory corrente nel sistema dei file in cui si trova il dispositivo a blocchi (SWAP è per memoria preconfigurata inattiva in modo che non sia presente alcun punto di montaggio).

Errore di fallback di sola lettura

Se WSL rileva un "errore di montaggio" quando si apre una distribuzione Linux, la distribuzione può essere impostata come fallback di sola lettura. In tal caso, la distribuzione potrebbe visualizzare l'errore seguente durante l'avvio:

An error occurred mounting the distribution disk, it was mounted read-only as a fallback.

Quando viene avviata una distribuzione come di sola lettura, eventuali tentativi di scrittura nel file system avranno esito negativo con un errore simile al seguente:

$ touch file
touch: cannot touch 'file': Read-only file system

Per ripristinare un errore di montaggio del disco in WSL e ripristinarlo nuovamente in uno stato utilizzabile/scrivibile, è possibile usare il comando per rimontare il wsl.exe --mount disco con la procedura seguente:

  1. Arrestare tutte le distribuzioni WSL aprendo PowerShell e immettendo il comando:

    wsl.exe --shutdown
    
  2. Aprire PowerShell come amministratore (in un prompt dei comandi con privilegi elevati) e immettere il comando di montaggio, sostituendo <path-to-ext4.vhdx> con il percorso del file vhdx della distribuzione. Per informazioni sull'individuazione di questo file, vedere Come individuare il file VHD e il percorso del disco per la distribuzione Linux.

    wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare
    
  3. Usare il wsl.exe lsblk comando di PowerShell per identificare il nome del dispositivo a blocchi per la distribuzione (sd[a-z]) e quindi immettere il comando seguente per ripristinare il disco (sostituendo <device> con il nome del dispositivo a blocchi corretto, ad esempio "sdc"). Il e2fsck comando controlla i file system ext4 (il tipo usato dalle distribuzioni installate con WSL) per gli errori e li ripristina di conseguenza.

    wsl.exe sudo e2fsck -f /dev/<device>
    
  4. Al termine della riparazione, smontare il disco in PowerShell immettendo:

    wsl.exe --unmount
    

Avviso

È possibile usare il comando: sudo mount -o remount,rw / per restituire una distribuzione di sola lettura a uno stato utilizzabile/scrivibile, ma tutte le modifiche saranno in memoria e quindi verranno perse quando la distribuzione viene riavviata. È consigliabile usare i passaggi elencati sopra per montare e ripristinare il disco.

Come individuare il file vhdx e il percorso del disco per la distribuzione Linux

Per individuare il file vhdx e il percorso della directory per una distribuzione Linux, aprire PowerShell e usare lo script seguente, sostituendo <distribution-name> con il nome di distribuzione effettivo:

(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"

Il risultato visualizzerà un percorso simile %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdxa . Ad esempio:

C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

Si tratta del percorso del ext4.vhdx file associato alla distribuzione Linux elencata.