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への接続を切ってから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の最大サイズを小さくできそうな気がする。
defaultVhdSize | size | 1099511627776 (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
/