Ryzenで仮想化がうまくいかない！：WSL2とAndroidエミュレーターを共存させたかった話

使わなくなったゲーミングPCがあったので、GPUなどを刷新して、モバイルアプリと生成AIの開発マシンにしようと思い立って作業にとりかったものの、思いのほか酷くハマったのでメモ残すことにした。
具体的には、Ryzen搭載のPCで、WSL2とAndroidエミュレーターをセットアップして、開発環境を構築しようとした流れ。

# 環境
・AMD Ryzen 5 3500 6-Core Processor搭載
・Windows11 Home（→途中からProにアップグレード）

# 結論
:::note info
* BIOS設定を変更する
　* SVMmode：enabled
　* PSS：Disabled
* Windowsで下記3つを無効化する
　1. Hyper-V Hypervisor 
　2. Device Guard
　3. Credential Guard
* さらにVirtualization-Based セキュリティを無効化する
* 念のためhypervisorが自動起動しないようにPowerShellでOFFにする
* デバイスマネージャーで「Microsoft hyper-v 仮想化インフラストラクチャドライバー」インストール
  * [デバイス マネージャー] - [アクション] -> [レガシー ハードウェアの追加] -[リストからハードウェアマニュアルを選択] - [システムデバイス] - [Microsoft] - [microsoft hyper-v 仮想化インフラストラクチャドライバー]
:::

# SVMmodeを有効にするためのWindows青画面との闘い

Android StudioのDevice Managerで、
[SDK Manager] - [SDK Tools] - Android Emulator hypervisor driver (installer)はinstalledになっていたが、
Create Deviceしようとするとエミュレーターが無いとエラーになった

エミュレーターをインストールしようとすると下記エラー
```
Android SDK is up to date.
Running Android Emulator Hypervisor Driver installer
[SC] ControlService FAILED 1062:

そのサービスを開始できませんでした。

[SC] DeleteService SUCCESS
[SC] StartService はエラー 4294967201 により失敗しました。
Done
```

AMDでは、BIOSでSVMmodeをenabledに設定する必要があるということで、PC再起動しenabledに設定したところ、PC起動時に青画面になり、起動しなくなった。
再現性があり、SVMmodeをDisabledにすると起動でき、セーフモードではSVMmodeがenabledでも起動できたため、何らかの設定かソフトが影響していると思い、情報を集めた。（1度目の大ハマり。ここで週末を数日費やした…）
```
停止コード: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED
失敗した内容: ACPI.sys
```

様々な記事やリファレンスを参照したが効果的な方法はない
* そもそもACPI.sysはドライバー削除できない。ドライバーアップデートも最新になっている
* BIOSも最新になっている
* Windowsも最新になっている

何を試しても状況変わらずで時間だけが過ぎていった。

ふと見た記事で似たような問題に直面していて、PSSをDesabledにしたら改善したとある。biometric passthroughで問題が起きることが稀にあるとか。

:::note info
[The Mysterious SYSTEM_THREAD_EXCEPTION_NOT_HANDLED and Hyper-V](https://stillu.cc/misc/2020/11/16/mystery-bsod-system-thread-exception-not-handled-amd/ "The Mysterious SYSTEM_THREAD_EXCEPTION_NOT_HANDLED and Hyper-V")
:::

試したところ、これがビンゴだったらしく問題なく起動するようになった。

タスクマネージャーのCPU欄で仮想化が初めて「有効」になったことが確認できた。

# 仮想化との闘い
しかしAndroid StudioのDevice Managerでは引き続きエミュレーターのインストールには失敗する。
試しに、先にWSLをインストールしようとすると、
```
> wsl --install
```
は正常に終了して、デフォルトのディストリビューションであるUbuntuもインストールされているのに、wslを起動しようとすると、ディストリビューションを認識できない。（2度目の大ハマり。徹夜で週末丸二日を要した…）

```
> wsl
Linux 用 Windows サブシステムにディストリビューションがインストールされていません。

'wsl.exe --list --online' を使用して利用可能なディストリビューションを一覧表示し、'wsl.exe --install <Distro>' を使用してインストールします。

また、Microsoft Store にアクセスしてディストリビューションをインストールすることもできます:
https://aka.ms/wslstore
Error code: Wsl/Service/CreateInstance/GetDefaultDistro/WSL_E_DEFAULT_DISTRO_NOT_FOUND
```

いろいろ試す中で、まとめると以下のような状況になった。

:::note info
* 環境面
  * Windows11：最新にアップデート済み
  * BIOS：最新にアップデート済み。
  * SVMmode：enabled
* 状況
  * Linux用Windowsサブシステム：ON
  * Windowsハイパーバイザープラとフォーム：ON
  * 仮想マシンプラットフォーム：ON
  * WSL --installを実行し、ディストリビューションのインストールまで正常に完了
  * WSL --install -d Ubuntu を実行すると、すでにインストールされているメッセージが出る
:::

ここにきて、仮想化まわりがやはり怪しいということで、見えない何かがHyper-Vを占有しているのか、またはSLATまわりの認識を邪魔する何かがあるのではないかと推察。確認手段はないかと調べてCoreinfoにたどり着いた。

:::note info
[Coreinfoダウンロード](https://learn.microsoft.com/ja-jp/sysinternals/downloads/coreinfo "Coreinfo v3.6")
:::

実行してみたところ、Hypervisorは起動しているが、SVMやSLATは認識していない模様。。。

```
> .\coreinfo -v

Coreinfo v3.6 - Dump information on system CPU and memory topology
Copyright (C) 2008-2022 Mark Russinovich
Sysinternals - www.sysinternals.com


Note: Coreinfo must be executed on a system without a hypervisor running for
accurate results.

AMD Ryzen 5 3500 6-Core Processor
AMD64 Family 23 Model 113 Stepping 0, AuthenticAMD
Microcode signature: 00000000
HYPERVISOR      *       Hypervisor is present
SVM             -       Supports AMD hardware-assisted virtualization
NP              -       Supports AMD nested page tables (SLAT)
```

まずHyper-Vが起動しているせいで、WSLでHyper-Vが使えないのではとすべて落としてみる事に。

:::note warn
※途中、Hyper-Vの設定まわりがWindows11 Homeだと見えないので、Pro版にアップグレードした。
:::

「Windowsの機能の有効化または無効化」で選択できるなかで、Hyper-Vを使っているものは以下のようなのですべて無効に。

* Hyper-V Hypervisor
* 仮想マシンプラットフォーム（Virtual Machine Platform）
* Windowsハイパーバイザープラットフォーム（Windows Hypervisor Platform）
* Windowsサンドボックス（Windows Sandbox）

しかし、再起動してPowerShellでsysteminfoを見てみると

```
Hyper-V の要件: ハイパーバイザーが検出されました。 Hyper-V に必要な機能は表示されません。
```

となっており、何らかのHyper-Vを検知している状態のようだ。

念のため、hypervisorが再起動時に勝手に立ち上がらないように、PowerShellで自動起動もOFFに

```
> bcdedit /set hypervisorlaunchtype off
```

しかし状況は変わらず

見えないところでHyper-Vを使っているシステムがないかと探して、この記事にたどり着いた。

:::note info
[Device Guard と Credential Guard を無効にする](https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/application-management/virtualization-apps-not-work-with-hyper-v "仮想化アプリケーションが Hyper-V、Device Guard、Credential Guard と連携しない")
:::

記事に従って下記を無効化したところ、

:::note info
* Device Guard
* Credential Guard
* さらにVirtualization-Based セキュリティを無効化
:::

systeminfoの表示は変わって、以下となり、SVMもSLATも認識していそうな気配に。

```
Hyper-V の要件: 
VMモニターモード拡張機能: はい
ファームウェアで仮想化が有効なっています: はい
第2レベルのアドレス変換: はい
データ実行防止が使用できます: はい
```

念のためcoreinfoでも確認したところ、SVMとSLATが有効になっていた

```
HYPERVISOR      -       Hypervisor is present
SVM             *       Supports AMD hardware-assisted virtualization
NP              *       Supports AMD nested page tables (SLAT)
```

ただ、この状態では仮想マシンプラットフォームが無効なためWSLでエラーに。有効にすると、SVMとSLATを認識しなくなるという堂々めぐるを繰り返した。
複数環境を起動するためにWindowsハイパーバイザープラットフォームがあるということで、こちらも有効にしたりといろいろなパターンを検証したが、まったく解決策が見えないまま時間だけがどんどん過ぎた。。

# 回避策は突然に…
いよいよ駄目かと思ったところ以下の記事を発見し、ダメモトで試したところ。。。

:::note info
[WSL2 not starting despite Hyper-V and virtualization being enabled #4930](https://github.com/microsoft/WSL/issues/4930 "WSL2 not starting despite Hyper-V and virtualization being enabled #4930")
:::

```
Currently it seems as if there could be a side effect with microsoft hyper-v virtualization infrastructure driver.

It seems as if the problem could be solved by manually re-installing this driver.

Please try the fix below and let us know if it solved the problem.

Go to device manager -> Action -> add legacy hardware.
Choose Option "Select hardware manual from list" in the wizard
Choose "Systemdevices" in the list
Choose "Microsoft" in vendors
Choose "microsoft hyper-v virtualization infrastructure driver" in models
Follow the wizard to finish the installation
Restart the computer
```

なんと、WSLのインストールに成功！
Androidエミュレーターも無事セットアップが完了した。

記事によると、どうやら（少し前の情報だけど）、

:::note alert
「現時点ではMicrosoft hyper-v 仮想化インフラストラクチャドライバーに副作用がある可能性があるようで、このドライバーを手動で再インストールすることで問題が解決する可能性がある。」
:::

ということらしい。やれやれ、ようやくスタート地点に立てた。。
次はIntel PCにしよう

今回、無理やり動かすのに仮想化まわりいろいろといじったので、セキュリティに問題がないかは本格的に使うときに念のため確認することにしよう。