なにかの技術メモ置き場

なにかの技術メモ置き場

@インフラエンジニア

KVMゲストマシンにVNC接続する

f:id:none06:20210114020101p:plain

目的

KVMゲストマシンにVNC接続したい。

ユースケース

・ゲストマシンにOSをインストールしたいが、インストーラGUIの場合。
PXEブート後にメニュー画面で選択操作が必要な場合。
・その他、「virsh console」で接続したものの何も見えない/操作できない場合。

環境

ゲストマシン OS
guest01 (ANY)
ホストマシン OS
kvm01 CentOS8

手順

定義ファイルをバックアップする。

[root@kvm01 ~]# cp -p /etc/libvirt/qemu/guest01.xml{,_$(date +%Y%m%d)}
[root@kvm01 ~]# ls -l /etc/libvirt/qemu/guest01.xml*
-rw-------. 1 root root 3679  3月 25 23:44 /etc/libvirt/qemu/guest01.xml
-rw-------. 1 root root 3679  3月 25 23:44 /etc/libvirt/qemu/guest01.xml_20200325

定義ファイルを編集する。

[root@kvm01 ~]# virsh edit guest01

以下を然るべき場所に挿入する。

  • ポート番号を固定する場合
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
  • ポート番号を自動割り当てする場合(5900~)
    <graphics type='vnc' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>

文法は全く調べていない。おそらくdevicesディレクティブ内であればどこでも良さそう。
今回はvideoディレクティブの上に挿入した。

<domain type='kvm'>
・・・
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>

保存して閉じる。

ドメイン guest01 XML の設定は編集されました

この時点ではまだLISTENしていない。

[root@kvm01 ~]# netstat -ant | grep 590

ゲストマシンを起動する。
※起動していた場合、停止してから起動する。

[root@kvm01 ~]# virsh start guest01
ドメイン guest01 が起動されました

ここでLISTENし始める。

[root@kvm01 ~]# netstat -ant | grep 590
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN

これでVNC接続できる・・・と思いきや、ホストマシンのファイアウォールを開け忘れていた。

[root@kvm01 ~]# firewall-cmd --list-services
cockpit dhcpv6-client ssh
[root@kvm01 ~]# firewall-cmd --add-service=vnc-server
success
[root@kvm01 ~]# firewall-cmd --add-service=vnc-server --permanent ※恒久的に開ける場合
success
[root@kvm01 ~]# firewall-cmd --list-services
cockpit dhcpv6-client ssh vnc-server

これで今度こそOK。

補足

ちなみに、「vnc-server」というサービス名からでは、何のプロトコルの何番ポートが開いているか読み取れない。以下で確認できる。

[root@kvm01 ~]# cat /usr/lib/firewalld/services/vnc-server.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Virtual Network Computing Server (VNC)</short>
  <description>A VNC server provides an external accessible X session. Enable this option if you plan to provide a VNC server with direct access. The access will be possible for displays :0 to :3. If you plan to provide access with SSH, do not open this option and use the via option of the VNC viewer.</description>
  <port protocol="tcp" port="5900-5903"/>
</service>

vnc-serverはレンジで開いている珍しい例。

参考サイト

-