KVMでWindowsServer2016VMを作成してvncでつなぐまでのメモ

意外にまとまった日本語に記事が無いのでメモ
ホストOSはCentos7です。

参考：
https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7
↑ブリッジネットワークのところはほとんどそのままです！ありがとうございます！
https://2502.net/kvm-ubuntu-linux-18-04-windows-server-2016-headless-cli/
https://mseeeen.msen.jp/make-virtual-machine-with-kvm-in-centos-7/

## 1.まずKVMをインストール
```
yum -y install libguestfs libvirt libvirt-client python-virtinst qemu-kvm virt-manager virt-top virt-viewer virt-who virt-install bridge-utils

[root@localhost iso]# lsmod | grep kvm
kvm_intel             188644  0 
kvm                   621480  1 kvm_intel
irqbypass              13503  1 kvm

```

## 2.libvirtdの起動
```
[root@localhost iso]# systemctl start libvirtd
[root@localhost iso]# systemctl enable libvirtd
```

## 3.ブリッジネットワークの作成
```
ブリッジネットワークの作成
バックアップ
# cp /etc/sysconfig/network-scripts/ifcfg-enp10s0 /root

[root@localhost ~]# nmcli d s
DEVICE      TYPE      STATE         CONNECTION 
enp10s0     ethernet  connected     enp10s0    
virbr0      bridge    connected     virbr0     
enp11s0     ethernet  disconnected  --         
enp12s0     ethernet  disconnected  --         
enp13s0     ethernet  disconnected  --         
enp14s0     ethernet  disconnected  --         
enp15s0     ethernet  disconnected  --         
enp16s0     ethernet  disconnected  --         
enp17s0     ethernet  disconnected  --         
enp18s0     ethernet  disconnected  --         
enp9s0      ethernet  disconnected  --         
enp1s0f0    ethernet  unavailable   --         
enp1s0f1    ethernet  unavailable   --         
lo          loopback  unmanaged     --         
virbr0-nic  tun       unmanaged     --  

デバイス名br0というブリッジをnmcli c aコマンドで作成します。
作成した後nmcli c sコマンドで確認するとbridge-br0が追加されています。
作成したbridge-br0のスパニングツリーの設定を無効にします。
そして、bridge-br0のIPアドレスを先程調べたIPアドレス10.10.5.200/16に設定し、
ゲートウェイ、DNSサーバの設定をします。

[root@localhost ~]# nmcli c m virbr0 ipv4.method manual ipv4.addresses 10.10.5.200/16
[root@localhost ~]# systemctl restart network
[root@localhost ~]# 
[root@localhost ~]# ifup virbr0
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10)
[root@localhost ~]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: enp10s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.10.2.141/16 brd 10.10.255.255 scope global noprefixroute enp10s0
       valid_lft forever preferred_lft forever
14: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    inet 10.10.5.200/16 brd 10.10.255.255 scope global noprefixroute virbr0
       valid_lft forever preferred_lft forever


# デバイス名br0というブリッジを作成
$ nmcli connection add type bridge ifname br0
接続 'bridge-br0' (ae86c45c-7740-4433-90f3-8e9f4354905b) が正常に追加されました。

# 接続情報の表示をすると、DEVICE名br0、接続名bridge-br0が追加されている。
[root@localhost ~]# nmcli connection add type bridge ifname br0
Connection 'bridge-br0' (6f9beae9-c703-4df4-bf2e-621d6b1c4b23) successfully added.
[root@localhost ~]# nmcli d s
DEVICE      TYPE      STATE                                  CONNECTION 
enp10s0     ethernet  connected                              enp10s0    
virbr0      bridge    connected                              virbr0     
br0         bridge    connecting (getting IP configuration)  bridge-br0

# bridge-br0のスパニングツリーが有効になっている
[root@localhost ~]# nmcli connection show bridge-br0 | grep bridge.stp
bridge.stp:                             yes

# bridge-br0のスパニングツリーを無効にする
[root@localhost ~]# nmcli connection modify bridge-br0 bridge.stp no

# bridge-br0のスパニングツリーが無効になっている
[root@localhost ~]# nmcli connection show bridge-br0 | grep bridge.stp
bridge.stp:                             no

# bridge-br0のIPアドレス、ゲートウェイ、DNSサーバの設定をします。
# IPアドレスは先程調べた値を指定します。
$ nmcli connection modify bridge-br0 ipv4.method manual ipv4.addresses "10.10.2.141/16" ipv4.gateway "10.10.0.254" ipv4.dns "8.8.8.8"


ブリッジbridge-br0に物理インターフェースenp10s0を追加します。
もともとenp10s0が接続していたenp10s0は削除してしまいます。

# ブリッジbridge-br0にデバイスenp10s0を接続タイプbridge-slaveとして追加する
[root@localhost ~]# nmcli connection add type bridge-slave ifname enp10s0 master bridge-br0
Connection 'bridge-slave-enp10s0' (32e616ed-f209-46b7-842c-92538f281787) successfully added.

# 接続の一覧表示。bridge-br0が追加されています。

[root@localhost ~]# nmcli c s
NAME                  UUID                                  TYPE      DEVICE  
bridge-br0            6f9beae9-c703-4df4-bf2e-621d6b1c4b23  bridge    br0     
enp10s0               bc1f0354-a0d4-4e41-91fc-3d420d6fd5db  ethernet  enp10s0 
virbr0                82b3ea70-e0cf-4b05-a709-c42f4b40c1ab  bridge    virbr0  
bridge-slave-enp10s0  32e616ed-f209-46b7-842c-92538f281787  ethernet  --      
enp11s0               cc812463-8cc9-43a2-9845-807e0318780a  ethernet  --      
enp12s0               4cc7705d-b94c-4ead-8673-922342d8fb24  ethernet  --      
enp13s0               fd0fdf28-2fc3-446a-9419-eb081486959b  ethernet  --      
enp14s0               eaa2d0ad-6332-481c-aa63-6fc92421c924  ethernet  --      
enp15s0               a92d0934-20d5-4b0b-ba9e-039b9f3b618f  ethernet  --      
enp16s0               2e914514-77bc-4a8f-925e-d4f4a71710c7  ethernet  --      
enp17s0               bf9421de-43fb-4e87-b433-86a9735f85ce  ethernet  --      
enp18s0               7cee26d1-1bcc-4bbb-85b4-70f169912f5e  ethernet  --      
enp1s0f0              6d8b2af8-d300-4fae-9daf-5d90c482dc4f  ethernet  --      
enp1s0f1              d36f84d1-2cb7-4d9f-bcb8-827e95306c61  ethernet  --      
enp9s0                fe4db18c-6d86-4a5e-aa0e-677a161800aa  ethernet  --

# 不要になったenp10s0を削除します。
[root@localhost ~]# nmcli connection delete enp10s0
Connection 'enp10s0' (bc1f0354-a0d4-4e41-91fc-3d420d6fd5db) successfully deleted.

# bridge-slave-enp7s0という接続が出来ていて、enp7s0が接続されています。
$ nmcli connection show 
NAME                 UUID                                  TYPE      DEVICE 
bridge-br0           ae86c45c-7740-4433-90f3-8e9f4354905b  bridge    br0    
bridge-slave-enp7s0  4686b212-a687-463f-ba8e-0f0d42bad827  ethernet  enp7s0 
virbr0               1244d4ca-0688-48ae-8bbf-bf199c197c1e  bridge    virbr0 

現在のゲストOSのインターフェースvnet0はvirtbr0に接続されています。
これをbr0に接続するように変更します。
[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.006bf16ff424       no              enp10s0
virbr0          8000.5254006164ca       yes             virbr0-nic



モジュールのインストール
ブリッジデバイス経由のパケットにiptablesの適用を行わない設定をします。
[root@localhost ~]# tail  /etc/sysctl.conf
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

[root@localhost ~]# modprobe br_netfilter
[root@localhost ~]# modprobe bridge
[root@localhost ~]# lsmod | grep bridge
bridge                151336  0 
stp                    12976  1 bridge
llc                    14552  2 stp,bridge
[root@localhost ~]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

```

## 4. WindowsVMインストール
```
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                  79G     0   79G   0% /dev
tmpfs                     79G     0   79G   0% /dev/shm
tmpfs                     79G  571M   78G   1% /run
tmpfs                     79G     0   79G   0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   13G   38G  25% /
/dev/sda1               1014M  151M  864M  15% /boot
/dev/mapper/centos-home  224G   33M  224G   1% /home
tmpfs                     16G     0   16G   0% /run/user/0
[root@localhost ~]# virt-install \
--name win2016 \
--ram 16384 \
--disk path=/home/win2016/win2016.img,size=50,sparse=true \
--vcpus 4 \
--os-type windows \
--network bridge=br0 \
--cdrom /var/lib/libvirt/images/Win2016.ISO \
--vnc \
--vncport=5901 \
--vnclisten=0.0.0.0
```

## 5.WindowsServerVMにつないでみる
先にVNCビュアーをダウンロードしておきます
https://www.realvnc.com/en/connect/download/viewer/

```
ポートフォワード
踏み台へ
ssh fumidai@xx.xx.xx.xx -L 59001:localhost:5901
HVへ
ssh root@[hostのip] -L 5901:localhost:5901
```

踏み台なくても接続できる場合は、直接5901番にポートフォワードしてください。

これで手元からWindowsVMへ接続できるようになる