【KVM入門②】〜複数の仮想マシンを作成して仮想マシン間で通信を行えるようにする〜

# KVM入門一覧
- [【KVM入門⓪】〜Linuxの基礎知識〜](https://qiita.com/ryutarom128/items/00ed01b0c9dd59716964)
- [【KVM入門①】〜KVMを使って仮想マシンを作成する〜](https://qiita.com/ryutarom128/items/a31cc4e296442cd0f9d6)
- 【KVM入門②】〜複数の仮想マシンを作成して、仮想マシン間で通信を行えるようにする〜👈今ここ
- [【KVM入門③】〜DNSとhostsの設定を行う〜](https://qiita.com/ryutarom128/items/7dd3646beddb96dc647a)
- [【KVM入門④】〜NFSを使って全ての仮想マシンでファイルを共有する〜](https://qiita.com/ryutarom128/items/3d66f1a5d61c3eb4e426)
- [【KVM入門⑤】〜LDAPを使ってユーザ情報などを一元管理する〜](https://qiita.com/ryutarom128/items/b008ca44b7265164879c)

# はじめに
KVMシリーズ第2回です。

今回は、複数の仮想マシンを作成して、仮想マシン間で通信できるようにしていきます。

まずは実際に行うコマンドを紹介し、その後解説をしていきます。

以下の図の赤色の部分のように、`test-vm1`から`test-vm4`を作成して、それぞれのホスト間でpingが通るようにするところまでをこの回の目標とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/63d094ab-a2ee-adf8-41ba-a48eff5d0f52.png)

# すること
## 1. 仮想マシンの複製
[前回作成したtest-vmという名前の仮想マシン](https://qiita.com/ryutarom128/items/a31cc4e296442cd0f9d6)を複製する。
```bash
sudo virt-clone --original test-vm --name test-vm1 --auto-clone
```
`test-vm1`の部分を、`test-vm2`、`test-vm3`、`test-vm4`に変えて4回コマンドを入力し、4つの仮想マシンを作成する。

以下のように表示されれば、仮想マシンの複製は成功している。
```bash
[xxx@localhost ~]$ sudo virt-clone --original test-vm --name test-vm1 --auto-clone
Allocating 'test-vm1.qcow2'   |  30 GB  00:00:01

Clone 'test-vm1' created successfully.
[xxx@localhost ~]$ sudo virt-clone --original test-vm --name test-vm2 --auto-clone
Allocating 'test-vm2.qcow2'   |  30 GB  00:00:01

Clone 'test-vm2' created successfully.
[xxx@localhost ~]$ sudo virt-clone --original test-vm --name test-vm3 --auto-clone
Allocating 'test-vm3.qcow2'   |  30 GB  00:00:01

Clone 'test-vm3' created successfully.
[xxx@localhost ~]$ sudo virt-clone --original test-vm --name test-vm4 --auto-clone
Allocating 'test-vm4.qcow2'   |  30 GB  00:00:01

Clone 'test-vm4' created successfully.
[xxx@localhost ~]$ sudo virsh list --all
 Id   Name       State
---------------------------
 -    test-vm1   shut off
 -    test-vm2   shut off
 -    test-vm3   shut off
 -    test-vm4   shut off
```

作成できたら全て起動しておく。
```bash
sudo virsh start test-vm1
```

## 2. 仮想ネットワークの設定
流れは以下の通り。
1. 仮想ネットワークに関する情報をxmlファイルに書く
1. ネットワークインターフェースを作成する
1. ネットワークインターフェースを起動する

まずはxmlファイルを作成する。
```bash
sudo vi net-define.xml
```
以下をコピペする。
```net-define.xml
<network>
　# 任意の名前
  <name>test-net</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge stp='on' delay='0'/>
  # デフォルトゲートウェイのIPアドレス
  <ip address='172.16.1.254' netmask='255.255.255.0'></ip>
</network>
```

```bash
sudo virsh net-define net-define.xml
```

成功すると以下のように表示される。
```bash
[xxx@localhost ~]$ sudo virsh net-list --all
 Name       State    Autostart   Persistent
---------------------------------------------
 default    active   yes         yes
 test-net   active   no          no
```

仮想ネットワークを起動し、自動起動を有効にする。
```bash
sudo virsh net-start test-net
```

```bash
sudo virsh net-autostart test-net
```

以下のように表示されれば、仮想ネットワークの設定は成功している。
```bash
[xxx@localhost ~]$ sudo virsh net-list --all
 Name       State    Autostart   Persistent
---------------------------------------------
 default    active   yes         yes
 test-net   active   yes         yes
```

## 3. 仮想マシンへの適用
仮想マシンの設定の編集をする。

```bash
sudo virsh edit test-vm1
```

上のコマンドを入力するとviが起動するので、以下の部分を変更する。（/netで検索すると早い。）
```
<interface type='network'>
    <mac address='52:54:00:39:22:ed'/>
    <source network='test-net'/>
    <model type='virtio'/>
    <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
```

仮想ネットワークを再起動する。
```bash
sudo virsh net-destroy test-net
```
```bash
sudo virsh net-start test-net
```

仮想マシンを再起動する。
```bash
sudo virsh shutdown test-vm1
```
```bash
sudo virsh start test-vm1
```

以下のように表示されれば、仮想マシンへの適用は成功している。
```bash
[xxx@localhost ~]$ sudo virsh domiflist test-vm1
 Interface   Type      Source         Model    MAC
------------------------------------------------------------------
 vnet1       network   test-net       virtio   52:54:00:39:22:ed

[xxx@localhost ~]$ sudo virsh domiflist test-vm2
 Interface   Type      Source         Model    MAC
------------------------------------------------------------------
 vnet1       network   test-net       virtio   52:54:00:39:22:ed

[xxx@localhost ~]$ sudo virsh domiflist test-vm3
 Interface   Type      Source         Model    MAC
------------------------------------------------------------------
 vnet1       network   test-net       virtio   52:54:00:39:22:ed

[xxx@localhost ~]$ sudo virsh domiflist test-vm4
 Interface   Type      Source         Model    MAC
------------------------------------------------------------------
 vnet1       network   test-net       virtio   52:54:00:39:22:ed
```

## 4. IPアドレスとデフォルトゲートウェイの設定
ここからは仮想マシン内で作業を行う。`test-vm1`を例に説明する。

仮想マシンに接続する。

```bash
sudo virsh console test-vm1
```

`test-vm1`のIPアドレスを設定する。
```bash
nmcli con mod enp1s0 ipv4.address "172.16.1.1/24"
```

デフォルトゲートウェイを設定する。
```bash
nmcli con mod enp1s0 ipv4.gateway "172.16.1.254"
```

IPアドレスを固定する。
```bash
nmcli con mod enp1s0 ipv4.method manual
```

ネットワーク接続を再起動する。
```bash
nmcli con down enp1s0
```
```bash
nmcli con up enp1s0
```

以下のように表示されればIPアドレスとデフォルトゲートウェイの設定は成功している。
```bash
[xxx@localhost ~]# nmcli dev show enp1s0
GENERAL.DEVICE:                         enp1s0
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         52:54:00:39:22:ED
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     enp1s0
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveC>
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         172.16.2.1/24
IP4.GATEWAY:                            172.16.2.254
IP4.ROUTE[1]:                           dst = 172.16.2.0/24, nh = 0.0.0.0, mt =>
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 172.16.2.100, mt >
IP6.ADDRESS[1]:                         fe80::5054:ff:fe39:22ed/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 1024
```

## 5. pingで導通確認
4つの仮想マシンでのIPアドレスとデフォルトゲートウェイの設定が終わったら、最後に`ping`コマンドで導通確認を行う。

仮想マシン間で通信できることを確認する。
```bash
ping 172.16.1.2 -c 3
```

以下のように表示されれば成功している。
```bash
[root@localhost ~]# ping 172.16.1.2 -c 3
PING 172.16.2.2 (172.16.2.2) 56(84) bytes of data.
64 bytes from 172.16.2.2: icmp_seq=1 ttl=64 time=0.131 ms
64 bytes from 172.16.2.2: icmp_seq=2 ttl=64 time=0.238 ms
64 bytes from 172.16.2.2: icmp_seq=3 ttl=64 time=0.358 ms

--- 172.16.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2083ms
rtt min/avg/max/mdev = 0.131/0.242/0.358/0.092 ms
[root@localhost ~]# ping 172.16.1.3 -c 3
PING 172.16.2.3 (172.16.2.3) 56(84) bytes of data.
64 bytes from 172.16.2.3: icmp_seq=1 ttl=64 time=0.254 ms
64 bytes from 172.16.2.3: icmp_seq=2 ttl=64 time=0.350 ms
64 bytes from 172.16.2.3: icmp_seq=3 ttl=64 time=0.343 ms

--- 172.16.2.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2050ms
rtt min/avg/max/mdev = 0.254/0.315/0.350/0.043 ms
[root@localhost ~]# ping 172.16.1.4 -c 3
PING 172.16.2.4 (172.16.2.4) 56(84) bytes of data.
64 bytes from 172.16.2.4: icmp_seq=1 ttl=64 time=0.264 ms
64 bytes from 172.16.2.4: icmp_seq=2 ttl=64 time=0.351 ms
64 bytes from 172.16.2.4: icmp_seq=3 ttl=64 time=0.391 ms

--- 172.16.2.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2036ms
rtt min/avg/max/mdev = 0.264/0.335/0.391/0.053 ms
```

[Google Public DNS](https://developers.google.com/speed/public-dns?hl=ja)と通信できるか確認する。
```bash
ping 8.8.8.8 -c 3
```

以下のように表示されれば成功している。
```bash
[root@vm1 schema]# ping 8.8.8.8 -c 3
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=115 time=2.41 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=115 time=2.64 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=115 time=2.89 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.411/2.645/2.889/0.195 ms
```

# さいごに
今回は仮想マシンを複製して、仮想マシン同士で通信できるようにする方法を紹介しました。
次回はDNSのサーバの設定を行っていきます。

https://qiita.com/ryutarom128/items/7dd3646beddb96dc647a