KVM 仮想マシン ネットワーク設定

自分用メモ。
[KVM 仮想マシン作成](https://qiita.com/Ki2neudon/items/573f8313879b748fd74b)の続き。

# KVMマシン 起動

```bash:ホストOS
$ sudo virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     openstack_cmpt_1               シャットオフ
 -     openstack_cmpt_2               シャットオフ
 -     openstack_cmpt_3               シャットオフ
 -     openstack_cmpt_4               シャットオフ
 -     openstack_ctrl                 シャットオフ

$ sudo virsh start openstack_ctrl
ドメイン openstack_ctrl が起動されました

$ sudo virsh console openstack_ctrl
ドメイン openstack_ctrl に接続しました
エスケープ文字は ^] です
[    9.703133] intel_rapl: no valid rapl domains found in package 0
[    9.712187] intel_rapl: no valid rapl domains found in package 0

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

localhost login:
```

# 設計

![NWカスタマイズ前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259373/f79e9f54-c9ae-ae77-dbc2-f0a1586efc5a.png)

↑これを
↓こうじゃ！

![NWカスタマイズ後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259373/54abab85-ec84-2294-7427-ff9f642beaa0.png)

# 外向けIF 設定

```bash:ゲストOS
localhost login: root
パスワード:
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:51:cc:92 brd ff:ff:ff:ff:ff:ff

[root@localhost ~]# nmcli device
デバイス  タイプ    状態      接続
eth0      ethernet  切断済み  --
lo        loopback  管理無し  --

[root@localhost ~]# nmcli connection add type ethernet ifname eth0 con-name eth0
接続 'eth0' (47162d81-5bb7-45f6-b487-d98c6d6e109d) が正常に追加されました。 eth0

[root@localhost ~]# nmcli device
デバイス  タイプ    状態                       接続
eth0      ethernet  接続中（IP 設定を取得中）  eth0
lo        loopback  管理無し                   --

[root@localhost ~]# nmcli con show
名前  UUID                                  タイプ          デバイス
eth0  47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  eth0
eth0  8f0894b1-1857-49e6-b3c5-da64ecac0f84  802-3-ethernet  --
```

コレが ``Access Port`` に接続するIFなら以下でOK

```bash:ゲストOS
[root@localhost ~]# nmcli connection modify enp0s9 \
connection.autoconnect yes \
ipv4.method manual \
ipv4.addresses "192.168.10.121/16"
```

しかし今回は接続先が ``Trunk Port`` なので ``VLAN`` を作る必要がある。
先に ``internal_lan`` つなげれば楽だったのに。。

参考：[10.3. コマンドラインツール nmcli を使った 802.1Q VLAN タグの設定](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-configure_802_1q_vlan_tagging_using_the_command_line_tool_nmcli)

```bash:ゲストOS
[root@localhost ~]# nmcli con add type vlan con-name eth0.10 dev eth0 id 10
接続 'eth0.10' (5f995a1a-29b4-4366-96f0-d2f00f5e8051) が正常に追加されました。

[root@localhost ~]# nmcli con show
名前     UUID                                  タイプ          デバイス
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth0     8f0894b1-1857-49e6-b3c5-da64ecac0f84  802-3-ethernet  --
eth0     47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  --
```

ちなみに [おじさん達](https://qiita.com/Ki2neudon/items/873aec83c69b06d0f082) のために、作成された ``ifcfg-eth0.10`` を見るとこんな感じ。

```bash:ゲストOS
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0.10
VLAN=yes
TYPE=Vlan
PHYSDEV=eth0
VLAN_ID=10
REORDER_HDR=yes
GVRP=no
MVRP=no
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0.10
UUID=5f995a1a-29b4-4366-96f0-d2f00f5e8051
ONBOOT=yes
```

作成した IF に IP アドレスを割り当てるぞ。

```bash:ゲストOS
[root@localhost ~]# nmcli con modify eth0.10 \
> connection.autoconnect yes \
> ipv4.method manual \
> ipv4.address "192.168.10.121/16"

[root@localhost ~]# nmcli con show
名前     UUID                                  タイプ          デバイス
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth0     8f0894b1-1857-49e6-b3c5-da64ecac0f84  802-3-ethernet  --
eth0     47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  --

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態      接続
eth0.10   vlan      接続済み  eth0.10
eth0      ethernet  切断済み  --
lo        loopback  管理無し  --

[root@localhost ~]# ping 192.168.10.120
PING 192.168.10.120 (192.168.10.120) 56(84) bytes of data.
64 bytes from 192.168.10.120: icmp_seq=1 ttl=64 time=0.737 ms
64 bytes from 192.168.10.120: icmp_seq=2 ttl=64 time=0.244 ms

--- 192.168.10.120 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.244/0.490/0.737/0.247 ms

[root@localhost ~]# ping 192.168.200.98
PING 192.168.200.98 (192.168.200.98) 56(84) bytes of data.
64 bytes from 192.168.200.98: icmp_seq=1 ttl=128 time=61.8 ms
64 bytes from 192.168.200.98: icmp_seq=2 ttl=128 time=30.9 ms

--- 192.168.200.98 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 30.955/46.413/61.871/15.458 ms
```

ホストOS にも ぱそこん にも疎通がとれる。

```:ぱそこん(コマンドプロンプト)
C:\Users\Administrator>ping 192.168.10.121

192.168.10.121 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
要求がタイムアウトしました。
```

しかし ぱそこん → ゲストOS に疎通が届かない。

```bash
[root@localhost ~]# ssh 192.168.10.120 -l udon
udon@192.168.10.120's password:
Last login: Fri Dec 13 09:37:48 2019 from 192.168.200.98

[udon@kvm_host ~]$ who
udon     pts/0        2019-12-13 09:30 (192.168.200.98)
udon     pts/2        2019-12-13 10:37 (192.168.100.96)
```

ゲストOS → ホストOS に接続して ``who`` を実行するとゲストOSのIPが ``192.168.100.96`` になっている。

```bash:ゲストOS
[root@localhost ~]# ip addr show eth0.10
4: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 52:54:00:51:cc:92 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.96/16 brd 192.168.255.255 scope global dynamic eth0.10
       valid_lft 42269sec preferred_lft 42269sec
    inet6 fe80::f152:b35b:5f06:6c6/64 scope link
       valid_lft forever preferred_lft forever
```

<b>OOPS</b>

そうか、静的 IP (``ipv4.method manual``)を設定する前に ``DHCP`` で IP とってきてたか。
該当の IF を再起動する。

```bash:ゲストOS
[root@localhost ~]# nmcli con down eth0.10
接続 'eth0.10' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/5)

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態                       接続
eth0      ethernet  接続中（IP 設定を取得中）  eth0
lo        loopback  管理無し                   --

[root@localhost ~]# nmcli con up eth0.10
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/17

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態                       接続
eth0.10   vlan      接続済み                  eth0.10
eth0      ethernet  接続中（IP 設定を取得中）  eth0
lo        loopback  管理無し                   --

[root@localhost ~]# ip addr show eth0.10
5: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 52:54:00:51:cc:92 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.121/16 brd 192.168.255.255 scope global eth0.10
       valid_lft forever preferred_lft forever
    inet6 fe80::f152:b35b:5f06:6c6/64 scope link
       valid_lft forever preferred_lft forever
```

めでたく。

```:ぱそこん(コマンドプロンプト)
C:\Users\Administrator>ping 192.168.10.121

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

192.168.10.121 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 31ms、最大 = 62ms、平均 = 38ms
```

ぱそこんからも届く。

# 内向けIF 設定

仮想マシンに IF を追加するため一度停止する。

```bash:ゲストOS
[root@localhost ~]# shutdown -h now
Powering off.
[ 4726.878587] Power down.
```

```bash:ホストOS
$ sudo virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     openstack_cmpt_1               シャットオフ
 -     openstack_cmpt_2               シャットオフ
 -     openstack_cmpt_3               シャットオフ
 -     openstack_cmpt_4               シャットオフ
 -     openstack_ctrl                 シャットオフ
```

仮想マシンに IF を追加する。

```bash:ホストOS
[udon@kvm_host ~]$ sudo ls -l /etc/libvirt/qemu/openstack_ctrl.xml
-rw-------. 1 root root 3718 12月 12 11:48 /etc/libvirt/qemu/openstack_ctrl.xml

[udon@kvm_host ~]$ sudo vim /etc/libvirt/qemu/openstack_ctrl.xml
----------------------------------------------------------------------
  :(省略)
  <interface type='bridge'>
    <mac address='52:54:00:51:cc:92'/>
    <source bridge='br2'/>
    <model type='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  </interface>
+ <interface type='network'>
+   <source network='internal_lan'/>
+   <model type='virtio'/>
+ </interface>
  :(省略)
----------------------------------------------------------------------

[udon@kvm_host ~]$ sudo virsh define /etc/libvirt/qemu/openstack_ctrl.xml
ドメイン openstack_ctrl が /etc/libvirt/qemu/openstack_ctrl.xml から定義されました

[udon@kvm_host ~]$ sudo virsh start openstack_ctrl
ドメイン openstack_ctrl が起動されました
```

``ssh`` などで先に作成した外部 IF に接続。

```bash:ゲストOS
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:51:cc:92 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:0b:e8:0a brd ff:ff:ff:ff:ff:ff
4: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:51:cc:92 brd ff:ff:ff:ff:ff:ff
```

IF が追加されていることを確認。
あとの設定は同じ。

```bash:ゲストOS
[root@localhost ~]# nmcli con
名前        UUID                                  タイプ          デバイス
eth0.10     5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth0        47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  --
有線接続 1  ccebedd6-fc9b-34db-8534-3886fe815009  802-3-ethernet  --
```

新たに接続した ``eth1`` が ``有線接続 1`` という名前になっている。
一度削除して再作成する。

```bash:ゲストOS
[root@localhost ~]# nmcli con del "有線接続 1"
接続 '有線接続 1' (ccebedd6-fc9b-34db-8534-3886fe815009) が正常に削除されました。

[root@localhost ~]# nmcli con
名前     UUID                                  タイプ          デバイス
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth0     47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  --

[root@localhost ~]# nmcli con add type ethernet ifname eth1 con-name eth1
接続 'eth1' (4977f7ab-0e84-4cae-8a6d-a9e050880f3b) が正常に追加されました。

[root@localhost ~]# nmcli con
名前     UUID                                  タイプ          デバイス
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth1     4977f7ab-0e84-4cae-8a6d-a9e050880f3b  802-3-ethernet  eth1
eth0     47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  --

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態                       接続
eth0.10   vlan      接続済み                   eth0.10
eth1      ethernet  接続中（IP 設定を取得中）  eth1
eth0      ethernet  切断済み                   --
lo        loopback  管理無し                   --

[root@localhost ~]# nmcli con mod eth1 \
connection.autoconnect yes \
ipv4.method manual \
ipv4.address "172.19.1.1/23"

[root@localhost ~]# nmcli con down eth1
接続 'eth1' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/30)

[root@localhost ~]# nmcli con up eth1
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/31)

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態                       接続
eth1      ethernet  接続済み                   eth1
eth0.10   vlan      接続済み                   eth0.10
eth0      ethernet  接続中（IP 設定を取得中）  eth0
lo        loopback  管理無し                   --

[root@localhost ~]# nmcli con
名前     UUID                                  タイプ          デバイス
eth0     47162d81-5bb7-45f6-b487-d98c6d6e109d  802-3-ethernet  eth0
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth1     4977f7ab-0e84-4cae-8a6d-a9e050880f3b  802-3-ethernet  eth1

[root@localhost ~]# ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:0b:e8:0a brd ff:ff:ff:ff:ff:ff
    inet 172.19.1.1/23 brd 172.19.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::535f:d425:c0bb:93cd/64 scope link
       valid_lft forever preferred_lft forever

[root@localhost ~]# ping 172.19.0.1
PING 172.19.0.1 (172.19.0.1) 56(84) bytes of data.
64 bytes from 172.19.0.1: icmp_seq=1 ttl=64 time=0.275 ms
64 bytes from 172.19.0.1: icmp_seq=2 ttl=64 time=0.125 ms
64 bytes from 172.19.0.1: icmp_seq=3 ttl=64 time=0.104 ms
^C
--- 172.19.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.104/0.168/0.275/0.076 ms
```

# 再起動

設定した値が正しいことを確認するため、一度ゲスト OS を再起動してみる。
再起動時のブートログが見たいので、ホスト OS からコンソール接続する。

```bash:ホストOS
[udon@kvm_host ~]$ sudo virsh console openstack_ctrl
ドメイン openstack_ctrl に接続しました
エスケープ文字は ^] です
root
パスワード:
最終ログイン: Fri Dec 13 05:36:02  192.168.10.120 から

[root@localhost ~]# shutdown -r now
Rebooting.
[ 1696.516847] Restarting system.
:(省略)
CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64

localhost login:
```

コンソールから抜けるときは ``Ctrl + ]`` を押下。
SSHで接続してIFを確認する。

```bash:ゲストOS
[root@localhost ~]# nmcli dev
デバイス  タイプ    状態                       接続
eth1      ethernet  接続済み                   eth1
eth0.10   vlan      接続済み                   eth0.10
eth0      ethernet  接続中（IP 設定を取得中）  有線接続 1
lo        loopback  管理無し                   --

[root@localhost ~]# nmcli con
名前        UUID                                  タイプ          デバイス
eth0.10     5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth1        4977f7ab-0e84-4cae-8a6d-a9e050880f3b  802-3-ethernet  eth1
有線接続 1  6df789a5-c226-3f68-b5d1-2280a0a55c60  802-3-ethernet  eth0
```

あれ、今度は ``eth0`` が ``有線接続`` になってしまった。

```bash:ゲストOS
[root@localhost ~]# nmcli con del "有線接続 1"
接続 '有線接続 1' (6df789a5-c226-3f68-b5d1-2280a0a55c60) が正常に削除されました。

[root@localhost ~]# nmcli con add type ethernet ifname eth0 con-name eth0
接続 'eth0' (1e5c6e1e-4fc5-427c-99fe-c164501b2748) が正常に追加されました。

[root@localhost ~]# nmcli con mod eth0 connection.autoconnect no
```

再度コンソールから再起動

```bash:ホストOS
[udon@kvm_host ~]$ sudo virsh console openstack_ctrl
ドメイン openstack_ctrl に接続しました
エスケープ文字は ^] です
root
パスワード:
最終ログイン: Fri Dec 13 05:36:02  192.168.10.120 から

[root@localhost ~]# shutdown -r now
Rebooting.
[ 1696.516847] Restarting system.
:(省略)
CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64

localhost login:root
パスワード:
最終ログイン: Fri Dec 13 06:08:02  ttyS0 上

[root@localhost ~]# nmcli con
名前     UUID                                  タイプ          デバイス
eth0.10  5f995a1a-29b4-4366-96f0-d2f00f5e8051  vlan            eth0.10
eth1     4977f7ab-0e84-4cae-8a6d-a9e050880f3b  802-3-ethernet  eth1
eth0     1e5c6e1e-4fc5-427c-99fe-c164501b2748  802-3-ethernet  --

[root@localhost ~]# nmcli dev
デバイス  タイプ    状態      接続
eth1      ethernet  接続済み  eth1
eth0.10   vlan      接続済み  eth0.10
eth0      ethernet  切断済み  --
lo        loopback  管理無し  --
```

完了。

その他気にした方がいいDoc

- [19.11. 物理インターフェースに直接に接続する](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/virtualization_administration_guide/sect-attch-nic-physdev)
    - ホストの物理 IF を エミュレートしてられないぐらい帯域・品質が求められる場合に使用するのかな？