WSL2의 Ubuntu에서 사용되지 않은 디스크 공간을 어떻게 다시 얻나요?

WSL2의 Ubuntu에서 사용되지 않은 디스크 공간을 어떻게 다시 얻나요?

Windows 10의 WSL2에서 Ubuntu 20.04를 사용하고 있는데 Ubuntu에서 파일을 제거한 후 제거된 파일이 차지한 공간을 다시 가져오지 못하는 것을 발견했습니다. 예: Ubuntu에서 파일을 삭제하기 전에 Windows 탐색기에 ( C:) 드라이브의 여유 공간이 약 46GB인 것으로 표시되었습니다. 그런 다음 약 10GB의 파일을 삭제한 후 임시 Gatsby 사이트의 경우 여유 공간이 약 45GB로 훨씬 적어서 매우 이상하다고 생각했습니다.

그렇다면 사용하지 않은 비트를 어떻게 되돌릴 수 있습니까? Windows GUI 등을 통해 사용할 수 있는 터미널 명령이 있습니까?

답변1

2023년 9월 업데이트: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\

그런 다음 사용되지 않는 공간을 제거하는 데 사용할 수 있는 몇 가지 기술이 있습니다. a로 시작 wsl --shutdown하고 vhdx를 백업으로 복사하여 시작하는 것이 좋습니다 . Docker Desktop을 실행 중인 경우에도 종료하세요. 그렇지 않으면 --shutdown.

  • Windows Professional 이상을 사용하는 경우 Hyper-V를 설치하고 다음에 설명된 대로 Optimize-VHD 커맨드렛을 사용할 수 있습니다.원래 문제. .

  • diskpartWindows Home(및 그 이상)에서는 설명된 대로 사용할 수 있습니다.이 댓글에.

  • WSL 배포판을 내보내고 이를 새 WSL 인스턴스로 다시 가져옵니다(예:이 댓글)도 공간을 회수합니다. 가져온 후에는 기본 사용자 이름을 재설정해야 합니다. 보다여기(그리고여기대체 옵션의 경우).

두 번째와 세 번째 기술을 개인적으로 테스트하고 확인했습니다.

답변2

optimize-vhd시스템에서 let 명령을 사용할 수 없는 경우 다음을 수행하십시오.

디스크를 관리하기 전에 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

  • Windows 기능에서 Hyper-V 모듈을 활성화합니다(제어판 -> Windows 기능 켜기 또는 끄기 -> Hyper-v 활성화 -> 다시 시작). 이는optim-vhd 명령을 활성화하는 데 필요합니다.
  • Windows Powershell을 관리자로 엽니다. 먼저 Windows+R을 눌러 실행을 연 다음 텍스트 상자에 "powershell"을 입력합니다. 그런 다음 Ctrl+Shift+Enter를 누릅니다. Windows PowerShell이 ​​관리자 모드로 열립니다. Powershell에서 다음 명령을 실행합니다.
  • wsl.exe --shutdown
  • 일반적으로 ext4.vhdx 폴더에 CD를 넣으세요.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 시작"을 비활성화해야 합니다).

관련 정보