Ubuntu 16.04 にKVMを導入する(CLI(CUI)環境)

##背景・概要
初投稿です。
ホストマシンにモニターが基本的についてないので、CLI環境のみでKVMを導入し仮想マシンの起動までやってみました。

雑魚なので誤表記や質問があればぜひご指摘下さい。

###注意
ホストマシンへのIPアドレスの割り当てや、SSH接続などの初期設定は完了済みであることを想定しています。
また、本稿により何かしらの損害が発生した場合の責任は負いかねますので、実際に設定する前の読了や他文献との比較を推奨します。

##構築環境
ホストマシンの詳細
###カーネル
```
ubuntu:~$ uname -a
Linux ubuntu 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
###OS
```
ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
```
###スペック
- メモリ：35GB
- CPU：2コア 2スレ Intel(R) Xeon(R) CPU E5502  @ 1.87GHz

##KVMの導入～仮想マシンの起動

#####1.仮想化拡張機能の確認
KVMの導入は、ホストマシンのCPUが仮想化拡張機能（または仮想化支援機能）を利用できることが前提条件となります。

CPUの仮想化拡張機能を利用するには、Intel VT-x/d または AMD-VをサポートしているCPUを搭載した、x86・x86_64アーキテクチャのマシンを利用している必要があるので、

次のegrepコマンドを実行して、ホストマシンのCPUに仮想化拡張機能があるか確認しましょう。

```
ubuntu:~$ egrep -c '(vmx|svm)' /proc/cpuinfo
```
出力が1以上の場合はKVMが利用できます。それ以外の場合はそもそも仮想化拡張機能が無いか、
BIOSの設定から仮想化拡張機能を有効化する必要があります。

また、2GB以上のメモリと、40GB以上のハードディスク容量の空き、1つ以上のNIC程度のスペックがあると好ましいです。


#####2. KVM導入に必要なパッケージをインストールする
KVMの導入には次のパッケージを用います。

|ソフトウェア概要  | Ubuntuパッケージ名  | 詳細 |
|---|---|---|
 QEMU | qemu | オープンソースのハードウェアエミュレータ<br>KVMがその一部の機能を利用している
 KVMのコマンドライン<br>ユーティリティ | qemu-kvm | kvmコマンドを使うためのユーティリティ
 qemu-img | qemu-utils  | 仮想ディスクイメージの作成やコンバートするコマンド<br>qemuパッケージで自動的にインストールされる
 iproute | iproute | Ubuntuのインストール時からインストール済み
 bridge-utils | bridge-utils  | 仮想ブリッジの作成に使用
 libvirt | libvirt0 , libvirt-bin | lib[rary] + virt[ualization]の略。<br>多くのハイパーバイザーや仮想化管理ソフトウェアの<br>サポートを担う仮想マシン制御ライブラリ
 virt-install | virt-install  | libvirtにより提供されるCLIで仮想マシンを作成できるコマンド


KVMの導入に必要なパッケージは先述のように複数ありますが、
パッケージの依存関係を考慮すると、次のコマンドを用いれば網羅できると思います。

```
ubuntu:~$ apt update
ubuntu:~$ apt install qemu-kvm libvirt-bin libvirt0 virt-install
```



#####3. libvirt-binをsystemdに登録する
virt-installコマンドはlibvirt-binのサービスが稼働することで利用できます。
Ubuntuの場合はlibvirt-binパッケージのインストール時にstart(起動)しているので、
enable(自動起動)にしましょう。

```
ubuntu:~$ sudo systemctl enable libvirt-bin
```



#####4. 一般ユーザをlibvirtグループに所属させる
sudo無しでvirshやvirt-installなどのlibvirt機能を実行できるようにすると設定が楽です。（非推奨）


```
ubuntu:~$ sudo gpasswd -a libvirtd "username"
```



#####5. bridgeの有効化
仮想マシンをホストマシンと同じネットワークに接続させるため、
ブリッジインターフェースbr0を作成します。下記の例は静的にIPアドレスを割り当てる場合のものです。IPアドレスは例です。

```
IPアドレスを静的に割り振る場合(例：
ubuntu:~$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
	address 192.168.11.93
	netmask 255.255.255.0
	network 192.168.11.0
	broadcast 192.168.11.255
	gateway 192.168.11.1
	dns-nameservers 192.168.11.2 192.168.11.1
	dns-search hiroom2.com
	bridge_ports ens3
	bridge_stp off
	bridge_maxwait 0
```

再起動後、上述の設定が適用されているかifconfigで確認する。

```
ubuntu:~$ sudo reboot
ubuntu:~$ ifconfig
```

#####6. .isoファイルの用意・.isoファイル用のディレクトリを作成する
.isoファイルを格納するプールディレクトリを作成します。（作成せずhomeにファイルを置いても結構です。）

```
ubuntu:~$ sudo mkdir /var/lib/libvirt/iso
```

ここに[CentOS7のダウンロードサイト](https://www.centos.org/download/)などからダウンロードした.isoファイルを格納し、libvirtdグループ内での共有を可能にします。

```
ubuntu:~$ sudo chown libvirt-qemu:libvirtd /var/lib/libvirt/iso/CentOS-7-x86_64-Minimal-1804.iso
```



#####7. virt-installコマンドで仮想マシンを作成する
virt-installコマンドは、ゲストOS用の仮想マシンの設定をコマンドラインオプションとして指定できます。順不同。主なオプションの解説を表に記します。
その他のvirt-installオプションについては[Redhatの公式ドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-virtual_machine_installation-virt-install-virt-manager-matrix)などを参考にするといいかもしれません。

| オプション引数 | 解説 |
|----------------|----------------|
| --name | 作成する仮想マシンの名前を指定する。|
| --memory  | 仮想マシンに割り当てるメモリサイズをMB単位で指定する。|
| --ram   | 同上（今回は使用してない）|
| --disk  |  仮想マシンに割り当てるストレージデバイスのパスやサイズを指定する。pathやsizeではpath=[新規作成するデバイスファイル(.imgなど)のパス及びファイル名]size=[そのサイズ(GB単位)]が指定できる。|
| --cdrom | OSインストールメディア(.isoファイルなど)を指定する。|
| --connect | 接続先のハイパーバイザを指定する。root権限でKVMを使用するときに[qemu://system]を指定する。|
| --graphics | グラフィカル表示の方法を指定する。|
| --vcpus  | 仮想CPUの数を指定する。|
| --extra-args | consoleを指定しないと仮想マシンのコンソールに接続できず、仮想マシンのインストールができない。(テキストモードのインストール画面が表示できない)ため必須。|
| --network | ネットワークオプションをカンマ区切りで指定する。ゲスト仮想マシンにネットワークインターフェースを設定しない場合はnetwork=[none]、NATを用いる場合は[default]、ブリッジネットワークを用いる場合は[br0]とする。model=[ネットワークデバイスのモデル名]はハイパーバイザがサポートしているNICのモデル名を指定する。|

```
ubuntu:~$ virt-install \
--name=centos7 \
--memory=2048 \
--disk path=/var/lib/libvirt/images/centos7.img,size=20 \
--cdrom =/var/lib/libvirt/iso/CentOS-7-x86_64-Minimal-1804.iso \
--connect qemu:///system \
--graphics none \
--vcpus=1 \
--connect qemu:///system \
--graphics none \
--extra-args 'console=ttyS0' \
--network bridge=br0,model=virtio
```

#####8.仮想マシンの起動
先述のコマンドを打つと、かなり長いブートログを吐きながら仮想マシンが起動し、やがて下記のようなテキストモードのCentOS7インストール画面が表示されます。

```
	 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)
	  Please make your choice from above ['q' to quit | 'b' to begin installation |
	  'r' to refresh]:

	[anaconda] 1:main* 2:shell  3:log  4:storage-lo> Switch tab: Alt+Tab | Help: F1
```

簡単に解説すると、ipアドレスの設定やホスト名の設定など特殊な場合以外は選択肢から数字を選択して設定していく感じです。設定が完了している項目には[x]が、そうでない項目は[!]と共にエラーの理由が表示されています。

こちらは、[CentOS7 (1804) のテキストベースインストール手順](https://qiita.com/mattsun/items/a1359abdacc14317ad9b)などを参考にインストールを進めると良いと思います。

このあと、仮想マシンに再度接続する場合はvirsh console コマンドでコンソールログインしてください。他にも、virshコマンドによる仮想マシンの操作ができますので、調べてみてください。

##まとめ
ここまでで恐らくCLI環境でKVMを導入し仮想OSをインストールできていると思います。だからなんだって感じですが。
KVMに初めて触れて間もなく、まだ理解していない部分が多いので、繰り返しになりますが色々ご指摘いただけるとありがたいです。

##参考サイト
[仮想化の導入および管理ガイド](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/)

[Ubuntu 16.04: KVMをインストールして仮想マシンを起動する](https://www.hiroom2.com/2016/07/11/ubuntu-16-04-kvm%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/)

[Ubuntu 18.04: 仮想化のKVMをインストールする](https://www.hiroom2.com/2018/05/11/ubuntu-1804-kvm-ja/)

[KVMの仮想マシン作成 & インストール自動化(virt-install & Kickstart)](https://www.serotoninpower.club/archives/420)

[Ubuntu16.04にKVM(qemu-kvm)のインストールで初期ログイン](http://www.takunoko.com/blog/ubuntu16-04%E3%81%ABkvmqemu-kvm%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E5%88%9D%E6%9C%9F%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3/)

[How to Install and Configure KVM on Ubuntu 18.04 LTS Server](https://www.linuxtechi.com/install-configure-kvm-ubuntu-18-04-server/)

[KVM[がらくたネット]](http://e-garakuta.net/techinfo/doku.php/linux/kvm)

[virt-install実行にの設定値メモ](https://qiita.com/nekakoshi/items/55fae55ab51163ea867c)

[CentOS7 (1804) のテキストベースインストール手順](https://qiita.com/mattsun/items/a1359abdacc14317ad9b)

[Redhatの公式ドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-virtual_machine_installation-virt-install-virt-manager-matrix)

など