Я использую Ubuntu 20.04 на WSL2 на Windows 10, и я заметил, что после удаления файлов на Ubuntu я не получаю обратно пространство, которое было занято удаленными файлами. Например: до того, как я удалил файлы на Ubuntu, в проводнике Windows было показано, что мое свободное место на C:
диске ( ) составляло около 46 ГБ. Затем, после того, как я удалил около 10 ГБ файлов, которые в моем случае были временными сайтами Gatsby, это привело к еще меньшему свободному месту, около 45 ГБ, что я посчитал очень странным.
Так как мне вернуть эти неиспользуемые биты? Есть ли какая-то команда терминала, которую я могу использовать, или я могу сделать что-то через графический интерфейс Windows или что-то еще?
решение1
Обновление за сентябрь 2023 г.:Сообщается, что новая предварительная версия WSL (2.0.0) обеспечивает новый «разреженный» режим для образов дисков, который автоматически сжимает образ при удалении файлов.
Хотя я еще не проверял это лично, изАнонс DevBlogвы можете преобразовать существующий образ диска в разреженный с помощью следующей команды из PowerShell:
wsl --manage <distro> --set-sparse true
Вы также можете добавить следующее в свой .wslconfig
(расположенный в вашем Windowsпрофилькаталог, не внутри WSL), чтобы любой вновь созданный образ дистрибутива был разреженным:
[experimental]
sparseVhd=true
Предыдущий ответ:
Есть WSL Githubпроблемаоткрыто по этой теме. WSL автоматически увеличит виртуальный диск (ext4.vhdx), но его сжатие для освобождения неиспользуемого пространства в настоящее время должно выполняться вручную.
Первое, что вам нужно сделать, это узнать местоположение вашего ext4.vhdx. Для установки Ubuntu по умолчанию он должен быть где-то вроде%USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\
Затем есть несколько методов, которые вы можете использовать для удаления неиспользуемого пространства. Я рекомендую вам начать с wsl --shutdown
и скопировать vhdx в качестве резервной копии для начала. Если вы используете Docker Desktop, также закройте его, иначе он может непреднамеренно попытаться перезапустить WSL после вашего --shutdown
.
Если вы используете Windows Professional или более позднюю версию, вы можете установить Hyper-V и использовать командлет Optimize-VHD, как описано воригинальный выпуск. .
В Windows Home (и выше) вы можете использовать
diskpart
описанные выше способы.в этом комментарии.Экспорт дистрибутива WSL и его повторный импорт в новый экземпляр WSL (как вэтот комментарий) также вернет пространство. Обратите внимание, что после импорта вам нужно будет сбросить имя пользователя по умолчанию. Смотритездесь(издесьдля альтернативных вариантов).
Я лично проверил и подтвердил эффективность как второго, так и третьего метода.
решение2
Если команда let optimize-vhd
недоступна в вашей системе, выполните следующие действия:
Выключите wsl перед управлением его диском.
wsl --shutdown
Сохраните следующий скрипт как 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
Откройте командную строку от имени администратора и запустите сохраненный выше скрипт.
diskpart /s <SAVED_SCRIPT_FOLDER_PATH>\compact-disk.txt
решение3
- Активируйте модуль Hyper-V в компонентах Windows (Панель управления -> Включение или отключение компонентов Windows -> Активировать Hyper-V -> Перезагрузка). Это необходимо для активации команды optimize-vhd.
- Откройте windows powershell как администратор: сначала нажмите Windows+R, чтобы открыть Run, а затем введите «powershell» в текстовом поле. Затем нажмите Ctrl+Shift+Enter. Windows PowerShell откроется в режиме администратора. В powershell выполните следующие команды.
wsl.exe --shutdown
- Перейдите в папку ext4.vhdx, которая обычно находится
cd C:\Users\<user>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\
optimize-vhd -Path .\ext4.vhdx -Mode full
(Убедитесь, что ext4.vhdx не нажат мышью, так как это приведет к ошибке использования файла другим процессом в PowerShell)
решение4
С помощью этого скрипта Self-elevate вы можете сжать несколько VHDX одновременно.
# 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"
Кстати, с небольшой настройкой вы также можете запускать его при запуске системы («Запускать Docker при входе в систему» следует отключить)