【KVM】EC2 ベアメタルインスタンス上へのKVM仮想マシン構築

##目標
EC2 ベアメタルインスタンス（インスタンスタイプ`i3.metal`を利用）上にKVM仮想マシンを構築する。

##前提
EC2 ベアメタルインスタンス（Red Hat Enterprise Linux 8 (HVM), SSD Volume Type、インスタンスタイプ`i3.metal`）が構築済みであること（※）

※かなり料金高いようなので注意してください

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [前提確認](#1前提確認) |
| 2 | [仮想マシン構築前準備](#2仮想マシン構築前準備)|
| 3 | [仮想マシン構築](#3仮想マシン構築)|

##手順
###1.前提確認
前提のEC2インスタンスなら問題ないという認識ですが、一応KVM導入前の前提を確認します。

**①CPU仮想化支援機能への対応確認**
/proc/cpuinfoのflags行を確認し、CPUがCPU仮想化支援機能に対応しているかどうかを確認します（※）。

※「flags」行にIntel VT対応なら`vmx`、AMD-V対応なら`svm`が表示されます。

```bash
# 検索がヒットすればOK
grep -E "(vmx|svm)" /proc/cpuinfo
```

**②カーネルモジュールのロード確認**

```
lsmod | grep kvm
```

以下のように、CPU仮想化支援機能を利用するためのモジュール`kvm-intel.ko`及び、KVMのコア機能を提供する`kvm.ko`がロードされていればOKです。

```
[root@ip-172-31-40-16 ~]# lsmod | grep kvm
kvm_intel             303104  0
kvm                   798720  1 kvm_intel
irqbypass              16384  1 kvm
```

###2.仮想マシン構築前準備
**①必要ツールのインストール**

```
yum install qemu-kvm qemu-img libvirt virt-install
```

**②libvirtdデーモンの起動**
KVMではlibvirtという仮想環境管理ツールを利用したセットアップが基本となります。
libvirtを利用するためにはlibvirtdデーモンを起動する必要があります。

```
systemctl start libvirtd
systemctl enable libvirtd
```

**③仮想ディスクイメージの作成**
仮想マシンに割り当てる仮想ディスクイメージを`qemu-img`コマンドで作成します。
今回は仮想マシンに約5Gの領域を割り当てるためのイメージ/tmp/vm1.imgを作成します。

```
qemu-img create -f qcow2 /tmp/vm1.img 5G
```

**④isoイメージファイルのインストール**
CentOS7のisoイメージファイルを今回の仮想マシンのOSとして利用するためインストールします。

まずはイントール先ディレクトリに移動し、wgetコマンドをインストールします。

```
cd /usr/local/src/
yum install wget
```

isoイメージファイルをインストールします。

```
wget http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
```

###3.仮想マシン構築
先ほどインストールした`virt-install`コマンドを利用して実際に仮想マシンを構築（※）します。

※詳細な定義内容は以下
仮想マシン名：　vm1
メモリサイズ：　1024MB
利用する仮想ディスクイメージ：　/tmp/vm1.img
仮想CPU数：　2
仮想ブリッジ名：　virbr0
利用する仮想マシンイメージ：　/usr/local/src/CentOS-7-x86_64-Minimal-2009.iso

またGUI環境を利用しないインストールのため、--graphics noneオプションと--extra-args='console=tty0 console=ttyS0,115200n8'を指定しています。
 --extra-argsオプションはKernelに渡すオプションを指定するもので、この値を渡すことでゲストOSのシリアルコンソールが有効化されるようです（[DigitalOceanでKVMを触ってみる](https://www.rhoboro.com/2016/08/09/kvm-on-digitalocean-1.html)より）。

```
sudo virt-install \
--name vm1 \
--ram 1024 \
--disk path=/tmp/vm1.img \
--vcpus 2 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--location=/usr/local/src/CentOS-7-x86_64-Minimal-2009.iso \
--arch x86_64 \
--extra-args 'console=ttyS0,115200n8 serial'
```

処理が進むと以下のような仮想マシンのセットアップコンソールとなります。
`!`マークがついておらず、セットアップが実施されていないTime settings、Installation Destination、
Root passwordあたりをコンソールでセットアップしました（手順省略致します）

```
 1) [x] Language settings                 2) [!] Time settings
        (English (United States))                (Timezone is not set.)
 3) [!] Installation source               4) [!] Software selection
        (Processing...)                          (Processing...)
 5) [!] Installation Destination          6) [x] Kdump
        (No disks selected)                      (Kdump is enabled)
 7) [ ] Network configuration             8) [!] Root password
        (Not connected)                          (Password is not set.)
 9) [!] User creation
        (No user will be created)
```

以下のようになった状態で仮想マシン構築処理続行

```

 1) [x] Language settings                 2) [x] Time settings
        (English (United States))                (Asia/Tokyo timezone)
 3) [x] Installation source               4) [x] Software selection
        (Local media)                            (Minimal Install)
 5) [x] Installation Destination          6) [x] Kdump
        (Automatic partitioning                  (Kdump is enabled)
        selected)                         8) [x] Root password
 7) [ ] Network configuration                    (Password is set.)
        (Not connected)
 9) [ ] User creation
        (No user will be created)
  Please make your choice from above ['q' to quit | 'b' to begin installation |
  'r' to refresh]: b
```

最終的に仮想マシンが構築されログイン処理に移行される想定です。
ユーザはrootで、上記セットアップコンソールで設定したパスワードを入力します。
仮想マシンにログイン出来ればOKです（ログイン後は`ctrl `と`]`を同時押しすることで、仮想マシンからホストOSへ操作戻ることが可能です）。

```
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64

localhost login: root
Password:
[root@localhost ~]#
```

ホストOSから`virsh list`コマンドを利用して仮想マシン一覧を確認

```
[root@ip-172-31-36-246 src]# virsh list
 Id   Name   State
----------------------
 2    vm1    running
```

`virsh dominfo`コマンドで仮想マシンの詳細を確認可能

```
virsh dominfo vm1
Id:             2
Name:           vm1
UUID:           082fec70-89a6-43ba-973b-94b83dae394c
OS Type:        hvm
State:          running
CPU(s):         2
CPU time:       14.6s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
Security label: system_u:system_r:svirt_t:s0:c268,c305 (enforcing)
```

`virsh console`コマンドで仮想マシンに再ログイン可能なことも確認しておきます。

```
[root@ip-172-31-36-246 src]# virsh console vm1
Connected to domain vm1
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64

localhost login: root
Password:
Last login: Thu Jan 21 11:41:39 on ttyS0
[root@localhost ~]# 
```