ハイパーバイザKVMで外部ネットワーク接続可能なゲストOS作成手順をまとめる

# はじめに
KVMはLinuxカーネルに標準で取り込まれているハイパーバイザです。
KVMはOpenStackのデフォルトのハイパーバイザ機構として採用されており、仮想化を語る上では避けられない昔からある技術です。

# 前提
動作確認OSはCentOS7.3。

ホストOSにKVMインストール済み。
KVMがインストールされていない場合は以下を参考。
https://qiita.com/gold-kou/items/77f4ad12adde1b332b38

# VM作成手順
CentOS7上で外部ネットワーク接続可能なVMを作成する手順をまとめる。

## Step1. ホストOS側のネットワーク設定
ゲストOSが外部接続できるようにホストOSのネットワーク設定をする。
今回は物理NIC(eth0)にブリッジ(br0)を設定する手順とする。
電源再起動で設定が揮発してしまう設定方法と不揮発性の設定方法の２つがある。状況によって使い分けてください。

### 揮発性（電源再起動すると設定が消える）
#### ブリッジ設定内容確認
```
# brctl show
```

#### ブリッジ追加
```
# brctl addbr br0
```

#### ブリッジと物理NIC対応付け

```
# brctl addif br0 eth0
```

#### ブリッジ設定内容確認
```
# brctl show
```

### 不揮発性の設定（電源再起動しても設定が消えない）
#### ブリッジ設定内容確認
```
# brctl show
```

#### インターフェースコンフィグの設定
ここではブリッジのIPは固定とする。

```
# vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=<IP> #eth0に振られていたIPなどを与える。
NETMASK=<NETMASK>
TYPE="Bridge"
```
```
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
NAME="eth0"
BRIDGE="br0"
```

#### 電源再起動
```
# shutdown -r now
```

#### ブリッジ設定内容確認
```
# brctl show
```

## Step2. ISOイメージの用意
VM用のISOイメージをローカルに用意する。
必ずしもローカルに用意しなくてもいいが、何度も同じイメージでVMを立てる可能性がある場合は、その方が効率的。
用意したisoファイルは/var/isoディレクトリなどに格納する。（virt-installコマンドでpermissionエラーが発生する場合がある）
ダウンロードする場合は以下のサイトを参考に。

### RHELダウンロードサイト
https://access.redhat.com/ja/downloads

### CentOSダウンロードサイト
https://www.centos.org/download/

### Ubuntu(Desktop)ダウンロードサイト
https://www.ubuntu.com/download/desktop

## Step3. QEMUイメージ作成
qemu-imgコマンドでQEMUイメージを作成する。
ここでのQEMUイメージは腹持ちする空の仮想ハードディスクのようなもの。
今回はtestという名前のQEMUイメージを/var/lib/libvirt/images配下に50GBで作成する。サイズは後からxmlで変更可能。
実際の使用量に応じて動的にディスクは増えるため、最初から指定した容量を占有するわけではない。

```
# qemu-img create -f qcow2 /var/lib/libvirt/images/test.qcow2 50G
```

## Step4. VM作成
virt-installコマンドでVM作成する。
今回はメモリが2GB、コアが2個、ハードディスクが50GB、ゲストOSがRHEL7.3。

```
# virt-install --virt-type kvm \
--name test \
--ram 2048 \
--vcpus=2 \
--network=bridge:br0  \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--arch x86_64 \
--os-type=linux \
--virt-type kvm \
--os-variant=rhel7 \
--location=/var/iso/rhel-server-7.3-x86_64-dvd.iso \
--disk /var/lib/libvirt/images/test.qcow2,format=qcow2
```

virt-installのオプションについて
- name：VMの名前を指定する。
- ram：VMのメモリを指定する。
- vcpus：VMのコア数を指定する。
- network：VMとホストOS間の通信方法を指定する。今回は用意したブリッジを指定。
- os-type：VMのOSの種類を指定する。windows,unix,linux,otherのいずれか。
- virt-type：ハイパーバイザの種類を指定する。今回はkvm。
- location：ISOイメージのパスを指定する。URL指定も可。
- disk：用意したQEMUイメージを指定する。

## Step5. ゲストOSインストール
### 仮想マシンマネージャ（virt-viewer）から行う場合
仮想マシンマネージャを触れる環境ならば、アプリケーション > システムツール > 仮想マシンマネージャで仮想マシンマネージャを起動し、
作成したVMを選択すればOSインストール作業開始になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/879a2130-d208-9229-cde0-5c3814776a2d.png)

### リモートWindows端末から行う場合
ホストOSにGUIが入っていない、直接ホストOS端末を操作するのは難しいなどの場合、VNCクライアントソフトを利用して、network reachableなリモートWindows端末からゲストOSインストール作業を実施できる。

#### VNCポート番号確認
```
# virsh vncdisplay test
```

#### VNCクライアントソフト起動
UltraVNC ViewerなどのVNCクライアントソフトを用いてVMにアクセスする。
下図の赤枠に"ホストOSのIPアドレス:5900+確認したVNCポート番号"を入力して"Connect"を押下。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/221948/a4ba2d42-ba51-8d42-5cee-971e9850b089.png)

VMにアクセスできたら、あとはいつも通りにOSのインストール作業実施。

## Step6. VMイメージバックアップ
ゲストOSがインストール完了したタイミングやアプリケーションのインストールや設定などが完了したタイミングなどで
いったんVMイメージのバックアップをとっておくことをおすすめする。
（VMを扱うメリットの1つはバックアップをとっておくとこでやり直しが簡単になることだと思うので）
/var/lib/libvirt/images/配下にVMイメージが格納されているので、VMが起動している場合はいったん停止してから、イメージファイルをどこかにコピーしてバックアップしておく。

# virshよく使うコマンド集
## VM一覧確認
```
# virsh list --all
```

## VM起動（停止状態から）
```
# virsh start <vm>
```

## VM停止
```
# virsh shutdown <vm>
```

## VM強制停止
```
# virsh destroy <vm>
```

## VM再起動
```
# virsh reboot <vm>
```

## VM削除
```
# virsh undefine <vm>
```

## VM設定変更
virsh editコマンドでxmlファイル上でVMの設定変更（メモリ、コア数、ネットワークなど）ができる。
直接/etc/libvirt/qemu配下のxmlファイルを編集することも可能だが、virsh editコマンドはファイル保存時に
エラーチェックを行ってくれるため安全。
変更する前にVMを停止しておくのを忘れずに。

```
# virsh edit <vm>
```

## VMのCPU情報取得
```
# virsh vcpuinfo <vm>
```