ちょっと使えるVMがすぐにほしい時用
確認OSはRHEL9.5(GUIインストール)
前提:サブスク
準備
firewalld停止
[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無効化
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ブラウザ使いたいので
[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や他の仮想インフラの管理を容易にする
[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
[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コンソールがあるので使ってみる。
[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" でアクセスできる
画面がとてもRedhatっぽい
VM作成
ゲストOS用のメディアをダウンロードする(ここでは9.4)
isoファイルを/var/lib/libvirt/boot/
へ配置
CockpitのコンソールからVM作成。ラク
インストールソースはcockpitが動いているホストからアップロードできる
作成されると、 /var/lib/libvirt/images/
にqcow2ファイルができる
[root@host01 ~]# ls -lh /var/lib/libvirt/images/
合計 5.6G
-rw------- 1 qemu qemu 1001G 2月 3 13:39 guest01.qcow2
仮想マシンの画面からそのままVMコンソールがみれるので、そこでポチポチインストール
ホスト側にvnetのIFが作成される
[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。NATを使用してホストマシン経由で外部NWにアクセスできる(外部から直接VMへのアクセスはデフォルトでは不可)他、virbr0にはホストマシンが管理するIPアドレスが割り当てられているため、VM同士が内部で通信できる。
vnet0
仮想マシン1つ1つに対応するIFで、TAPデバイスとも言われる。
vnetXはVMのNICと紐づき、仮想Bridge(virbr0)を通じて外部NWと通信するorVM同士が通信する
VM(vNIC)が増えるとvnet1,2...とが作成される。
VM確認
vnet0のアドレスはDHCPで払い出される
[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ログイン
[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 ~]#
VM snapshot
[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から外のネットワークとホストとVMの間では通信ができるが、外部ホストからVMにアクセスすることはできない。
※はじめからやるなら、先にホスト側で以下設定してからVMを作成したほうがいいかも
[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に移行
# 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
が作成されている
[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に変更
仮想マシン→ネットワークインターフェースの追加
でもできるが、virshでの操作ができなくなるので以下のコマンドから行う。
xmlファイルを作成してNWを定義する
<network>
<name>br0-network</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
[root@host01 ~]#
[root@host01 ~]# vi br0-network.xml
[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のネットワークを定義したものに修正する
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
これでvirsh操作もでき、VMにbr0がアタッチされる
VMへログイン
[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 ~]#
defaultのnetworkを削除
Cockpitからdefaultのnetwork(192.168.122.226)を削除
アドレスとともにDGWも削除され、VMにホストが持つNWのアドレスを付与外のNWからbr0経由でVMへ通信させることができる
[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)
自体を抹消
[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
が表示されなくなる。
いじょ