WSL — Windows Subsystem for Linux

Windows で Linux ディストリビューションを扱うための機能

Installation

  1. WinXA でターミナルを管理者として起動。

  2. WSL を有効化してディストリビューションを入れる:

    wsl --install

    既定では Ubuntu がインストールされる。 -d/--distribution でほかのディストリビューションも指定可能。 wsl --list --online で利用可能なディストリビューションを確認できる。

  3. マシンを再起動する。

  4. 再起動後、インストール処理を経て Ubuntu が起動する。

  5. Enter new UNIX usernaem: と表示されたらユーザーネームを設定:

    松田       # NG!: 日本語
    y matsuda  # NG!: スペースを含む
    y.matsuda  # NG!: ピリオドを含む
  6. Enter new UNIX password: と表示されたらパスワードを設定。 sudo とかするときに要求される。

  7. Retype new UNIX password: と表示されたらパスワードを再入力。

ビルド 18362 未満の古い Windows の場合は手動インストールが必要: https://learn.microsoft.com/ja-jp/windows/wsl/install-manual


WSL 内での作業は基本的に Linux と同じ。 日本語の公式ドキュメントチュートリアル がちゃんと書かれているので、基本的にこれらを読む。

Windows (C ドライブ) 側からのアクセスは、WSL を有効化したときにエクスプローラに表示される “> Linux” から。

Disk Space の問題

WSL2 のディスク消費は、WSL2 内部でファイルを消してもサイズが小さくならないらしい。 つまり、いくら WSL 側でファイルを rm しようが garbage collection しようが、 マシンのストレージは圧迫され続ける。

WSL2 で使用する Linux ディストリビューションのデータは仮想ハードディスク (VHD) で管理されていて、 ここがデータの本体を持っているから、だと思う。

なので根本的にディスク容量を開放するには、 VHD を最適化する必要がある。

VHD (.vhdx) を探す

https://learn.microsoft.com/ja-jp/windows/wsl/disk-space#how-to-locate-the-vhdx-file-and-disk-path-for-your-linux-distribution

一応正規の方法は:

PowerShell
(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"

らしい。 ls で探す場合:

PowerShell
> ls C:\Users\<username>\AppData\Local\Packages\Canonical*  # _username_ は自分のものを


    ディレクトリ: C:\Users\<username>\AppData\Local\Packages


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023/01/05     21:33                CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
d-----        2023/01/05     21:36                CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc

使っているディストリビューションのディレクトリ内にある LocalState\ext4.vhdx がいる。 (onWindows の方にはなかった。)

PowerShell
> ls C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\


    ディレクトリ: C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/06/06     14:04   208281796608 ext4.vhdx

DISKPART を使って VHD を確認する

まず wsl をシャットダウンする:

PowerShell
wsl --shutdown

DISKPART インタプリタを起動する:

PowerShell
diskpart

先ほど調べた VHD を選択する:

DISKPART
DISKPART> select vdisk file=C:\Users\_username_\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx

DiskPart により、仮想ディスク ファイルが選択されました。

VHD の情報を確認する:

DISKPART
DISKPART> detail vdisk

デバイスの種類 ID: 0 (不明)
ベンダー ID: {00000000-0000-0000-0000-000000000000} (不明)
状態: 追加済み
仮想サイズ: 1024 GB
物理サイズ:  193 GB
ファイル名: C:\Users\_username_\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx
子: いいえ
親ファイル名:
関連付けられたディスク番号: 見つかりません。

VHD ディスクスペースを最適化する

Attach -> Compact -> Detach の順に実行する。

Attach:

DISKPART
DISKPART> attach vdisk readonly

  100% 完了しました

DiskPart により、仮想ディスク ファイルがアタッチされました。

Compact (本質):

DISKPART
DISKPART> compact vdisk

  100% 完了しました

DiskPart により、仮想ディスク ファイルは正常に圧縮されました。

Detach:

DISKPART
DISKPART> detach vdisk

DiskPart により、仮想ディスク ファイルがデタッチされました。

DISKPART を終了する (その前にもう一回 detail してもよい):

DISKPART
DISKPART> exit