WSL: Distroの初期化について

※記事末尾にルートボリュームを固定する方法を記載。

WSLの仮想ディスク肥大化によりCドライブが枯渇してしまった。管理者権限を普段持っていないような端末である場合、diskpartやOptimize-VHDを使ってvhdxの容量を小さくすることが出来ない。管理者権限を持っていないような端末であるから、肥大化したvhdxを外部に送信して外部で小さくするなんてこともやりたくない。最低限のデータを引き上げて、肥大化したvhdxを削除する方針で解決を図った。

vhdxのファイル自体はユーザ権限でリネームや削除が可能である。WSLのディストロ(Ubuntuなど)は管理者権限無しで再インストールが可能なのか?が気になるところであったが、結論としては可能であった。wsl –unregisterコマンドで登録の解除を行い、wsl –installで再インストールを行う。unregisterコマンドを実行した時点でvhdxは削除されたため、新しいwslでマウントしたい場合は先にvhdxファイルを回収しておくこと。vhdxファイルは
%HOMEPATH%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_hogehoge\LocalState
のようなパスの場所にある(hogehogeの個所は環境によって恐らく変化する)。
マウントが不要な場合であっても必要に応じて.ssh以下のファイルなどをバックアップしておく。

>wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
>wsl --shutdown
>wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。

インストールは次のコマンドで行う。ここで管理者権限が必要かと思っていたが、別に要らなかった。

>wsl --install -d Ubuntu
Ubuntu は既にインストールされています。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: 
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/ubuntu/.hushlogin file.
:~$

同じ問題が発生しないようにvhdxの容量を固定化したいが、端末に管理者権限が無いためこれも結構面倒である(※本ページ下部に追記あり、wslconfigでディスクサイズを設定可能)。今回はルートボリュームの固定化は一旦諦めて、作業用のサイズを固定化したvhdxをWSLにマウントすることにした。(作業用のサイズ固定vhdxを用意できるならルートボリュームも一工夫で行けると思うが、ルートボリューム自体はスクラップ&ビルドできることが分かったので・・・)

固定化したvhdxは外部端末で作成する。中身が空なら圧縮で小さくできるので、外部端末で用意したvhdx(zip圧縮)を管理者権限が無い端末にダウンロードして使用する。

vhdxの作成も権限が無いとできない

作成すると自動的に接続されるので、vhdxへの接続を切ってからzip圧縮を行う。15GBのサイズ固定ディスクも中身が無ければ圧縮で20MB程度になる。

管理者権限が無い方の端末ではコマンドプロンプトまたはWSLのプロンプトから作成したvhdxをマウントすることが出来る。マウントしたディスクは初期化していないのでmkfsでext4で初期化して使用する。

$ /mnt/c/Windows/System32/wsl.exe --mount --vhd "C:\WSL\data.vhdx"
$ sudo mkfs -t ext4 /dev/sdd
$ /mnt/c/Windows/System32/wsl.exe --unmount "C:\WSL\data.vhdx"
$ /mnt/c/Windows/System32/wsl.exe --mount --vhd "C:\WSL\data.vhdx"

初回のマウント時はwslにはvhdxをアタッチできるが、ファイルシステムにマウントが出来ない旨のエラーが表示される。このため、ext4でフォーマットしたあとにunmountをして再度mountすることでエラーが出なくなることを確認する。mountする際に –nameでマウント時の名前が付けられるが、名前を付けない場合はvhdxのフルパスをもとに名前が付けられるようだ(例 C:\WSL\data.vhdx → /mnt/wsl/CWSLdatavhdx)。

wsl.exe –mountを行うと、WSL上では/mnt/wsl/名前で自動的にファイルシステム上でmountされる。(この辺りは全ディストロで同じ動きするかは不明)

作成したvhdxが自動でマウントされるように WSLの.profileにマウントコマンドを設定しておく。

$ cat ~/.profile
~~省略~~
if [ ! -d /mnt/wsl/CWSLdatavhdx ]; then
  /mnt/c/Windows/System32/wsl.exe --mount --vhd "C:\WSL\data.vhdx"
fi
~~省略~~

あとは、極力作業はマウントしたdata.vhdxの中で行う。サイズ固定のため、勝手に肥大化することは無いはず・・・(Cドライブに自動で作られるWSL用のvhdxの最大サイズがデフォルトで1TB?なのは問題だと思います)

追記(ルートボリュームのサイズ固定)

WSLの設定にディスクに関するものが無いかを確認したところ、次の設定があった。作成済みのVHDXはだめかもしれないが、再インストールする段階で設定しておけばVHDXの最大サイズを小さくできそうな気がする。

.wslconfig の構成設定

defaultVhdSizesize1099511627776 (1TB)Linux ディストリビューション (Ubuntu など) ファイル システムを格納する仮想ハード ディスク (VHD) のサイズを設定します。 配布ファイル システムで使用できる最大サイズを制限するために使用できます。

例えば、rootディスクを50GBに制限して再セットアップを行う場合、まずはwslをshutdownして、再インストールしたいディストロをunregisterする。windowsの$HOME下に.wslconfigを作成し、defaultVhdSizeを定義する。今回は50*1024*1024*1024=53687091200 bytesで50GBを指定した。memoryやprocessorsもついでに設定しておく。

> wsl --shutdown
> wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。
> cat $HOME/.wslconfig
[wsl2]
memory=6GB
processors=6
defaultVhdSize=53687091200

.wslconfigの準備が完了したらwslの再インストールを行う。

> wsl --install -d Ubuntu
Ubuntu は既にインストールされています。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: 
New password:
Retype new password:
passwd: password updated successfully
この操作を正しく終了しました。
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/wsl/.hushlogin file.

作業前後のlsblkを以下に記載する。ルートディレクトリに充てられるsdcのサイズが50GBになっていることが確認できる。

$ lsblk
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda    8:0    0 388.6M  1 disk
sdb    8:16   0     4G  0 disk [SWAP]
sdc    8:32   0     1T  0 disk /snap
                               /mnt/wslg/distro
                               /
$ lsblk
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda    8:0    0 388.6M  1 disk
sdb    8:16   0     2G  0 disk [SWAP]
sdc    8:32   0    50G  0 disk /snap
                               /mnt/wslg/distro
                               /