🙌

同一PC内の複数WindowsアカウントでWSL2ディストリビューションを共有する

2024/11/22に公開

結論

  • wsl --import-in-placeを使用する
  • vhdxファイルのアクセス許可を設定する

経緯

Windowsアカウント 運用 コーディング WSL2
アカウントA メインで使用 メインで使用 メインで使用
アカウントB 特定用途で使用 たまに使用 たまに使用

同一PC内で上記のようなアカウント運用を行っていた。
アカウントBでの作業中にちょこちょこ待ち時間が発生するのでコーディングしたくなり...
やるならアカウントAでやっているコーディングの続きがしたい...となった。
環境コピーも考えたが、当然差分ができる上に容量も食うのでなんとか環境を共有できる方向で思案。

手順

  1. 【アカウントA】 対象ディストリビューションのexport
  2. 【アカウントA】 別名・別格納場所でimport
  3. 【アカウントB】 import-in-place
  4. 【アカウントB】 vhdxファイルのアクセス許可
  5. 【どちらでも】 ログインユーザー調整
  6. 【両アカウント】 調整&お掃除

【アカウントA】 対象ディストリビューションのexport

既定のvhdxファイル格納場所(C:\Users\***\AppData\Local\Packages\CanonicalGroupLimited.***\LocalState\ext4.vhdx)はアカウント固有の空間。
そのため、複数アカウントでの共有は控えたくそのまま利用は適わないので一旦使用している環境を出力する。

# 利用しているディストリビューションをシャットダウン
wsl --shutdown

# ディストリビューションの確認
wsl -l

# 対象ディストリビューションを出力
wsl --export 【出力ディストリビューション】 【tar出力パス】
# 例) wsl --export Ubuntu-22.04 C:\wsl2\Ubuntu-2204.tar

【アカウントA】 別名・別格納場所でimport

出力したtarを使い、複数アカウントで共有できる場所をvhdxファイルパスとして指定することで別環境として作り直し。
これで指定したvhdxファイルパスにvhdxファイルが生成される。

# tarをimport
wsl --import 【作成するディストリビューション名】 【vhdxファイルパス】 【tarのパス】
# 例) wsl --import Ubuntu-22.04-dev C:\wsl2\wsl2-vhdx C:\wsl2\Ubuntu-2204.tar

【アカウントB】 import-in-place

前手順で生成されたvhdxファイルパスを指定してディストリビューションの情報を登録。

# 利用しているディストリビューションをシャットダウン
wsl --shutdown

# ディストリビューションの確認
wsl -l

# アカウントAと同じvhdxファイルパスでimport
wsl --import-in-place 【作成するディストリビューション名】 【vhdxファイルパス】
# 例) wsl --import-in-place Ubuntu-22.04-dev C:\wsl2\wsl2-vhdx\ext4.vhdx

【アカウントB】 vhdxファイルのアクセス許可

ディストリビューションの登録はされたが、ログインを試みるとアクセスエラーでログインできないためWindows側のアクセス許可を調整

ディスク ''をWSL2にアタッチできませんでした:アクセスが拒否されました。 
エラーコード:Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIED
  1. 【vhdxファイルパス】/ext4.vhdxを右クリック
  2. プロパティ → 「セキュリティ」タブ → 詳細設定 → 「アクセス許可」タブ → 「アクセス許可エントリ」タブ内の追加
  3. プリンシパルの選択 → 詳細設定 → 検索 → 「検索結果」からアカウントBを選択 → OK → OK → 「フル コントロール」をチェック → OK → OK

【どちらでも】 ログインユーザー調整

wsl --importを行うとrootユーザーログインになってしまうので、使用するユーザーでログインできるようにディストリビューション内で調整。

# ディストリビューション内にてログインユーザー指定を追記
sudo vi /etc/wsl.conf
/etc/wsl.conf
[user]
default=【使用したいユーザー名】

【両アカウント】 調整&お掃除

# 既定ディストリビューションの調整
wsl --set-default 【作成したディストリビューション】

# 既存ディストリビューションの削除(任意)
wsl --unregister 【既存ディストリビューション】

まとめ

vhdxファイルの格納パスを調整してwsl --import-in-placeすることで複数アカウントでの同一のディストリビューション共有は可能。

アカウントBでwsl --importしてしまうとエラーになってしまう。

指定されたインストール場所は既に使用されています。
エラー コード: Wsl/Service/RegisterDistro/ERROR_FILE_EXISTS

推測だが、importはvhdxファイル生成およびwsl2にディストリビューションの登録を行う挙動になっていて、すでにvhdxファイルがある場合を許容していないのかと。
import-in-placeでは、すでにあるvhdxファイルを参照してディストリビューションの登録のみを行っているように思える。

参考

Error code: Wsl/Service/CreateInstance/MountVhd/HCS/E_ACCESSDENIEDntVhd/HCS/E_ACCESSDENIED - Microsoft Q&A
https://learn.microsoft.com/en-us/answers/questions/1697336/error-code-wsl-service-createinstance-mountvhd-hcs

E_ACCESSDENIED after wsl --update · Issue #9362 · microsoft/WSL
https://github.com/microsoft/WSL/issues/9362#issuecomment-1998349005

WSL の基本的なコマンド | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#import-a-distribution
https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#import-a-distribution-in-place

Discussion