【RHEL】VMをサクッと作りたいんじゃ【KVM】

ちょっと使えるVMがすぐにほしい時用
確認OSはRHEL9.4(GUIインストール)

前提：サブスク

https://qiita.com/dan-go/items/56ad158217521dd27c4b#comment-32c2ba4a11507b163d2a

# 準備

## ネットワーク周りの設定
bondingやbridge、VLANなどあれば

https://qiita.com/dan-go/items/1d888c07261f161dc0c4

## firewalld停止
```console:
[root@host01 ~]# systemctl stop firewalld
[root@host01 ~]# systemctl disable firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
```

## SElinux無効化
```console:
root@host01 ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33
[root@host01 ~]# 
[root@host01 ~]# 
[root@host01 ~]# vi /etc/selinux/config     #"SELINUX=enforcing"を"disabled"に変える
[root@host01 ~]# 
[root@host01 ~]# shutdown -r now
[root@host01 ~]# sestatus
SELinux status:                 disabled
```

## vncserverインストール
WEBブラウザ使いたいので
```console:
[root@host01 ~]# dnf install tigervnc-server

[root@host01 ~]# su - vncuser                 #VNCを使用するユーザーへスイッチ(任意)
[vncuser@host01 ~]$
[vncuser@host01 ~]$ vncpasswd                 #パスワード設定(初回のみ)
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[vncuser@host01 ~]$ 
[vncuser@host01 ~]$ vncserver -list           #何も表示されない

WARNING: vncserver has been replaced by a systemd unit and is now considered deprecated and removed in upstream.
Please read /usr/share/doc/tigervnc/HOWTO.md for more information.

TigerVNC server sessions:

X DISPLAY #	PROCESS ID                        #	:1が存在した場合はkillする。$ vncserver -kill :1

[vncuser@host01 ~]$
[vncuser@host01 ~]$ vncserver -nolisten tcp   #VNCサーバ起動

WARNING: vncserver has been replaced by a systemd unit and is now considered deprecated and removed in upstream.
Please read /usr/share/doc/tigervnc/HOWTO.md for more information.

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
xauth:  file /home/vncuser/.Xauthority does not exist

New 'host01:1 (vncuser)' desktop is host01:1

Creating default startup script /home/vncuser/.vnc/xstartup
Creating default config /home/vncuser/.vnc/config
Starting applications specified in /home/vncuser/.vnc/xstartup
Log file is /home/vncuser/.vnc/host01:1.log

[vncuser@host01 ~]$ 
[vncuser@host01 ~]$ ss -nltp |grep vnc |grep -v "\[::\]"     # ポート590XがLISTENしていること。XはDISPLAY番号と同じになり、ここでは5901。複数起動した場合は5902,5903...
LISTEN 0      5            0.0.0.0:5901      0.0.0.0:*    users:(("Xvnc",pid=10852,fd=9))
[vncuser@host01 ~]$
[vncuser@host01 ~]$ vncserver -list

WARNING: vncserver has been replaced by a systemd unit and is now considered deprecated and removed in upstream.
Please read /usr/share/doc/tigervnc/HOWTO.md for more information.

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		10852
[vncuser@host01 ~]$ 
```

次から本題
# KVM/QEMU/libvirt パッケージインストール
```
# dnf install qemu-kvm
# dnf install libvirt
# dnf install libguestfs-tools
# dnf install virt-install
# dnf install virt-viewer
```
`KVM`: kernelに組み込まれたCPUのハードウェア仮想化機能(Intel VT-xやAMD-Vなど)を利用してVMを操作できる。仮想CPUやメモリを提供するハイパーバイザー化するもの

`QEMU`: ゲストOSからの入出力I/O(DISK、NW)を仮想化する機能を提供するハードウェアエミュレータ。KVMと連携することで、KVMが仮想マシンの命令を直接CPUで実行するため、連携することでVMのパフォーマンスが大幅に向上する

`libvirt`: 仮想マシンの作成、管理、および監視に必要な共通APIを様々な仮想化環境に提供し、統一的な操作を可能にするツールキット(ソフトウェアライブラリ)。QEMU、KVMのほか、VMwareESX,VirtualBox等もサポートしている


```console:
[root@host01 ~]# systemctl status libvirtd
● libvirtd.service - libvirt legacy monolithic daemon
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: disabled)
     Active: active (running) since Sat 2025-02-01 06:59:04 JST; 10s ago
TriggeredBy: ● libvirtd-admin.socket
             ● libvirtd.socket
             ● libvirtd-ro.socket
       Docs: man:libvirtd(8)
             https://libvirt.org/
   Main PID: 136273 (libvirtd)
      Tasks: 22 (limit: 32768)
     Memory: 27.9M
        CPU: 407ms
     CGroup: /system.slice/libvirtd.service
             ├─136273 /usr/sbin/libvirtd --timeout 120
             ├─136376 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
             └─136377 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

 2月 01 06:59:04 host01 systemd[1]: Started libvirt legacy monolithic daemon.
 2月 01 06:59:04 host01 dnsmasq[136376]: started, version 2.85 cachesize 150
 2月 01 06:59:04 host01 dnsmasq[136376]: compile time options: IPv6 GNU-getopt DBus no-UBus no-i18n IDN2 DHCP DHCPv6 no-Lua TFTP no-conntrack ipset au>
 2月 01 06:59:04 host01 dnsmasq-dhcp[136376]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
 2月 01 06:59:04 host01 dnsmasq-dhcp[136376]: DHCP, sockets bound exclusively to interface virbr0
 2月 01 06:59:04 host01 dnsmasq[136376]: reading /etc/resolv.conf
 2月 01 06:59:04 host01 dnsmasq[136376]: using nameserver 192.168.0.1#53
 2月 01 06:59:04 host01 dnsmasq[136376]: read /etc/hosts - 2 addresses
 2月 01 06:59:04 host01 dnsmasq[136376]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
 2月 01 06:59:04 host01 dnsmasq-dhcp[136376]: read /var/lib/libvirt/dnsmasq/default.hostsfile

[root@host01 ~]# systemctl enable libvirtd
[root@host01 ~]# 
[root@host01 ~]# for drv in qemu network nodedev nwfilter secret storage interface; do systemctl start virt${drv}d{,-ro,-admin}.socket; done   #libvirtが提供する各種仮想化リソースのソケットサービスを一括起動
[root@host01 ~]# 
[root@host01 ~]# virsh net-list --all                #defaultでブリッジデバイスが作成される
 名前      状態     自動起動     永続　
---------------------------------------------
 default   動作中   はい (yes)   はい (yes)

[root@host01 ~]# 

[root@host01 ~]# ip a                                #host上のIFでも確認できる
(略)
10: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:7d:6c:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
```

## 仮想化サービスの確認
下2つ以外が成功になっていればOK
```console:
[root@host01 ~]# virt-host-validate
  QEMU: Checking for hardware virtualization                                 : 成功
  QEMU: Checking if device '/dev/kvm' exists                                 : 成功
  QEMU: Checking if device '/dev/kvm' is accessible                          : 成功
  QEMU: Checking if device '/dev/vhost-net' exists                           : 成功
  QEMU: Checking if device '/dev/net/tun' exists                             : 成功
  QEMU: Checking for cgroup 'cpu' controller support                         : 成功
  QEMU: Checking for cgroup 'cpuacct' controller support                     : 成功
  QEMU: Checking for cgroup 'cpuset' controller support                      : 成功
  QEMU: Checking for cgroup 'memory' controller support                      : 成功
  QEMU: Checking for cgroup 'devices' controller support                     : 成功
  QEMU: Checking for cgroup 'blkio' controller support                       : 成功
  QEMU: Checking for device assignment IOMMU support                         : 成功
  QEMU: Checking if IOMMU is enabled by kernel                               : WARN (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)
[root@host01 ~]# 
```
※
IOMMUは、物理PCIデバイスを仮想マシンでそのまま使用できるPCIパススルーと呼ばれる仮想化支援機能で使用する技術。主な警告の原因は以下
・CPU / マザーボードがIOMMU(Intel VT-d / AMD-V)に対応していない
・BIOS / UEFIで上記設定が有効化されていない
・カーネルのIOMMU機能が有効化されていない

secure guestは無視してよい


# Cockpitインストール
RH公式のUIコンソールがあるので使ってみる。
```console:
[root@host01 ~]# dnf install cockpit                       #サーバGUI利用でインストールしている場合は不要
[root@host01 ~]# dnf install cockpit-machines
[root@host01 ~]#
[root@host01 ~]# systemctl enable --now cockpit.socket     #自動起動設定
Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket.
[root@host01 ~]# 
[root@host01 ~]# vi /etc/cockpit/disallowed-users          #"root"の記載をコメントアウトして、CockpitのWeb画面にrootでもアクセスできるようにする
```
ブラウザから "https://hostIP:9090" でアクセスできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/3b5a95f9-179a-be67-704b-e61015ac77e4.png)


# VM作成

ゲストOS用のメディアをダウンロードする(ここでは9.4)

https://access.redhat.com/downloads/content/479/ver=/rhel---9/9.4/x86_64/product-software

isoファイルを`/var/lib/libvirt/boot/`へ配置

## VM作成
### コマンドラインで作成
```
# virt-install \
  --name guest01 \
  --memory 32768 \
  --vcpus 16 \
  --cpu host-passthrough \
  --os-variant rhel9.4 \                       # "osinfo-query os" コマンドで確認できる
  --machine q35 \
  --disk path=/var/lib/libvirt/images/guest01.qcow2,size=480,format=qcow2,bus=virtio \
  --cdrom /var/lib/libvirt/boot/rhel-9.4-x86_64-dvd.iso \
  --network bridge=br0,model=virtio \          # 複数NICを付ける場合は下に行追記
  --graphics vnc,listen=127.0.0.1 \
  --noautoconsole"
```

自動起動設定
```
# virsh autostart guest-vm01
```

### Cockpitから設定
CockpitのコンソールからでもVM作成ができる。
メディアを使う場合、インストールソースはcockpitが動いているホスト上のパスを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/bdd19a96-89a4-f702-1c20-f71717ccb102.png)

## VM設定
作成されると、　`/var/lib/libvirt/images/`にqcow2ファイルができる
```console:
[root@host01 ~]# ls -lh /var/lib/libvirt/images/
合計 5.6G
-rw------- 1 qemu qemu 1001G  2月  3 13:39 guest01.qcow2
```
仮想マシンの画面からそのままVMコンソールがみれるので、そこでポチポチインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/f00f1045-4b7b-4143-bb6a-a6dd530f0379.png)


ホスト側にvnetのIFが作成される
```console:
[root@host01 ~]# ip a
(略)
10: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:7d:6c:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
21: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:9e:c3:b4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe9e:c3b4/64 scope link 
       valid_lft forever preferred_lft forever
```

### virbr0
libvirtが作るホストマシンで動作する仮想BridgeIF。KVMデフォルトネットワーク(192.168.X.0/24)のDHCPサーバとなっているため、VM同士が内部で通信できる他、VMはホストが持つアドレスでソースNAT(192.168.X.1)で外部NWにアクセスできる(外部から直接VMへのアクセスはデフォルトでは不可)

### vnet0
ホスト側で作られる仮想マシン1つ1つに対応するIFで、TAPデバイスとも言われる。
vnetXはVMのNICと紐づき、仮想Bridge(virbr0)を通じて外部NWと通信するorVM同士が通信する
VM(vNIC)が増えるとvnet1,2...とが作成される。


# VM確認
vnet0のアドレスはDHCPで払い出される
```console:
[root@host01 ~]# 
[root@host01 ~]# virsh list --all
 Id   名前         状態
---------------------------
 8    guest01   実行中

[root@host01 ~]# 
[root@host01 ~]# virsh domifaddr guest-vm01
 名前     MAC アドレス     プロトコル     アドレス
-------------------------------------------------------------------------------
 vnet0      52:54:00:9e:c3:b4    ipv4         192.168.122.226/24

[root@host01 ~]# 
[root@host01 ~]# virsh domiflist guest-vm01
 インターフェイス   種類      ソース    モデル   MAC
--------------------------------------------------------------------
 vnet0              network   default   virtio   52:54:00:9e:c3:b4

[root@host01 ~]# 
```

今の状態では、
KVM host → virbr0 → vnet0 → VM NIC
VM → vnet0 → virbr0 → KVM host → 別NW
の通信が可能


# VMログイン
```console:
[root@host01 ~]# 
[root@host01 ~]# ssh 192.168.122.226
root@192.168.122.226's password: 
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Mon Feb  3 13:48:30 2025 from 192.168.122.1
[root@guest01 ~]# 
[root@guest01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:9e:c3:b4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.226/24 brd 192.168.122.255 scope global dynamic noprefixroute enp1s0
       valid_lft 2620sec preferred_lft 2620sec
    inet6 fe80::5054:ff:fe9e:c3b4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@guest01 ~]# 
[root@guest01 ~]# ip r                       #DGWはhost01のvirbr0のアドレス
default via 192.168.122.1 dev enp1s0 proto dhcp src 192.168.122.226 metric 100 
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.226 metric 100 
[root@guest01 ~]# 
[root@guest01 ~]# ping 172.16.0.130          #host01のeth0アドレス
PING 172.16.0.130 (172.16.0.130) 56(84) bytes of data.
64 バイト応答 送信元 172.16.0.130: icmp_seq=1 ttl=64 時間=0.069ミリ秒
64 バイト応答 送信元 172.16.0.130: icmp_seq=2 ttl=64 時間=0.050ミリ秒
^C
--- 172.21.224.130 ping 統計 ---
送信パケット数 2, 受信パケット数 2, 0% packet loss, time 1033ms
rtt min/avg/max/mdev = 0.050/0.059/0.069/0.009 ms
[root@guest01 ~]# 
[root@guest01 ~]# ping 172.16.1.245          #host01から到達できる別のNW
PING 172.16.1.245 (172.16.1.245) 56(84) bytes of data.
64 バイト応答 送信元 172.16.1.245: icmp_seq=1 ttl=254 時間=4.67ミリ秒
64 バイト応答 送信元 172.16.1.245: icmp_seq=2 ttl=254 時間=4.61ミリ秒
64 バイト応答 送信元 172.16.1.245: icmp_seq=3 ttl=254 時間=4.70ミリ秒
^C
--- 172.17.112.245 ping 統計 ---
送信パケット数 3, 受信パケット数 3, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 4.607/4.657/4.701/0.038 ms
[root@guest01 ~]# 
```

https://docs.redhat.com/ja/documentation/red_hat_openstack_platform/17.1/html/creating_and_managing_images/assembly_glance-creating-rhosp-compatible-images-with-rhel-or-windows-iso-files_glance-creating-images#assembly_glance-creating-rhosp-compatible-images-with-rhel-or-windows-iso-files_glance-creating-images


# VM snapshot
```console:
[root@host01 ~]# 
[root@host01 ~]# virsh snapshot-create guest01
ドメインのスナップショット 1738649255 が作成されました 
[root@host01 ~]# 
[root@host01 ~]# virsh snapshot-list guest01
 名前         作成時間                    状態
---------------------------------------------------
 1738649255   2025-02-04 15:07:35 +0900   running

[root@host01 ~]# 
[root@host01 ~]# virsh snapshot-revert guest01 --snapshotname 1738649255
```

# VMに外部から接続可能にする
KVMのデフォルトであるvirbr0ブリッジはNATタイプのため、VM→外NWとVM→KVMホストとVM間では通信ができるが、外NW→VMにアクセスすることはできない。

※以下の手順は一度デフォルトネットワーク(virbr0)で作成されたVMに対して外部から接続させるようにする手順。
VM作成時に指定したい場合は、ホスト側で作成したbridgeデバイスをネットワークに指定すること。
・CUIならvirsh-install時に ` --network bridge=BRIDGE名`を指定して作成
・cockpitなら仮想マシンを作成する前に編集でネットワークをbridgeに変更する

## 0. 状態確認
```console:
[root@host01 ~]# nmcli con
NAME      UUID                                  TYPE      DEVICE   
eth0      f7597c7c-4b7e-358b-8f41-067660cc0174  ethernet  eth0 
lo        218321c6-81e6-4749-9dad-c0f6d98cfdb6  loopback  lo       
virbr0    7e83e49c-b7f4-494c-a696-ecddc4776865  bridge    virbr0   
vnet3     4b773abf-d807-4d62-988c-b154f251e99c  tun       vnet3
...
```

## 1. Bridge Interface (br0) の作成
ホスト上でBridgeIFを作成
```
# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0
```

## 2. 物理IF (eth0) のBridgeへの追加
次に、ホストの物理IFをBridgeIFに追加
```
# nmcli connection add type bridge-slave autoconnect yes con-name br0-port1 ifname eth0 master br0
```

## 3. ホストのIPアドレスをBridgeIF (br0) に移行
ホストのIPアドレスを物理IFからBridgeIFに移行
※ここではbridgeIFにアドレスを設定しているが、bridgeには振らずにVM接続だけさせるパターンもある
```
# nmcli connection modify br0 ipv4.addresses 172.16.0.130/24 ipv4.gateway 172.16.0.254 ipv4.dns 192.168.1.1 ipv4.method manual
# nmcli connection up br0
# nmcli connection down eth0          #アドレスが重複するのですぐに落とす
```
`br0`が作成されている
```console:
[root@host01 ~]# nmcli con
NAME       UUID                                  TYPE      DEVICE   
br0        bbee405e-45aa-452f-9423-84619e79a371  bridge    br0      
br0-port1  c7cc0ae5-7e21-4887-a282-d15b631308ad  ethernet  eth0
lo         218321c6-81e6-4749-9dad-c0f6d98cfdb6  loopback  lo       
virbr0     7e83e49c-b7f4-494c-a696-ecddc4776865  bridge    virbr0   
vnet0      4b773abf-d807-4d62-988c-b154f251e99c  tun       vnet0    
```

## 4. VM のネットワーク設定変更
VMのネットワークインターフェイスをvirbr0からbr0に変更する

`仮想マシン→ネットワークインターフェースの追加`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/4c7c5b1f-4950-59b4-d9aa-6eff3492fb51.png)
または既に付与されているIFを編集してbr0に変更する。

CUIの場合は、
```
virsh edit guest01
```
interfaceのセクションを変更する。既にtype=networkでdefaultが付いているはずなので、その下に追記する

```xml:virsh edit guest01
<interface type='bridge'>
  <source bridge='br0'/>
  <model type='virtio'/>
</interface>
```
これで完了

### (OMAKE)★VMにアタッチする仮想ネットワーク
`Bridge to LAN`
 → VMのNICを直接ブリッジに接続。L2トラフィックを物理に流したい時
 
`Virtual network`
 → libvirt管理の仮想ネットワークを経由して接続する

### xmlファイルを作成してVirtualNetworkを定義する
KVMに作成したbridgeを認識させる

```br0-network.xml
<network>
  <name>br0-network</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
```
```console:
[root@host01 ~]# 
[root@host01 ~]# virsh net-define br0-network.xml
ネットワーク br0-network が br0-network.xml から定義されました

[root@host01 ~]# 
[root@host01 ~]# virsh net-autostart br0-network
ネットワーク br0-network が自動起動に設定されました

[root@host01 ~]# virsh net-start br0-network
ネットワーク br0-network が起動されました

[root@host01 ~]# 
[root@host01 ~]# virsh net-list --all
 名前          状態     自動起動     永続
-------------------------------------------------
 default       動作中   はい (yes)   はい (yes)
 br0-network   動作中   はい (yes)   はい (yes)
 
[root@host01 ~]# 
```
### virsh edit コマンドでVMのネットワークを定義したものに修正する

```xml:# virsh edit guest01
<interface type='network'>
  <source network='br0-network'/>
  <model type='virtio'/>
</interface>
```

VM作成時に `--network network=br0-network` と指定 → br0-networkがブリッジbr0と紐づいている

### VMへログイン
```console:
[root@guest01 ~]# ip a   #enp7s0というIFが新規にアタッチされている
(略)
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:09:05:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.226/24 brd 192.168.122.255 scope global dynamic noprefixroute enp1s0
       valid_lft 2990sec preferred_lft 2990sec
    inet6 fe80::5054:ff:fe09:5d4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
5: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:08:b3:58 brd ff:ff:ff:ff:ff:ff
[root@guest01 ~]# 
[root@guest01 ~]# nmcli connection add type ethernet con-name enp7s0 ifname enp7s0 ipv4.method manual ipv4.addresses 172.16.0.226/24 ipv4.gateway 172.16.0.254    #アドレス付与
接続 'enp7s0' (7e582403-2a6e-49b7-89c1-4ec30be729d3) が正常に追加されました
[root@guest01 ~]# 
[root@guest01 ~]# ip a                    #アドレスが付いている
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:09:05:d4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.226/24 brd 192.168.122.255 scope global dynamic noprefixroute enp1s0
       valid_lft 2863sec preferred_lft 2863sec
    inet6 fe80::5054:ff:fe09:5d4/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
5: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:08:b3:58 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.226/24 brd 172.21.224.255 scope global noprefixroute enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::efbc:535:2883:38b1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@guest01 ~]# 
[root@guest01 ~]# 
[root@guest01 ~]# ip r                 #DGWが2つ登録されている.192.168.122.1のエントリを削除
default via 192.168.122.1 dev enp1s0 proto dhcp src 192.168.122.226 metric 100 
default via 172.16.0.254 dev enp7s0 proto static metric 101 
172.16.0.0/24 dev enp7s0 proto kernel scope link src 172.16.0.226 metric 101 
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.226 metric 100 
[root@guest01 ~]# 

```
### (option)defaultのnetworkを削除
Cockpitからdefaultのnetwork(192.168.122.226)を削除
アドレスとともにDGWも削除され、VMにホストが持つNWのアドレスを付与外のNWからbr0経由でVMへ通信させることができる
```console:
[root@guest01 ~]# 
[root@guest01 ~]# ip a
2: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:08:b3:58 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.226/24 brd 172.21.224.255 scope global noprefixroute enp7s0
       valid_lft forever preferred_lft forever
    inet6 fe80::efbc:535:2883:38b1/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@guest01 ~]# 
[root@guest01 ~]# ip r
default via 172.16.0.254 dev enp7s0 proto static metric 100 
172.16.0.0/24 dev enp7s0 proto kernel scope link src 172.16.0.226 metric 100 
[root@guest01 ~]# 
```

ついでにホスト側から`virbr0(192.168.122.1)`自体を抹消
```console:
[root@host01 ~]# 
[root@host01 ~]# virsh net-list
 名前           状態     自動起動     永続
---------------------------------------------
 default       動作中   はい (yes)   はい (yes)
 br0-network   動作中   はい (yes)   はい (yes)
 
[root@host01 ~]# 
[root@host01 ~]# virsh net-destroy default
ネットワーク default は強制停止されました

[root@host01 ~]# 
[root@host01 ~]# virsh net-list
 名前           状態     自動起動      永続
---------------------------------------------
 br0-network   動作中   はい (yes)   はい (yes)
 
[root@host01 ~]# 
[root@host01 ~]# virsh net-undefine default
ネットワーク default の定義が削除されました
```

ホストのIPから`virbr0`が表示されなくなる。

いじょ

# 参考
https://gihyo.jp/admin/serial/01/ibm_kvm/0003