WSLにはVMの内容をtar形式のアーカイブファイルへエクスポートする機能がある。
これでVMのバックアップやスナップショット的な状態保存、別名でインポートすることで同じディストリビューションのVMを複数作ったりできる。
Dockerでいうとexport/importに相当。
VM環境の保存(エクスポート)
tar形式にエクスポートするには--export
オプションを使う。
「Ubuntu-20.04」ディストリビューションをUbuntu-20.04.tar
ファイルへエクスポートするには以下。
PS C:\Users\zaki> wsl --export Ubuntu-20.04 Ubuntu-20.04.tar
tarファイルのインポート
エクスポートして保存したtarファイルは、--import
オプションを使ってインポートできる。
名前(ディストリビューション名)をエクスポート元のディストリビューションと異なるものを指定することで、環境のコピーとなる。
書式は wsl --import ディストリビューション名 インストール先ファイルパス インポートするtarファイル
。
PS C:\Users\zaki> wsl --import ubuntu-20.04-container .\work\wsl\ubuntu-20.04-container .\Ubuntu-20.04.tar
インストール先ファイルパスには、インポートしたあとのvhdxファイルの保存場所を指定する。
デフォルトユーザーの変更
tarファイルをインポートしただけの状態だと、シェルを起動するとなぜかrootユーザーになる(もともと作成済みのユーザーへsu
で切り替えは可能)。
ちょっと不便なのでデフォルトユーザーを以下PowerShellで更新する。
PS C:\Users\zaki> Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value ((wsl -d $distro -u $user -e id -u) | Out-String); }; PS C:\Users\zaki> WSL-SetDefaultUser ubuntu-20.04-container zaki
やっていることはレジストリ値の更新で、指定ディストリビューションのDefaultUid
の値を指定のユーザーからuidを取得して設定している。
元ネタはこちら。
一つ目のコマンドで更新用関数を定義し、二つ目のコマンドで、第1引数に対象ディストリビューション名、第2引数にデフォルトにするユーザー名を指定する。
VMの削除
削除するにはディストリビューション名を引数に--unregister
オプションを使う。
PS C:\Users\zaki> wsl --unregister ubuntu-20.04-container 登録を解除しています...
これで気軽に環境のコピーを作れるので、コンテナほどサイズは小さくはないけど、サービス用・開発用・ステージング用などいろいろ試して壊す環境を気軽に用意できる。