(仮想化の仮想化)Windows11にHyper-V経由でWindows11+WSL2をインストールしてElixir, Phoenixの開発環境を量産する

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はWindows11に対してHyper-Vを用いたElixir開発環境を量産する方法をまとめます。

# 目的
ElixirのElixir, Phoenixを量産したい。
（環境構築の練習がしたい。かつ、万が一何かやらかしてもOSごと壊せばいいやという環境を作りたい(;^ω^)）

## 実行環境
Windows 11(以降ホストOSはHyper-Vを使える前提で進めます)


## 目標
こちらの記事に沿って、VM内にElixirの開発環境を構築したい。
ホストOS上のVMの中にさらにWSL2(Ubuntu)をインストールするという、「仮想化の仮想化（仮想化の入れ子）」の環境でElixir, Phoenixの環境構築を行いました。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2




# ホストOS上でやること
## Windows11をVMとして作成
今回は下記の評価版を使用しました。
![スクリーンショット 2023-12-31 100646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/b195eeaa-0c38-ffa2-311b-ba394e9b55aa.png)

## VMの仮想化を有効化
ホストOSのPowerShellを管理者権限で起動します。

VMの一覧を取得します。
```powershell:ホストOSのpowershell
Get-VM

Name                State   CPUUsage(%) MemoryAssigned(M) Uptime           Status     Version
----                -----   ----------- ----------------- ------           ------     -------
ubuntu22.04         Off     0           0                 00:00:00         正常稼働中 11.0
Windows 11 開発環境 Running 0           3178              00:10:47.7350000 正常稼働中 11.0
```


VMの仮想化を有効化します。[^0]
```powershell:ホストOSのpowershell
Set-VMProcessor -VMName "Windows 11 開発環境" -ExposeVirtualizationExtensions $true
```

# VM上でやること

## （Windowsのみ）WSL2のインストール前（要再起動）

VMのPowerShellを管理者権限で起動し下記実施します。
```powershell:VMのpowershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

## （Windowsのみ）WSL2とUbuntu 20.04のインストール
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#windows%E3%81%AE%E3%81%BFwsl2%E3%81%A8ubuntu-2004%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージはこの画面が出たらインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/dc0c0198-ed8f-41ff-02bd-ee49016ddd45.png)

Ubuntu 20.04 LTS起動直後の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/27174347-6777-d1c7-5d07-4572292cacb1.png)


※VMの仮想化を有効化が完了していないとWSL2を使おうとした際下記のエラーメッセージが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/25bdab22-4c15-8093-09cb-fda7eefd4c63.png)

### (余談)VM上でWSL2起動時にUbuntu20.04がデフォルトで起動する設定
本Windows11(評価版)には最初からUbuntuがインストールされていましたが今回は使いません。
WSL2起動時に新たにインストールしたUbuntu-20.04が起動してほしいので、下記で設定を変更します。

```powershell:VMのpowershell
wsl --list

Windows Subsystem for Linux Distributions:
Ubuntu (Default)
Ubuntu-20.04
```

```powershell:VMのpowershell
wsl --set-default Ubuntu-20.04
```


デフォルトで起動するOSが上記でインストールしたUbuntu-20.04に切り替わりました！
```powershell:VMのpowershell
wsl --list

Windows Subsystem for Linux Distributions:
Ubuntu-20.04 (Default)
Ubuntu
```

WSL上のUbuntu20.04にaliceというユーザー名を作っていたのでそちらでログインしたことが確認できます。
```powershell:VMのpowershell
wsl

alice@WinDev2311Eval:/mnt/c/Users/User$
```

# VMのWSL2上でやること
## ElixirとPhoenixのインストール
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#elixir%E3%81%A8phoenix%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

## (補足)下記エラーが発生したときの対処
```
mix archive.install hex phx_new
```
を実行時に下記エラーが発生する場合
```
** (UndefinedFunctionError) function :crypto.strong_rand_bytes/1 is undefined (module :crypto is not available)
```
Elixir、Erlangのバージョンを最新のものにしてみましょう

## PostgreSQL（DB）のインストール
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#postgresqldb%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

## DB付きPhoenix PJを動かす
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#db%E4%BB%98%E3%81%8Dphoenix-pj%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99

VM内のWSL2配下にて、mix phx.serverで起動できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/34f831c2-4e7d-5e90-0566-05dd7c5997e8.png)

## Elixirを最新版（2023年9月現在は1.15.5）に上げる
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#elixir%E3%82%92%E6%9C%80%E6%96%B0%E7%89%882023%E5%B9%B49%E6%9C%88%E7%8F%BE%E5%9C%A8%E3%81%AF1155%E3%81%AB%E4%B8%8A%E3%81%92%E3%82%8B

## Phoenixを最新版に上げる
元記事様の手順通りです。

https://qiita.com/piacerex/items/01e89435af0f7a454ad2#phoenix%E3%82%92%E6%9C%80%E6%96%B0%E7%89%88%E3%81%AB%E4%B8%8A%E3%81%92%E3%82%8B

VM内のWSL2配下にて、Phoenix1.7が起動できました(^▽^)/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/294bfc55-a094-f512-a6a1-002011870613.png)




# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian


[^0]: 仮想マシンで WSL 2 を実行できますか?
https://learn.microsoft.com/ja-jp/windows/wsl/faq#can-i-run-wsl-2-in-a-virtual-machine-


[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！