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 --shutdown
y 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
diskpart
como 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-vhd
no 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 es
cd 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)