[Debian][KVM] 仮想マシンはVNC接続で

その後 kvm を使っていろいろ不便なこともあり、当初の使用手順を変更することにした。

仮想マシンマネージャ(virt-manager)を止めた

virt-manager は、まだ使い勝手が悪いように思う。前にも書いたように usb を使用するのに面倒な手順が要る。またゲストOSをSXGA(1280x1024)で表示する際に不便なことも多い。

そこで virt-manager は止めて、kvm から直接に VNC 接続を行うようにした。起動スクリプトは以下のよう(一部抜粋)。

...
MONITOR=telnet::${PORT},server,nowait
VNC=:1
...
/usr/bin/kvm
	-name ${IMAGENAME} \
	-net nic,vlan=0,macaddr=${MACADDR} \
	-net tap,vlan=0,ifname=tap0 \
	-boot c \
	-smp ${CPUS} \
	-cdrom ${CDROM} \
	-m ${MEMSIZE} \
	-hda ${IMAGE} \
	-usb \
	-localtime \
	-usbdevice tablet \
	-vnc ${VNC} \
	-k ja \
	-monitor ${MONITOR}\
	-pidfile ${PIDFILE} \
	-daemonize

ここで

  • -daemonize は、daemon として起動し、VNCクライアントからの接続を待つため。
  • -monitor は、telnet でローカル接続する。後でスムーズにシャットダウンする際に重宝する。
  • -vnc の「:1」はVNCディスプレイ番号で、実際には5900+1番ポートを listen する。
  • -usbdevice tablet は、Windows のゲストOSに接続するために必要で、これがないとマウスポインタがおかしくなる。
  • -k ja は、キーボードを日本語にするため。
  • -pidfile は、このスクリプトを /etc/init.d/ において使用しているため。

VNC クライアント

lenny で使用できる VNCクライアントはいくつかあるようだが、xvnc4viewer が今のところ使い勝手が一番良い。

$ vncviewer localhost:1

Windows(ゲストOS)のシャットダウン

ゲストOSがWindowsである場合、上記のkvmデーモンをkillしてシャットダウンするのは気持ちが良くない。電源の遮断と変わらない。ゲストOSでシャットダウンすれば良いというものだが、ホストOSを落とす時に少し煩わしい。遊びも兼ねてリモートシャットダウンを試みる。

リモートシャットダウン(ローカルマシン上ではあるが)するために、上記で開いたtelnetのモニタに接続する。

$ telnet localhost 5899
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
QEMU 0.12.4 monitor - type 'help' for more information
(qemu) system_powerdown

「(qemu)」がモニタのプロンプト。ここでは、モニタのポート(上記の${PORT}変数)を5899に設定している。今はセキュリティーを無視しているが、ファイアウォールを適宜、設定することが必要。

ここで「quit」コマンドを打つと仮想マシンは落ちるが、それではデーモンのkillと変わらないので、「system_powerdown」コマンドを使う。ゲストOS側が対応していれば、スムーズにシャットダウンが行われる。