*nixで過ごす日々

PCでの作業に役立つ情報を提供するブログ

WSL2のストレージを移動する

WSL2はHyper-Vに近いしくみになっていて、データはVHDの中に格納されている。
VMに近いということはストレージ移動できるでしょ?と考える人は多いようでGitHubにissueが作られている。

github.com

詳細は上のissueを見ること。
以下要約

> wsl --export Ubuntu ubuntu.tar
> wsl --unregister Ubuntu
> wsl --import Ubuntu D:\wsl\Ubuntu\ ubuntu.tar

ただし、インポートを行うとデフォルトユーザがrootになる。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}の中のDefaultUidの値をデフォルトにしたいユーザのUIDに変更する。
基本は1000にすれば良い。

※ tar形式でエクスポートするときにサイズが1GBを大きく超えるとインポートが出来ないらしい

github.com

VHD形式でインポート・エクスポートすれば良い

> wsl --export Ubuntu ubuntu.vhdx --vhd
> wsl --unregister Ubuntu
> wsl --import Ubuntu D:\wsl\Ubuntu\ ubuntu.vhdx --vhd

解説

1行目

wsl2のディストリビューションを指定の形式でエクスポートする。

> wsl --export <dist_name> <target>

<dist_name>はwslのディストリビューションの名前(wsl -lで表示される名前)を指定する。
<target>は出力先を指定する。
デフォルトでtar形式で出力されるようだ。

2行目

エクスポートするとデータは移動されるが、エントリが残る。
インポートする時に同じ名前で登録したいのでここで消す。

> wsl --unregister <dist_name>

<dist_name>はwslのディストリビューションの名前を指定する。(1行目と同じ名前)

3行目

インポートする時にパスを指定すると、VHDを指定したパスに配置することができる。

> wsl --import <dist_name> <path> <target>

<dist_name>は好きな名前を付けることができる。特にこだわりがなければ上2行と同じで良いだろう。
<path>はVHDを配置するディレクトリを指定する。指定したディレクトリ直下にext4.vhdxが配置されるので、D:\wsl\Ubuntu\のようにディストリビューションの名前がわかるようにしておくと良いだろう。
<target>はエクスポートしたファイルを指定する。

デフォルトユーザの指定

※ 元からrootユーザを使っていた場合は以降の手順は不要。
以上の手順まででVHDの移動は終わっているが、デフォルトユーザがrootになってしまっている。
デフォルトディストリビューションは次のコマンドでデフォルトユーザを変更できる。

> ubuntu config --default-user <USERNAME>

<USERNAME>は元々使っていたユーザ名を指定する。

デフォルトディストリビューション以外の場合はレジストリを編集するか、ディストリビューション上に設定ファイルを配置する。

レジストリで変更する

ディストリビューションをインストールするとHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxssの下にGUIDのキーが作成される。
その中のDistributionNameの値で変更したいディストリビューションを判別する。
インポートしてすぐはDefaultUid0(=root)になっている。
これをデフォルトユーザにしたいユーザのUIDに変更する。(基本的に10進数で1000で良い)。

設定ファイルで変更する

インポートしたディストリビューションにログインし、/etc/wsl.confを作成・編集する。

[user]
default=<USERNAME>

<USERNAME>は元々使っていたユーザ名を指定する。