【KVM】CentOS 7.5上にKVMを使用して仮想環境を構築し、ゲストOSをブリッジ接続する

# 概要
社内のVMサーバがパンパンになってしまったので、新しくVMサーバの構築をこんな感じで依頼されました。
> 社内運用担当者
「とりあえずCentをインストールして仮想マシンマネージャ使えるようにして。
HDDは300GB*2、2TB*2を挿してあるから、両方ともRAID1構成で、300GBの方にOSインストール、2TBの方はVMのイメージファイルを置く感じで。仮想マシンにLANからつなげるようにブリッジ設定もしておいてね。」
自分「？？？（はい、わかりました）」

それなりに業務でLinuxとかを触ってきましたが、よくわからんことがいっぱいだなあと思いながら調べつつ環境構築しました。

### RAID1とは？
まずここが不明でした。これまでに聞いたこともない。
ので検索。

[Web便利ノート](https://note.cman.jp/server/raid/raid1/)より引用
>RAID1は、同じデータを2本のハードディスクに書き込みすることで耐障害性を高めた構成です。ハードディスク1本に障害が発生してもシステムは停止せずにデータも失われません。
ただし、同じデータを二重で保管しているためハードディスク2本で1本分の容量しか使用できません。

要はHDDが壊れたときにデータを失わなくて済むように、2つのHDDに同じデータを書いておくってことですね。
細かいコマンドやらなにやらは置いといて、実際に作成していきます。

### ブリッジとは？
ネットワーク系で名前だけは聴いたことあるが不明。

Qiitaの以下などを参考にしました。構築の手順などもここを参考にしています。
[KVMでゲストOSをブリッジ接続する](https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7)

ブリッジは2つのネットワークをつなぐための橋渡しなんですね。
今回で言うと、ローカルマシン、VMサーバが存在するLANと、仮想マシンが存在するLANの橋渡しとして、VMサーバ上にブリッジを設定します。

# 前提
- OS：CentOS 7.5
- メモリ：96GB
- CPU：6コア
- VM：KVM（仮想マシンマネージャ）
- 構成：

|デバイス名|容量|構成|マウントポイント|タイプ|用途|
|---------|---|----|--------------|-----|---|
|sda|300GB|RAID1（md12）|/|ext4|OSインストール領域1|
|sdb|300GB|RAID1（md12）|/|ext4|OSインストール領域2|
|sdc|2TB|RAID1（md0）|/mnt/kvm|ext4|VMイメージ作成領域1|
|sdd|2TB|RAID1（md0）|/mnt/kvm|ext4|VMイメージ作成領域1|
- ネットワーク：以下のような構成を目指します。<br>
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/1fa3e3da-3ca1-7f64-2d8a-ebc5bc1cd6ec.png)

# VMサーバを構築する
今回はCentOS 7.5のISOイメージをDVDに焼いてインストールに使用します。

1. ISOイメージは[公式サイト](https://www.centos.org/download/)からダウンロード。
1. DVDをVMサーバにセットしてサーバを起動します。
1. サーバが起動すると暗い画面で起動方法を確認されるので以下を選択します。<br>
`Test this media & Install CentOS 7`
1. Enterを押すとインストールメディアのチェックを行った後に、インストールが開始されます。

## CentOSのインストール
基本的には画面の流れに沿ってインストールしていきます。
設定が必要な箇所、躓いた箇所などを記述していきます。
![3-install-tasks.png](https://qiita-image-store.s3.amazonaws.com/0/379994/975a8bd8-9b23-0e22-eddd-a2a32d6aaa39.png "インストールの概要画面")

### ソフトウェアの選択
以下を選択する。

|ベース環境|選択するアドオン|
|---------|--------------|
|サーバ（GUI使用）|開発ツール<br>互換性ライブラリ<br>仮想化ツール<br>仮想化クライアント<br>仮想化ハイパーバイザー|

### システム
1. 「インストール先」をクリック
1. 「ローカルの標準ディスク」から300GB2つだけを選択
1. 「その他のストレージオプション」→「パーティション構成」→「自分でパーティションを行う」を選択
1. 「完了」をクリック

#### パーティション設定
一番の難所でした。。。何にどれぐらい設定すればいいのかもわからず、自動構成だとRAIDが組めず。。。
順序としては最初にboot、boot/efiをRAID1構成で作成、2つのHDDをLVMで1つとしたところにswap、/を割り当てていきます。
それぞれに設定している容量はあくまで参考程度です。

1. 画面左下の「+」をクリックし、画像のように入力し「マウントポイントの追加」をクリック
<br>![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/11b425e3-0f00-6987-3ff8-061e026b5b84.png)
1. 作成された「boot」の設定を変更<br>
 - デバイスタイプ：RAID
 - RAIDレベル：RAID1（冗長化）
 - 「設定の更新」をクリック
1. 手順1,2と同様に「boot/efi」を作成<br>
「boot」とはファイルシステムが異なるが他は同じ
1. 再度「+」をクリックし、「swap」領域を作成<br>
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/14d1fb91-130e-74bc-98ce-2b2a0d1746ab.png)
1. ボリュームグループを設定<br>
 - デバイスタイプ：LVM
 - Volume Group：「修正」をクリック
 - 300GBのディスク2つを選択
 - RAIDレベル：RAID1を選択
 - サイズポリシー：できるだけ大きく
 - 「保存」をクリック
1. 「/」を作成<br>
割り当てる領域になにも指定しないことで、残りの全領域が割り当てられる。<br>
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/5b64d8cb-6afc-a9c9-1540-05f52136a02f.png)
1. 作成された「/」の設定を変更<br>
 - デバイスタイプ：LVM
 - Volume Group：swapで設定したボリューム
 - ファイルシステム：ext4
1. 「完了」をクリック<br>
以下のような確認画面が表示された場合は「変更を許可する」をクリック<br>
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/6b131814-e13b-b151-619e-066e7a8be8b1.png)

#### ネットワークの設定
ポート1にLANケーブルが接続されている前提で記述しています。
後からブリッジの設定などでネットワーク設定は変更していきますが、一旦設定しておきます。

1. 「ネットワークとホスト名」をクリック
1. 「イーサネット（eno1）」を「ON」に変更
1. 「設定」をクリックし、「IPv4のセッティング」タブを表示
1. 以下を設定し「保存」をクリック<br>
 - 方式：手動
 - アドレス：192.168.200.10
 - サブネットマスク：255.255.255.0
 - ゲートウェイ：（環境に合わせて設定）
 - DNSサーバ：（環境に合わせて設定）

# ブリッジの設定

#### 現在のブリッジ設定を確認
初期状態ではvirbr0のみが存在する。

```
[root@Juliett ~]# brctl show
virbr0          8000.5254009fd896       yes             virbr0-nic
[root@Juliett ~]#
```

#### 新たなブリッジの設定を追加
今回はeno1ポートを使用してbr0ブリッジを設定します。

```
--- (1)
[root@Juliett system]# nmcli connection add type bridge ifname br0
接続 'bridge-br0' (8dcbbc7a-a693-4999-a211-b91f8b28d947) が正常に追加されました。
[root@Juliett system]# nmcli connection modify bridge-br0 bridge.stp no

--- (2)
[root@Juliett system]# nmcli connection modify bridge-br0 ipv4.method manual ipv4.addresses "192.168.200.10/24" ipv4.gateway "（ゲートウェイのIP）" ipv4.dns （DNSのIP）

--- (3)
[root@Juliett system]# nmcli connection add type bridge-slave ifname eno1 master bridge-br0
[root@Juliett system]# nmcli connection delete eno1　←リモート接続だとここで切断される

--- (4)
[root@Juliett system]# systemctl restart network
[root@Juliett ~]# nmcli connection show　　　　　←作成されていることの確認
NAME               UUID                                  TYPE      DEVICE
bridge-br0         8dcbbc7a-a693-4999-a211-b91f8b28d947  bridge    br0
bridge-slave-eno1  62c68dba-baf5-4d53-8671-e6f75b7ece73  ethernet  eno1
virbr0             731cc38d-7578-47dd-abdf-27c46466c732  bridge    virbr0
vnet0              293bfa8d-4d85-47da-832d-d869f8b3fbca  tun       vnet0
eno2               fe8c7c94-87b4-447c-9894-5cb0627a386a  ethernet  --
eno3               7620ac97-db9b-483d-9fec-c95389476ebe  ethernet  --
eno4               0445a38c-e018-4243-8b09-4abe38d046db  ethernet  --
[root@Juliett ~]#
```

| 番号 | 概要 |
|---|---|
|1|br0という名前のブリッジを作成。   |
|2|br0にIP、ゲートウェイ、DNSを設定。<br>ここはeno1に設定したIPと同じものを設定する。|
|3|ポート1（eno1）をブリッジに追加し、eno1の接続を削除する。<br>リモートで接続して作業している場合は、このタイミングでネットワークが切断される。|
|4|ネットワークを再起動して、ブリッジが作成されていることを確認する。<br>bridge-br0、bridge-slave-eno1が設定されていれば成功。|

# VMイメージ用のHDDをマウント

ここまででVMサーバの構築は完了したので、最後にVMイメ-ジを配置するためのHDDをマウントする。
sdc、sddにRAID1構成を設定し/mnt/kvmにマウントする。

#### RAID構成の作成
sdc、sddをRAID1構成として/dev/md0を作成する。

```
mdadm --verbose --create /dev/md0 --metadata 1.0 --level=raid1 --raid-devices=2 /dev/sdc /dev/sdd
```

#### HDDのフォーマット

HDDをext4形式でフォーマットする。

```
mkfs.ext4 /dev/md0
```

#### 再起動時の設定

再起動後もRAID構成が維持されるように設定する。
念のために設定ファイルのバックアップを取得してから行う。

```
cp /etc/mdadm.conf /etc/mdadm.conf.org
mdadm --detail --scan | grep "/dev/md0" >> /etc/mdadm.conf
```

#### マウントポイントの作成

HDDをマウントするための領域を作成する。
後続の「マウント設定の追記」を行うと設定が間違っていた場合に、最悪サーバが起動しなくなるためマウントできるかどうかの確認もしておく。

```
mkdir -p /mnt/kvm
mount /dev/md0 /mnt/kvm
ls /mnt/kvm           ←エラーが発生していなければ成功
umount /mnt/kvm　　　　←アンマウントしておく
```

#### マウント設定の追記

再起動後も自動でマウントされるように設定する。
念のために設定ファイルのバックアップを取得してから行う。

```
cp /etc/fstab /etc/fstab.org
echo "/dev/md0                /mnt/kvm              ext4    defaults        0 0" >> /etc/fstab
```

# 仮想マシン1の作成

ようやくVMサーバの構築が完了したのでゲストVMを構築していきます。
ISOイメージさえ用意してしまえば、Linux系でもWindows系でもサーバを構築できます。
今回はCentOS 7.3をインストールする例を紹介します。

#### ゲストVMの作成

1. VMサーバに接続し、仮想マシンマネージャを起動
1. 左上の「新しい仮想マシンの作成」をクリック

#### ステップ 1/5

「ローカルのインストールメディア」を選択し、「進む」をクリックします。

![キャプチャ1-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/e7873eea-d6a9-b263-d380-8d2236a6242e.png)

#### ステップ 2/5

「ISOイメージを使用」を選択し、「参照」をクリックします。
インストール用のISOイメージを選択し、「ボリュームの選択」をクリックします。
![キャプチャ2-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/7a8b3e37-f8cc-dd8c-40c8-9dd051024755.png)
元の画面に戻り、選択したISOイメージが正しいこと、OSの自動判別にチェックが入っていることを確認し「進む」をクリックします。
![キャプチャ2-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/fadfa2fa-0f02-921c-2859-0e9b0dc48514.png)

#### ステップ 3/5

仮想マシンに設定するメモリ、コア数を設定します。<br>ここではメモリ1GB、CPU1コアを割り当てています。<br>※ここはVMサーバのスペック、作成する仮想マシンの数、仮想マシンに必要な性能に応じて設定してください。 
![キャプチャ3-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/33b21df2-0ebc-8397-4534-2cfe004351fb.png)

#### ステップ 4/5

「カスタムストレージの選択または作成」を選択し、「管理」をクリックします。
![キャプチャ4-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/c24e40f7-9ad9-6ae4-3106-dca4418f5734.png)
ウインドウ左下の「+」をクリックし、「/mnt/kvm」を選択します。
選択したkvmが画面左に追加され、青色になっていることを確認したら、ボリューム横の「+」をクリックします。
![キャプチャ4-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/ad7b415a-9811-4758-91d0-3cc0a50a8263.png)
名前に「_仮想マシン名_.qcow2」を入力し、最大容量に仮想マシンに割り当てるディスクサイズを設定します。
設定が正しいことを確認し、「完了」をクリックします。
![キャプチャ4-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/d71a78be-dc84-d94e-9694-4f84df531f4f.png)
作成されたボリュームが選択されていることを確認し、「ボリュームの選択」をクリックします。
設定を確認し「進む」をクリックします。
![キャプチャ4-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/c24e40f7-9ad9-6ae4-3106-dca4418f5734.png)

#### ステップ 5/5

名前に「_仮想マシン名_」を入力する。
「ネットワークの選択」をクリックし、作成したブリッジが選択されていることを確認したら、「完了」をクリックします。
![キャプチャ5-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/379994/9a4d858d-454f-16ea-0c7c-73f60f664840.png)

#### OSのインストール

細かい手順は割愛しますが、作成したい仮想マシンの設定に合わせてインストールしていきます。
ネットワークは以下を設定します。

| 設定 | 値 |
|:--|:--|
| 方式 | IPv4 |
| 割り当て | 静的 |
| IPアドレス  | 192.168.200.30  |
| サブネットマスク | 255.255.255.0 |

#### 接続の確認

OSのインストールが終了したら作業は完了なので、疎通確認を行っていきます。
ローカルマシンでコマンドプロンプトを立ち上げ以下のコマンドを実行します。

```
C:\Users>ping 192.168.200.30

192.168.200.30 に ping を送信しています 32 バイトのデータ:
192.168.200.30 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.200.30 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.200.30 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.200.30 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.200.30 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```
このような表示になれば成功です。
パケットがロストするようであれば、ファイアウォールなどの設定を確認してみてください。
最後に、同じ手順で仮想マシン2（192.168.200.31）を作成することで、目標としていたネットワーク構成を構築することができました。

# おわりに

無事VMサーバ構築ができましたでしょうか？
私は元々ハード系には詳しくないので、調べながら試行錯誤を繰り返してどうにか構築できました。
大分省略してしまっている部分などありますが、自分と似たようなことをしたい人の助けになればいいかなと思います。

また、このほかにもマシン室にいなくても各種作業を行えるようにVNCサーバなどのインストールも行っていますが、そちらは別の記事で紹介しようと思います。