Azure VM+トラステッド起動+WSL2はv5を使おう

こんにちは。

タイトルが全てなのですが、ちょっとハマっていました。

やりたいことは

**「Azure VMでWindows11を立ち上げて、Dockerを使う。つまりWSL2を有効化する」**

これだけでした。


しかしなかなかうまくいかず、タイトルの結論に辿り着きました。

## 事前に認識していた前提条件

Azure VM（というかWindows仮想マシン）上でWSL2をインストールする場合、仮想マシンが「**Nested Virtualization（入れ子になった仮想化）をサポートしている必要がある」** という認識はありました。

Nested VirtualizationがサポートされているAzure VMサイズは以下で確認することができます。

https://learn.microsoft.com/en-us/azure/virtual-machines/acu


>***Hyper-threaded and capable of running nested virtualization

の記載のとおり、表中で「***」が付いたマシンサイズがNested Virtualizationをサポートしています。

## WSL2インストールまでの手順

サクッと**D2s_v3**のマシンサイズでWindows11を立ち上げました。

もちろんNested Virtualizationもサポートされています。

![スクリーンショット 2023-10-20 22.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/3ff3be3d-6def-1be3-8fc7-5c00d5aa7c0c.png)

「Windows機能の有効化と無効化」から以下の設定を有効化して再起動します。

- 仮想マシンプラットフォーム
- Windows Subsystem for Linux

![スクリーンショット 2023-10-20 22.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/123162cc-3d0c-7277-1e20-ad44fed5f124.png)

## 直面したエラー

再起動後にWSL2をインストール、起動してみるとこんなエラーが出ました。
![スクリーンショット 2023-10-20 22.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/fea2c2f9-7484-61a5-2917-8171455d62d5.png)

>WSL2 is not supported with your current machine configuration.
Please enable the "Virtual Machine Platform" optional component and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/enablevirtualization
Error code: Wsl/Service/CreateInstance/CreateVm/0x80370102
Press any key to continue...

むむむ…

とりあえずエラーメッセージのリンク先を確認するも「Hyper-Vのホスト側でNested Virtualizationを有効にする」という内容で役に立たず。
&nbsp;

次にエラーコード**0x80370102**とAzure VMを組み合わせてGoogle検索してみますが、

**「HAHA!仮想マシンサイズがNested Virtualizationをサポートしているか確認してみなYo!」**

と言う回答がほとんど。

そんな中、以下のQAを発見しました。

https://learn.microsoft.com/en-us/answers/questions/1150896/wsl2-issue-on-windows-11-azure-virtual-machine

自己解決しているようで、そのコメントが

>I did forget to mention that vTPM and Secure Boot were enabled on the VM during deployment, and it seems that this was the root cause that prohibiting WSL2 to operate as expected. Deployed a VM using exactly the same type and Windows image, but with Trusted Launch disabled and WSL2 was found to be working with no problems.

というもの。**トラステッド起動を無効化したら動いたらしい。**

確かに私も「とにかくセキュアにしとこ！」ぐらいの感覚でトラステッド起動を有効化していました。



## トラステッド起動って何だっけ？
ChatGPTに聞いてみました。

>Azureでホストされる仮想マシンがセキュアに起動されるプロセスを提供します。トラステッド起動は、VMの起動プロセス中にセキュリティを強化し、不正なソフトウェアやマルウェアがシステムに侵入するのを防ぎます。これは、ハードウェアレベルでのセキュリティを利用して、コンピュータが信頼された状態で起動されることを保証するものです。

です。


## トラステッド起動を無効化して再度確認

ということでとりあえず先ほど作成したD2s_v3のマシンでトラステッド起動を無効化して起動します。

![スクリーンショット 2023-10-20 23.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/af8efb57-26ba-eea8-39eb-cbbdbe0765ed.png)

お、エラーは出ません。このままUbuntuをインストールします。

![スクリーンショット 2023-10-20 23.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/37464335-0e30-6744-c5f3-bd32042e6bb4.png)


う、動いた！！

![スクリーンショット 2023-10-20 23.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/ffa9cdb9-b4ea-2270-374b-56bdfbe35b99.png)



## えぇ！トラステッド起動はNested Virtualizationがサポートされないのかい！？

それにしてもそんなことどこにも書いてないじゃないか!!と思いながらトラステッド起動のドキュメントを眺めていると……

https://learn.microsoft.com/ja-jp/azure/virtual-machines/trusted-launch

![スクリーンショット 2023-10-20 23.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/32341a27-d04a-61c3-9409-ee7650fd82e6.png)

**書いてあるじゃん。**

## 結論：v5なら動く

ということで上記のドキュメントを見ると分かるとおり、**トラステッド起動を設定した場合、v5サイズファミリーであればNested Virtualizationは使える**ようです。

改めてマシンサイズを**D2ads_v5**に変更して、かつトラステッド起動を有効（ついでにセキュアブートとvTPMも有効）にして試してみます。

![スクリーンショット 2023-10-20 23.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/44c9aa44-d49d-e896-8172-e89da56b8bf6.png)

![スクリーンショット 2023-10-20 23.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/b0175e32-df74-f4f7-b6c8-d0af4f16a389.png)

動きましたね（ニッコリ）

![スクリーンショット 2023-10-20 23.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183744/2c359136-ad82-83d3-3067-305c10cc0f3a.png)