WSL2 上の Ubuntu から未使用のディスク領域を取り戻すにはどうすればよいですか?

WSL2 上の Ubuntu から未使用のディスク領域を取り戻すにはどうすればよいですか?

私は Windows 10 の WSL2 で Ubuntu 20.04 を使用していますが、Ubuntu でファイルを削除した後、削除したファイルによって占められていたスペースが戻ってこないことに気付きました。たとえば、Ubuntu でファイルを削除する前は、Windows エクスプローラーで ( C:) ドライブの空き容量が約 46 GB と表示されていました。その後、約 10 GB のファイル (私の場合は一時的な Gatsby サイト) を削除した後、空き容量がさらに少なくなり、約 45 GB になりました。これは非常に奇妙だと思いました。

では、未使用のビットをどうやって取り戻せばいいのでしょうか? 使用できるターミナル コマンドはありますか? または、Windows GUI などを使用して何かできますか?

答え1

2023年9月更新:WSL の新しいプレリリース (2.0.0) では、ファイルが削除されるとイメージが自動的に縮小される、ディスク イメージの新しい「スパース」モードが提供されると報告されています。

私はまだ個人的にこれをテストしていませんが、開発ブログのお知らせ、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コマンドレットを使用できます。オリジナル号。 。

  • diskpartWindows Home(およびそれ以上)では、説明どおりに使用できます。このコメントで

  • WSLディストリビューションをエクスポートし、新しいWSLインスタンスに再インポートする(このコメント)もスペースを再利用します。インポート後にデフォルトのユーザー名をリセットする必要があることに注意してください。ここ(そしてここ代替オプションについてはこちらをご覧ください。

私は2番目と3番目の両方の手法を個人的にテストし、確認しました。

答え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 のアクティブ化 -> 再起動)。これは、optimize-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 を起動する」は無効にする必要があります)

関連情報