デュアルブートしているOSを同時に起動したい

# はじめに
この記事はデュアルブートでLinux + Windowsのような運用をしていて, 同じSSD/HDD上に複数のOSが入っている環境上でやったことを備忘録的に記録したものである.
また, 実パーティションを直接触るため, 記事の内容を試す際はすべて自己責任とし、細心の注意を払って行うこと.

# 環境
## ハードウェア
- NVMe SSD 512GB x2
- CPU i7-10700K
- RAM 32GB
- Quadro M4000
- UEFI BOOT(レガシーな起動順序の場合は未検証)
 
Windows boot ManagerがESPの中に入っている.

nvme0n1

| nvme0n1p1 |nvme0n1p2 | nvme0n1p3 | nvme0n1p4 |
|:-:|:-:|:-:|:-:|
|  ESP(/boot/efi) |  /boot | /  | (Ubuntu) / |

nvme1n1

| nvme1n1p1 |nvme1n1p2 |
|:-:|:-:|
|  C:\\ |  D:\ |

## ソフトウェア

- Arch Linux (著者環境5.13.13-arch1-1)
- Oracle VirtualBox (6.1.26)

# VMの作成と起動
## すること
 - 現在のユーザーを `disk` `audio` `vboxusers`に追加する
 - `vboxmanage`コマンドで仮想ディスクファイルを作る
 - VMを作成する
 - VMの設定をいじる


## 手順0 ディスク内のOSの確認とVirtualBoxのインストール
```zsh
sudo pacman -S virtualbox gparted
```

でVirtualboxとgparted(パーティション管理ツール)を導入し, gpartedでパーティションテーブルの確認をしておく.

## 手順1 ユーザーの追加

```bash
sudo gpasswd -a $USER disk
sudo gpasswd -a $USER audio
sudo gpasswd -a $USER vboxusers
```

これで`disk` `audio` `vboxusers`グループに自分を追加する. 
(`$USER`で現在のユーザが追加される.`gpasswd -a kasagon disk`のように特定のユーザを追加することもできる)

## 手順2 仮想ディスクファイルの作成

適当なディレクトリを作り,(e.g. `$HOME/VM_Dir` )その中で作成すると探すのが楽

```zsh
vboxmanage internalcommands createrawvmdk -filename nvme0n1.vmdk -rawdisk /dev/nvme0n1 
vboxmanage internalcommands createrawvmdk -filename nvme1n1.vmdk -rawdisk /dev/nvme1n1 
```

これでVMDKファイルが作成される.

## 手順3 VMの作成
Oracle VM VirtualBox Managerを起動し, 新規作成でウィザードを起動する.
Expert Modeをクリック(またはAlt + E)で詳細設定に移動する.
![Screenshot from 2021-09-06 12-05-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/1b582cb9-11cc-8d19-2815-3bd42a058504.png)
起動するOSの種類, バージョンを環境に合わせて設定し, 割り当てるRAM容量を決める.
*Hard Disk*の項目は, `Use an existng virtual hard disk file`を選択する.

右側のファイルアイコンから Hard Disk Selectorを呼び, Addから先程作成したvmdkファイルを選択する. 複数ある場合は後で設定する.
![Screenshot from 2021-09-06 12-12-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/4d1e342b-22c1-8ef6-a23a-0df361de93d6.png)

ファイルを選び, CreateでVMを作成する.

## 手順4 VMの設定
作成したVMを選び, Settingsから設定を行う.
まず, Systemの項目内にある, 「`Enable EFI(special OSes only)`」にチェックを入れ, EFIを有効にする(EFIブートの場合.)

![Screenshot from 2021-09-06 12-18-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/f2877c6f-be6e-cfa2-2124-081564669c50.png)

Prosessor, Accelerationの項目も適宜設定する.

次に, Storageを設定する. Linuxをゲストにする場合はコントローラがSATAやAHCIでも起動することが確認できたが,Windows10の場合はNVMeにする必要がある.
![Screenshot from 2021-09-06 12-20-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/8474b94d-0c86-2e33-249d-c36d744deec0.png)

また, 複数のディスクを起動に必要とする場合や, 外付けドライブが必要な場合はここで仮想ディスクファイルを追加する.

### NVMeに設定して起動すると拡張機能を要求される場合

拡張機能をDLして導入する.
https://www.virtualbox.org/wiki/Downloads
リンク先の![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/005611e6-dfbe-76cd-db6e-c514088329bb.png)

のAll supported platformsで拡張機能のファイルがダウンロードできるので, Virtualbox Managerの File>Preferences(またはCtrl + G)でPreferencesを開き,
Extensions(拡張機能)>Adds New PackageでDLしたファイルを読み込ませる.

### Windowsがブルースクリーンになる
設定のDisplayの項目で, メモリを最大にして,
グラフィックコントローラを `VBoxSVGA`にすると多分治る(著者環境での解決策)
ゲストOSがLinuxの場合はデフォルトのVMSVGAで動いた.

起動すると, 普段の起動と同じGRUB等が表示されてブートされる.
なお, VMの設定をWindows10にして初回にgrubでWin10をブートすると,次回から何故かスキップされてWindowsが起動する.
![VirtualBox_testUbuntu_06_09_2021_12_27_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466993/696a19c7-1c9f-2098-75de-bf3d56fde55f.png)

マルチディスプレイの環境であれば, 一方のディスプレイでゲストOSをフル画面(左Ctrl + F)で使用すると快適でおすすめ.(GuestAdditionsイメージの挿入が必要かも)