Come gestire lo spazio su disco WSL

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

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

WSL 2 ridimensiona automaticamente questi file VHD per soddisfare le esigenze di archiviazione. Per impostazione predefinita, a ogni file VHD usato da WSL 2 viene inizialmente allocato uno spazio massimo su disco di 1 TB (prima della versione 0.58.0 di WSL questo valore predefinito era impostato su un massimo di 512 GB e prima ancora su un massimo di 256 GB).

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

Come controllare lo spazio disponibile su disco

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 disponibile su disco, aprire una riga di comando di PowerShell e immettere questo comando (sostituendo <distribution-name> con il nome effettivo della distribuzione):

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

Se questo comando non funziona, aggiornare alla versione Store di WSL usando il comando wsl --update o provare wsl df -h /.

L'output includerà:

  • File system: identificatore del file system del disco rigido virtuale (VHD)
  • Dimensioni: dimensione totale del disco (la quantità massima di spazio allocata al disco rigido virtuale)
  • Usato: quantità di spazio attualmente in uso nel disco rigido virtuale
  • Disponibilità: quantità di spazio rimanente nel disco rigido virtuale (la dimensione allocata meno la quantità usata)
  • Use%: percentuale di spazio su disco rimanente (dimensione usata/allocata)
  • Montato su: percorso della directory in cui è montato il disco

Se si sta per raggiungere la quantità di spazio disponibile su disco, allocato sul disco rigido virtuale o si è già ricevuto un errore dovuto all'assenza di spazio su disco, vedere la sezione successiva per informazioni su come espandere la quantità massima di spazio su disco allocato sul disco rigido virtuale associato alla distribuzione Linux. La quantità di spazio su disco allocata sul disco rigido virtuale da WSL mostrerà sempre la quantità massima predefinita (1 TB nella versione più recente di WSL), anche se la quantità di spazio su disco effettivo nel dispositivo Windows è inferiore. WSL monta un disco rigido virtuale che si espande man mano che lo si usa, in modo che la distribuzione Linux rilevi che può aumentare 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 il valore massimo di 1 TB di spazio su disco allocato, seguire questa procedura. (Per le versioni precedenti di WSL non ancora aggiornate, questo valore massimo predefinito 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 sul 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. Verrà visualizzato il prompt DISKPART>. Immettere il comando seguente, sostituendo <pathToVHD> con il percorso della directory al file ext4.vhdx associato alla distribuzione Linux (copiato nel passaggio n. 2).

    Select vdisk file="<pathToVHD>"
    
  5. Visualizzare i dettagli associati a questo disco virtuale, inclusa la dimensione virtuale, che rappresenta la dimensione massima corrente allocata sul disco rigido virtuale:

    detail vdisk
    
  6. È necessario convertire le dimensioni virtuali in megabyte. Ad esempio, se dimensioni virtuali: 512 GB, è uguale a 512000 MB. Il nuovo valore immesso deve essere maggiore del valore originale. Per raddoppiare le dimensioni virtuali da 512 GB a 1024 GB, immettere il valore in MB come: 1024000. Prestare attenzione a non immettere un valore superiore a quello desiderato, perché il processo di riduzione delle dimensioni di un disco virtuale è molto più complicato.

  7. Immettere il valore delle nuove dimensioni massime da allocare a questa distribuzione Linux usando il prompt del prompt dei comandi di Windows DISKPART>:

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

    exit
    
  9. Avviare questa distribuzione linux. (assicurarsi che sia in esecuzione in WSL 2. È possibile confermarlo usando il comando: wsl.exe -l -v. WSL 1 non è supportato).

  10. Rendere WSL consapevole della possibilità di espandere le dimensioni del file system per questa distribuzione, eseguire questi comandi dalla riga di comando della distribuzione WSL. È possibile che venga visualizzato questo messaggio in risposta al primo comando mount: "/dev: nessuno già montato su /dev". È possibile ignorare questo messaggio.

    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 in 2048000, quindi il comando sarà: sudo resize2fs /dev/sdb 2048000M.

Nota

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

L'output 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 espansa con successo alle nuove dimensioni.

Importante

Si consiglia di non modificare, spostare o accedere ai file relativi a WSL che si trovano nella cartella AppData usando strumenti o editor di Windows. altrimenti rischi di danneggiare la distribuzione Linux. Se si vuole accedere ai file di Linux da Windows, è possibile farlo tramite il percorso \\wsl$\<distribution-name>\. Aprire la distribuzione WSL ed immettere explorer.exe . per visualizzare la 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 il passaggio del disco rigido virtuale della distribuzione Linux di sola lettura per evitare la perdita di dati. È possibile riparare e ripristinare la distribuzione usando il comando e2fsck di Linux seguendo questa procedura.

Usare il comando lsblk per identificare il nome del dispositivo di blocco

Quando WSL 2 installa una distribuzione Linux, la monta come disco rigido virtuale (VHD) con il proprio file system. Linux fa riferimento a questi dischi rigidi come "dispositivi in blocchi" ed è possibile visualizzare le relative informazioni usando il comando lsblk.

Per trovare i nomi dei dispositivi in blocchi attualmente usati da WSL 2, aprire la distribuzione e immettere il comando: lsblk. (In alternativa, aprire PowerShell e immettere il comando: wsl.exe lsblk.) L'output sarà 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 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: indica se il dispositivo è rimovibile (1) o meno (0).
  • SIZE: dimensioni totali del volume.
  • RO: indica 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 del filesystem in cui si trova il dispositivo a blocchi (SWAP è per la memoria inattiva preconfigurata, quindi non ha un punto di montaggio).

Errore di fallback di sola lettura

Se WSL incontra un "errore di montaggio" all'apertura di una distribuzione Linux, la distribuzione può essere impostata di sola lettura come fallback. In questo caso, la distribuzione potrebbe visualizzare il seguente errore durante l'avvio:

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

Quando una distribuzione viene avviata come di sola lettura, qualsiasi tentativo di scrittura sul filesystem avrà 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 riportarlo a uno stato utilizzabile/scrivibile, è possibile utilizzare il comando wsl.exe --mount per rimontare il disco seguendo questa procedura:

  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 mount, 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 comando wsl.exe lsblk di PowerShell per identificare il nome del dispositivo di blocco per la distribuzione (sd[a-z]), quindi immettere il comando seguente per ripristinare il disco (sostituendo <device> con il nome corretto del dispositivo di blocco, ad esempio "sdc"). Il comando e2fsck controlla la presenza di errori nei file system ext4 (il tipo usato dalle distribuzioni installate con WSL) e li ripara di conseguenza.

    wsl.exe sudo e2fsck -f /dev/<device>
    

Nota

Se è installata una sola distribuzione Linux, potrebbe verificarsi un errore "ext file in uso" e sarà necessario installare una distribuzione aggiuntiva per eseguire wsl.exe lsblk. È possibile disinstallare la distribuzione al termine del ripristino.

  1. Al termine del ripristino, 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 andranno perse al riavvio della distribuzione. È consigliabile usare i passaggi elencati in precedenza 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 di una distribuzione Linux, aprire PowerShell e usare lo script seguente, sostituendo <distribution-name> con il nome effettivo della distribuzione:

(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 a %LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx. Ad esempio:

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

È il percorso del file ext4.vhdx associato alla distribuzione Linux elencata.