Ubuntu Weekly Recipe

第595回 リモートデスクトップのためのSPICEクライアントあれこれ

この記事を読むのに必要な時間:およそ 5.5 分

Android版の「aSPICE」

Android版のSPICEクライアントとしてはbVNCやaRDPと同じ開発者が作っているaSPICEが存在します。ソースコードはbVNCやaRDPと共通化できるものは共通化しているようなので,ほぼ同じように使えるはずです。

図6 小さなスマートフォンでも画面の拡大・縮小ができるのでそれなりに使える

画像

PCを動かせない環境でどうしてもリモートにあるデスクトップ環境にアクセスしなくてはならない際に便利かもしれません。

ただしマウスをサーバーモードで動かさないと,何かクリックするたびにエラーダイアログが表示されます。次項の内容を参考に,spice-vdagentを有効化してください。

spice-vdagentを利用して高機能化

spice-vdagentを利用すると,SPICEプロトコルを経由して次のような機能が使えます。

  • クリップボードの共有
  • クライアントウィンドウサイズに基づいた画面解像度の自動変更
  • マウスカーソルがクライアントウィンドウに奪われないモードの有効化

spice-vdagentを利用するためにはゲスト側にspice-vdagentパッケージをインストールする必要があります。ただしUbuntuデスクトップなら最初からインストールされているので,特に対応する必要はありません。

もうひとつ必要なのが,仮想マシン側の設定の変更です。SPICEクライアントとゲストOS上のspice-vdagentが通信できるよう,QEMUコマンドに追加のオプションが必要になるのです。そこで仮想マシンを次のコマンドで起動し直しましょう。

$ qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -drive format=qcow2,file=ubuntu-bios.qcow2,if=virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -machine vmport=off \
    -vga qxl \
    -spice port=5900,disable-ticketing \
    -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent \
    -device virtserialport,chardev=vdagent,name=com.redhat.spice.0

追加されたのは最後の2行です。virtio-serialデバイスを作っています。ゲストOS上のspice-vdagentはこのデバイスを経由して,外のプログラム(たとえばSPICEクライアント)と通信するのです。さらにspicevmcデバイスに接続するキャラクターデバイスを「vdagent」という名前で作成しています。vdagentのキャラクターデバイスは,ゲストから見るプロパティ名として「com.redhat.spice.0」を持っています。これによりゲスト上のspice-vdagentは,このデバイスがspice-vdagent用であることがわかるようになっているのです。

図7 spice-client-gtkだとウィンドウ左下でspice-vdagentが使えるかどうかを判別できる

画像

spice-vdagentが有効化されたので,たとえば任意の文字列をローカルからリモートに,リモートからローカルにコピー&ペーストできるか試してみましょう。

さらにローカルのNautilusから,SPICEクライアント上にドラッグ&ドロップするとリモートのダウンロードディレクトリーにコピーされるようです。

たとえばRemminaならウィンドウ左にある設定アイコンの「Resize guest to match window size」を,spice-client-gtkならメニューの「Option」にある同様のメニューを選択しておくと,クライアントのウィンドウに合わせて画面解像度を変更してくれます。

USBのリダイレクト機能

最後にUSBのリダイレクト機能を紹介しましょう。QEMUで仮想マシンを起動する際に,USB用のチャンネルを作成すると,SPICEクライアント経由で「クライアントのホストマシンにつながっているUSBデバイス」「ゲストOS上に接続したように見せる」ことが可能になります。

仮想マシン起動時のオプションがさらに長くなります。

$ qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -drive format=qcow2,file=ubuntu-bios.qcow2,if=virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -machine vmport=off \
    -vga qxl \
    -spice port=5900,disable-ticketing \
    -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent \
    -device virtserialport,chardev=vdagent,name=com.redhat.spice.0 \
    -device nec-usb-xhci,id=usb \
    -chardev spicevmc,name=usbredir,id=usbredirchardev1 \
    -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 \
    -chardev spicevmc,name=usbredir,id=usbredirchardev2 \
    -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \
    -chardev spicevmc,name=usbredir,id=usbredirchardev3 \
    -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3

ここまでくるとQEMUコマンドよりは,素直にvirt-managerを使うほうがはるかに簡単です。ただ,一度はQEMUで起動しておくと,virt-managerの設定の際にどんなオプションを渡すべきかの勘所がわかりやすくなります。

追加されたのは最後の7行です。2行目以降は,2行ごとにUSBデバイス用ポートとなります。今回は3ポート作っているので,3個のUSBデバイスを接続可能というわけです。

たとえばRemminaだと,左のカスタマイズアイコンから「Select USB devices for redirection」を選択すると,どのUSBデバイスをリモート仮想マシンにリダイレクトするかを選択できます。

図8 このときポートを1個しか作らなかったため「1 free channel」と表示されている

画像

選べるのは「ホストで使われていないUSBデバイス」です。たとえばUSBメモリーなどは接続したら自動的にマウントされてしまい「使用中」の状態になってしまうため,リダイレクションしたければあらかじめアンマウントしておいてください。

デバイスを選択して「閉じる」ボタンを押すと,リモートの仮想マシン側でそのUSBデバイスを認識してくれるはずです。

図9 ローカルマシンのウェブカメラをリモートで使った例

画像

ネットワーク越しにUSBデバイスを使う以上,帯域や遅延にシビアなUSBデバイスは使いづらいですが,それらに目をつぶれば大抵のUSBデバイスはなんとか使えます。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。