Hyper-VのNested VMを使ってkvmのLive Migration（移行）を試す。

## 概要

わざわざWindows10 Professionalライセンスを手に入れたのはVMネスト環境でKVMのライブマイグレーション（KVMでは移行と呼ぶらしい）を試してみたかったのもあります。
ということで試してみました。KVMの設定はGUIでやります。


## 環境情報

- ホストOS: Windows10 バージョン1803

- Hyper-VゲストOS: CentOS 7.6

- KVMゲストOS: CentOS 7.6


## サーバ構成

Hyper-VゲストOSはnfsサーバ１台とkvm管理サーバ２台の計３台を準備します。

- １台目　IPアドレス: 10.0.12.31　ホスト名: nfs01

- ２台目　IPアドレス: 10.0.12.21　ホスト名: cent01

- ３台目　IPアドレス: 10.0.12.22　ホスト名: cent02


※nfsサーバは別途用意しなくてもcent01の/var/lib/libvirt/imagesをcent02からnfsマウントできるようにすればよいかな？などと横着しようとしてみたのですが・・
私の環境ではライブマイグレーションは出来るもののcent02に移行後のKVMゲストの挙動がおかしくなってまともに動きませんでした。
cent02で起動したKVMゲストをcent01に移行する分には動くのですが。
ちなみにその際のエラーメッセージは「blk_update_request: I/O error , dev vda, sector」とかでした。

KVMゲストOSは・・・特に何も考えず、デフォルトで１台用意しました。

※サーバ停止する際はnfs01を最後に停止するようにしてください。cent01/02からマウントしたままだと、cent01/02が停止できなくなります。
順序を誤ったとしても再度nfs01を起動すればcent01/02のシャットダウンシーケンスはnfs01起動後に正常に終了しますが。


## Hyper-Vの設定

各ゲストOSに対してPowerShellから以下コマンドを実行する必要があります。
ここいら辺は公式マニュアルにも分かりやすく書いてあります。

https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization

```PowerShell:PowerShell
>Set-VMProcessor -VMName ＜ゲストOS仮想マシン名＞ -ExposeVirtualizationExtensions $true
```


## サーバ基本設定概要

OSの基本的な設定については詳しくは触れませんが、とりあえず各サーバ以下の状態で検証しています。

- SE Linux オフ

- firewalld 停止

## ホスト名設定

kvmでの移行対象ノード指定はホスト名にする必要があるようです。IPアドレスではうまく行きませんでした。
ホスト名及び名前解決はきちんと設定しましょう。ここではhostsファイルで名前解決します。

### /etc/hostname

各サーバそれぞれに「サーバ構成」の項目の通りホスト名を指定します。

### /etc/hosts

自サーバ及び他サーバについて「サーバ構成」の項目の通り名前解決できるように設定します。
今回必要かどうかは分かりませんが、自サーバについてはループバックデバイスについても忘れずに名前解決できるようにしておきました。

```:sample
127.0.0.1   cent01 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         cent01 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.12.21 cent01
10.0.12.22 cent02
10.0.12.31 nfs01
```


## nfs01構築

基本的にnfsサーバの設定だけ実施すればOKです。

### nfsマウント用ディレクトリの確認

nfsマウントするディレクトリが存在することを確認します。
今回はkvmの仮想環境保存デフォルトディレクトリを使用します。

```shell:command
# ll -d /var/lib/libvirt/images/
```

### /etc/exportsファイル編集

以下の通り修正します。オプションについてはRHELのサポートページを参考にしています。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-kvm_live_migration-shared_storage_example_nfs_for_a_simple_migration

| パス | オプション |
|:--|:--|
| /var/lib/libvirt/images | *(rw,no_root_squash,sync) |

### nfsデーモン起動及び自動起動

```shell:command
# systemctl start nfs-server
# systemctl enable nfs-server
```


## cent01/02構築

kvm環境をインストールします。

### kvm関連パッケージのインストール

```shell:command
# yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer
```

### kvm移行で必要になるパッケージのインストール

```shell:command
# yum install openssh-askpass
```

### GUIで仮想マシンマネージャを起動して設定します。

[ファイル] > [接続を追加]
でQEMU/KVM接続を追加して双方向に環境の管理ができるようにします。

[QEMU/KVM] > [詳細]
から[ストレージ]を選択してNFS領域を追加します。
[ターゲットファイル][ソースパス]はHyper-Vデフォルトと同じ[/var/lib/libvirt/images]にしておきます。

### cent01と02が同一クローンの場合はsystem-uuidが同じなので、libvirtのuuidを設定します。

そのままだと移行時に移行元と移行先でホストマシンが同じと判断されてエラーになります。

system-uuidを確認します。

```shell:command
# dmidecode -s system-uuid
```

同一の場合はUUIDを生成してlibvirtd.confのhost_uuidに記載します。

```shell:command
# cat /proc/sys/kernel/random/uuid
# vi /etc/libvirt/libvirtd.conf

※host_uuid に生成されたUUIDを記載する。
```

## 動作確認

NFSのストレージ領域にゲストOSを作成して起動。[移行]を実行して別ノードへのライブマイグレーションを確認します。

※ゲストOSの仮想ディスク[パフォーマンスオプション][キャッシュモデル]はデフォルトから[none]に変更しておく必要があります。
これをやらないと安全な移行が出来ない旨の警告が出て、安全でない移行を許可する設定にしないと移行できません。