Как вернуть неиспользуемое дисковое пространство из Ubuntu на WSL2?

Как вернуть неиспользуемое дисковое пространство из Ubuntu на WSL2?

Я использую 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 при входе в систему» ​​следует отключить)

Связанный контент