0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WSL2の仮想ハードディスク容量を最適化するPowershellスクリプト

Posted at

WSL2 の仮想ハードディスクがどんどん大きくなるので、ときどき最適化させるためのスクリプトを書いた。

スクリプト

<#
.SYNOPSIS
  WSL2 の仮想ハードディスク(VHD)ファイルの容量を最適化します。
.DESCRIPTION
  WSL2 で作成されたVHDファイルは、継続的なコンテナ開発などで容量が増大します。
  このスクリプトでは、内部の不要なコンテナイメージを除去し、その後 VHD ファイルのサイズを最適化します。
.NOTES
  VHD ファイルのバックアップを推奨します。
#>

# VHDが存在するフォルダ(サブフォルダOK)
$wslDir = 'C:\develop\WSL'
$files = Get-ChildItem $wslDir -Recurse -File -Filter '*.vhdx'

if ($files.Count -eq 0) {
  Write-Host ('"{0}" に仮想ハードディスクファイル(.vhdx) が見つかりませんでした。終了します。' -f $wslDir)
  return
}

$i = 0
$files |
  ForEach-Object {
    [PSCustomObject]@{
      Number  = $i
      Name    = $_.Directory.Name
      Size_MB = $_.Length / (1MB)
    }
    $i++
  } |
  Format-Table
$no = Read-Host 'Input Number'

Write-Host 'WSLを起動します。数秒お待ち下さい。'
Write-Host '圧縮前に不使用のコンテナイメージを削除するには、 "y" を入力してください。' -ForegroundColor Cyan
wsl -d $files[$no].Directory.Name docker system prune

wsl --shutdown

$scriptFile = $pwd.Path + '\diskpart-script.txt'
@"
select vdisk file="$($files[$no].FullName)"
attach vdisk readonly
compact vdisk
detach vdisk
"@ | Set-Content $scriptFile -Encoding ascii
diskpart /s $scriptFile

Write-Host 'diskpart を起動します。処理には数十秒かかる場合があります。'

雑記

 VHD は容量固定できるからこの作業はスマートじゃない気がする、ということでスクリプト化して目を背ける。だって、VHDを作った後でのサイズ変更は手順が少し多くて、自分でやるならまだしもメンバーに展開するのは面倒だもん。壊しそう。

 diskpart さん、対話的なインターフェースしかなくてバッチでやるにはファイルを食わせるしかないの、ちょっと頼みますよ…。

 今回のように、軽く作ったスクリプトの頭に comment-help を付けるのを、最近の習慣にしてる。
この書式だと、コマンドレットでもスクリプトでも get-help したときにいい感じに出力される。 #######... とかで手動で装飾するの、嫌なのよね。 get-help しないにしても、コメントの書き方がゆるく標準化されてファイル上で見やすいのがいい。あと短い説明と長い説明のセクションが別れているのが好き。なぜか背景まで書きたくなるのであとで助かる。使用例とか参考URLのセクションまであるのも好き。
その場の小さな課題解決のために書いたスクリプトが結構散らかっていて、「使い捨て」と「どこかで再利用する」の未来を重ね合わせて存在する(多用するものはプロファイルフォルダに入れて自動読み込みさせてる)んだけど、この習慣を始めてからだいぶ扱いやすくなった。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?