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
-
Dockerのお掃除 - Qiita
dockerのお勉強とか、実験とかしているとゴミが沢山できるのでお掃除の方法をメモしておきます。
-
Windows/WSL2の容量を減らす方法 - あんこ | Zenn
気になったアプリはつい入れちゃうワガママ生活を送っていたら
no space left
なるディスクエラーが出てくるようになってきたのでダイエットしていこうという記事です。 - Using powershell to run diskpart commands - Super User