¿Cómo recupero el espacio en disco no utilizado de Ubuntu en WSL2?

¿Cómo recupero el espacio en disco no utilizado de Ubuntu en WSL2?

Estoy usando Ubuntu 20.04 en WSL2 en Windows 10 y noté que después de eliminar archivos en Ubuntu no recuperaba el espacio que ocupaban los archivos eliminados. Por ejemplo: antes de eliminar archivos en Ubuntu, en el explorador de Windows se mostraba que mi espacio libre en la C:unidad ( ) era de alrededor de 46 GB. Luego, después de que eliminé alrededor de 10 GB de archivos, que en mi caso eran algunos sitios temporales de Gatsby, resultó en incluso menos espacio libre, alrededor de 45 GB, lo cual me pareció muy extraño.

Entonces, ¿cómo puedo recuperar esos bits no utilizados? ¿Existe algún comando de terminal que pueda usar o puedo hacer algo a través de la GUI de Windows o algo así?

Respuesta1

Actualización de septiembre de 2023:Se informa que una nueva versión preliminar de WSL (2.0.0) proporciona un nuevo modo "escaso" para imágenes de disco que reducirá automáticamente la imagen cuando se eliminen los archivos.

Si bien todavía no lo he probado personalmente, desde elAnuncio del blog de desarrollo, puede convertir una imagen de disco existente a dispersa con el siguiente comando de PowerShell:

wsl --manage <distro> --set-sparse true

También puede agregar lo siguiente a su .wslconfig(ubicado en su Windowsperfildirectorio, no dentro de WSL) para que cualquier imagen de distribución recién creada sea escasa:

[experimental]
sparseVhd=true

Respuesta anterior:

Hay un WSL Githubasuntoabierto sobre este tema. WSL hará crecer automáticamente el disco virtual (ext4.vhdx), pero reducirlo para recuperar espacio no utilizado es algo que actualmente se debe hacer manualmente.

Lo primero que deberá hacer es conocer la ubicación de su ext4.vhdx. Para una instalación predeterminada de Ubuntu, debería estar en algo como%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\

Luego, existen varias técnicas que puedes utilizar para eliminar el espacio no utilizado. Te recomiendo comenzar con a wsl --shutdowny copiar el vhdx como respaldo para comenzar. Si está ejecutando Docker Desktop, apáguelo también; de lo contrario, puede intentar reiniciar WSL sin darse cuenta después de su archivo --shutdown.

  • Si tiene Windows Professional o superior, puede instalar Hyper-V y usar el comando Optimize-VHD como se describe en lanúmero original. .

  • En Windows Home (y superior) puede utilizar diskpartcomo se describeen este comentario.

  • Exportar la distribución WSL y volver a importarla a una nueva instancia WSL (como eneste comentario) también recuperará el espacio. Tenga en cuenta que deberá restablecer el nombre de usuario predeterminado después de una importación. Veraquí(yaquípara opciones alternativas).

He probado y confirmado personalmente la segunda y la tercera técnica.

Respuesta2

Cuando el comando let optimize-vhdno esté disponible en su sistema, haga lo siguiente:

Apague el wsl antes de administrar su disco

wsl --shutdown

Guarde el siguiente script como compact-disk.txt

select vdisk file="C:\Users\%username%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk

Abra el mensaje como administrador y ejecute el script guardado arriba

diskpart /s <SAVED_SCRIPT_FOLDER_PATH>\compact-disk.txt

Respuesta3

  • Active el módulo Hyper-V en las funciones de Windows (panel de control -> Activar o desactivar las funciones de Windows -> activar Hyper-v -> reiniciar). Esto es necesario para activar el comando optimizar-vhd.
  • Abra Windows PowerShell como administrador: primero, presione Windows+R para abrir Ejecutar y luego escriba "PowerShell" en el cuadro de texto. A continuación, presione Ctrl+Mayús+Entrar. Windows PowerShell se abrirá en modo administrador. En PowerShell, ejecute los siguientes comandos.
  • wsl.exe --shutdown
  • cd en la carpeta ext4.vhdx que normalmente escd C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\
  • optimize-vhd -Path .\ext4.vhdx -Mode full(Asegúrese de que no se haga clic en ext4.vhdx con el mouse, ya que eso provocaría el error de que otro proceso en PowerShell está utilizando el archivo)

Respuesta4

Con este script de autoelevación puedes compactar varios vhdx a la vez.

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
        Exit
    }
}

#Full Path of vhdx file
$d1 = #Ex: "E:\Docker\wsl\data\ext4.vhdx"
$d2 = ""
$d3 = ""
$d4 = ""
$d5 = ""
$d6 = ""

$paths = $d1, $d2, $d3, $d4, $d5, $d6

foreach ($file in $paths) {
    echo ""
    echo "Befor Shrinking File sizes in MB"
    Get-ChildItem -Path $file | Select-Object FullName, @{Name = "Size"; E = { $_.Length / 1MB } }
    echo ""
    echo "---------"
    echo "Shrinking $file"
    echo "---------"

    wsl --shutdown
    Optimize-VHD -Path $file -Mode Full

    echo ""
    echo "After Shrinking File sizes in MB"
    Get-ChildItem -Path $file | Select-Object FullName, @{Name = "Size"; E = { $_.Length / 1MB } }
    echo ""
    echo ""
    echo ""
    echo ""
}

Read-Host -Prompt "Press Enter to exit"

Por cierto, con un pequeño ajuste también puedes ejecutarlo al inicio ("Iniciar Docker cuando inicies sesión" debería estar deshabilitado)

información relacionada