Hyper-V上でLinuxを動かす

# Hyper-V上でLinuxを動かす

WSL2やDocker for Windowsを利用する場合、Hyper-Vを有効化する必要があります。
この場合、VirtualBoxを同時に利用することはできません。
WSL2やDockerでは、GUIがないため、Linux独自のGUIアプリであったり、画像・映像等に関わるものを気軽に試すことができません。(Westonとかも触ってみたいし)
そこで、Hyper-Vを使って、Linux仮想マシンを作成してみることにしました。

Hyper-Vでは自分で好きなディストリビューションを使用することができますが、デフォルトでは解像度が固定とかなり不便です。
linux-vm-toolsというMicrosoft製のツールを使用することで、解像度を変更することができます。
ですが、残念ながらこのツールは公式でリリースされているUbuntuでないとうまく動作しないようです。
> Lubuntu18.04で試しましたが、うまく動作しませんでした。

ですので、今回使用するディストリビューションはUbuntu18.04とします。

## Hyper-Vクイック作成

> 以下の手順を実行する前に、Hyper-Vを有効化する必要があります。
> Hyper-V有効化の方法はここでは扱いません。

スタートメニューから[Windows管理ツール] > [Hyper-Vクイック作成]でHyper-V クイック作成を起動します。

Hyper-Vの管理ツールはHyper-V マネージャーなのですが、そこから仮想マシン作成だけ切り出したのがHyper-Vクイック作成のようです。

選択後、左側のオペレーションシステムの選択からUbunutu18.04.2 LTSを選択します。
その他のオプションを選択し、名前を適宜変更します。

![Hyper-V_Ubuntu18.04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210251/31b656e6-591e-5ee6-a138-086081484ad8.png)


上記実行後、[仮想マシンの作成]を実行します。

仮想マシンの作成が完了したら、[接続]の前に、[設定の編集]を行います。

設定では、仮想マシンにデフォルトで割り当てるメモリ量(動的メモリを有効にしておけば、RAMのサイズは勝手に伸縮するようです)や仮想ハードディスク、チェックポイント(差分バックアップ)の保存場所の指定等が可能です。

> チェックポイントは便利ですが、後から仮想ハードディスクの容量を変更することが出来なくなる(チェックポイントをリセットすれば一応可能ではある)ので、注意が必要です。

設定が完了したら、[接続]を実行し、起動します。
起動後はインストールするディストリビューションに合わせてインストールの手順を実行します。

> Hyper-Vというロゴが表示される場合、インストールメディアがうまく刺さっていない場合があります。
> [メディア]メニューからDVDドライブを選択し、インストールに使う、isoファイル等を指定してから、再度起動する必要があります。

## linux-vm-toolsのインストール

Hyper-V上のLinuxはインストール直後は解像度が固定だったり、不便な面が多いです。
これはMicrosoftがリリースしている、linux-vm-toolsをインストールすることで改善が可能です。

上記のUbuntu18.04.2 LTSをインストールしている場合はデフォルトでインストールされているため、以下の手順は不要です。


- Ubuntu18.04相当の場合

> 自動ログイン機能は無効化しておく必要があります

```sh
$ wget https://raw.githubusercontent.com/Microsoft/linux-vm-tools/master/ubuntu/18.04/install.sh
$ sudo chmod +x install.sh
$ sudo ./install.sh
```

仮想マシンのシャットダウン後、Windows Power shellを管理者権限で実行し、以下のコマンドを実行します。

```sh
Set-VM -VMName <VMの名前> -EnhancedSessionTransportType HvSocket
```

実行後、仮想マシンを起動すると、画面解像度を聞かれるので、好きな解像度に変更可能です。
解像度を変更すると見慣れないログイン画面が現れますが、そのままLinuxのユーザーアカウントでログインします。

## 性能向上のための手順

### I/Oスケジューラを変更

I/Oスケジューラをnoopに変更するために、以下のファイルを編集。

- /etc/default/grub

```patch
- GRUB_CMDLINE_LINUX=""
+ GRUB_CMDLINU_LINUX="elevator=noop"
```

Grub設定をアップデート

```sh
$ sudo update-grub
```

### GRUBタイムアウト値を変更

- /etc/default/grub

```patch
- GRUB_TIMEOUT=0
+ GRUB_TIMEOUT=5
```

Grub設定をアップデート

```sh
$ sudo update-grub
```

### mountオプションを変更

- /etc/fstab

```patch
- LABEL=desktop-rootfs / ext4 errors=remount-ro 0 1
+ LABEL=desktop-rootfs / ext4 errors=remount-ro,noatime 0 1
```

## 仮想ハードディスク拡張

### チェックポイントを使用している場合

- チェックポイントを無効化する: 仮想マシンの設定画面のチェックポイントから無効化

- チェックポイントを削除する: Hyper-Vマネージャで仮想マシンを選択するとチェックポイントツリーが見えるので親ノードを削除(これでチェックポイントが統合される)

- Hyper-Vの設定でチェックボックスをリセットする

- 仮想マシンの設定画面もしくはHyper-Vマネージャからディスクを編集してディスクを拡張する

- Ubuntu上でパーティションを拡張する

```sh
$ sudo parted
(parted) resizepart 1
Warning: Partition /dev/sda1 is being used. Are you sure you want to continue?
Yes/No? Yes                                                               
End?  [11.8GB]? 100% 
(parted) quit
``` 

- Ubuntu上でファイルシステムを拡張する

```sh
$ sudo resize2fs /dev/sda1
```

- Ubuntu上でパーティションにラベルを付ける

```sh
$ sudo e2label /dev/sdb1 WORK
$ sudo e2label /dev/sdb1
WORK
```

- Ubuntu上で/etc/fstabを編集

```sh
LABEL=WORK      /home/<you>/work        ext4    errors=remount-ro,noatime,discard, 0    2
```

- マウント

```sh
$ sudo mount /dev/sdb1 ~/work
```

---

Hyper-Vで動かすLinuxは悪くはないのですが、VirtualBoxの方が単純に便利だと感じます。