zaki work log

作業ログやら生活ログやらなんやら

WSLでVM環境のコピー(exportとimport)

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を取得して設定している。
元ネタはこちら

github.com

一つ目のコマンドで更新用関数を定義し、二つ目のコマンドで、第1引数に対象ディストリビューション名、第2引数にデフォルトにするユーザー名を指定する。

VMの削除

削除するにはディストリビューション名を引数に--unregisterオプションを使う。

PS C:\Users\zaki> wsl --unregister ubuntu-20.04-container
登録を解除しています...

これで気軽に環境のコピーを作れるので、コンテナほどサイズは小さくはないけど、サービス用・開発用・ステージング用などいろいろ試して壊す環境を気軽に用意できる。