Ubuntu Weekly Recipe

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

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

SPICEは仮想マシン上のディスプレイと通信するためのプロトコルです。SPICEプロトコルに対応したクライアントをいくつか紹介しましょう。

SPICEを有効化した仮想マシンを起動する

SPICEは仮想マシン上のディスプレイ・入力デバイスとローカルマシン上のクライアントの中を取り持つプロトコルです。グラフィックデバイスとしてQXLを指定した仮想マシンを立ち上げることで,仮想マシン内部のグラフィックドライバーであるQXLドライバーとSPICEサーバーが連携し,SPICEクライントがネットワーク越しにSPICEサーバーと通信することで,リモートの仮想マシンの画面をクライアント側で表示できます※1⁠。VMWareのvSphereクライアントにある,リモートの画面を表示する仕組みだと考えれば良いでしょう。

※1
SPICEにおいてQXLが必須というわけではありません。PCIパススルーなどで実デバイスを仮想マシンに見せる場合は,QXLを使わなくてもSPICEプロトコルを利用可能です。また,仕組み上はQEMUである必要もなく,他の仮想マシンシステムでもSPICEサーバー(libspice-server)を利用するよう修正すれば,SPICEに対応することは可能なはずです。

SPICEでは単に画面のやりとりだけでなく,⁠Virtual Device Interface(VDI⁠⁠」として実デバイス・仮想デバイス自身もネットワーク越しに操作できるプロトコルを定義しています。これによりリモートの仮想マシン上のオーディオをクライアント側で再生・録音したり,クライアント側にあるUSBデバイスを仮想マシン上で認識することも可能になります。

まずはSPICEに対応したQEMUインスタンスを構築しましょう。といってもQEMUコマンドに渡すオプションを変えるだけで,基本的な手順は第592回「QEMUでGPUの3Dアクセラレーションを利用する」と同じです。もちろんSPICEなしで構築した上で,あとからSPICEを有効化してもかまいません。よって第592回で構築したイメージを流用する方法もあります。

リモート側にQEMUを動かすための諸々をインストールしておきます。

$ sudo apt install qemu-system-x86 qemu-utils
$ sudo adduser $USER kvm

CPUの仮想化支援機構を使いたいなら,kvmグループに所属しておく必要があります。環境やインストールしたパッケージによっては最初から所属しているかもしれません。もしQEMUコマンド実行時に「権限がない」旨のエラーが出るようなら,上記のように明示的に所属したあとに,ログインしなおしてください。

新規にイメージを構築するなら,空のイメージファイルを作っておきましょう。

$ qemu-img create -f qcow2 ubuntu.qcow2 20G

UEFI対応のイメージにしたいなら,第441回「QEMU/KVMでUEFIファームウェアを使う」を参考に,OVMFもインストールしておきます。

$ sudo apt install ovmf
$ cp /usr/share/OVMF/OVMF_VARS.fd vars.fd

Ubuntuをインストールするなら,次のように実行します。

$ qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -drive format=qcow2,file=ubuntu.qcow2,if=virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -machine vmport=off \
    -vga qxl \
    -spice port=5900,disable-ticketing \
    -boot once=d -no-reboot -cdrom ubuntu-19.10-desktop-amd64.iso

UEFIに対応させるなら次のように実行します。

$ qemu-system-x86_64 \
    -enable-kvm -M q35 -smp 2 -m 4G \
    -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
    -drive if=pflash,format=raw,file=vars.fd \
    -drive format=qcow2,file=ubuntu.qcow2,if=virtio \
    -net nic,model=virtio \
    -net user,hostfwd=tcp::2222-:22 \
    -machine vmport=off \
    -vga qxl \
    -spice port=5900,disable-ticketing \
    -boot once=d -no-reboot -cdrom ubuntu-19.10-desktop-amd64.iso

第592回と異なるのは次の4点です。

  • -machine vmport=offが追加された
  • -vga virtioの代わりに-vga qxlになった
  • -display gtk,grab-on-hover=on,gl=onがなくなった
  • -spice port=5900,disable-ticketingが追加された

最初のvmport=offはVMWareのI/Oポートのエミュレーションを無効化しています。SPICE上のマウス処理と相性が悪いようです。

QXLはSPICE用のグラフィックデバイスです。これとSPICEを組み合わせることで,高速なリモートデスクトップ環境を構築できます。

今回はリモートデスクトップを前提としているため,ローカルの仮想マシンウィンドウを立ち上げる-displayオプションは使っていません。

最後の-spiceオプションが今回のポイントです。port=5900でその仮想マシンのSPICEサーバーへの接続ポートを設定します。つまり複数のマシンを立ち上げるなら,それぞれ異なる値にします。addr=オプションを使うことで,bind()するアドレスを指定できます。何も指定しないとANYになるので,そのマシン上のすべてのインターフェース経由でアクセスできることになります。

disable-ticketingはこのあと紹介するSPICEクライントが接続する際に,⁠認証を行わない」よう設定しています。つまり仮想マシンが動いているサーバーの5900番ポートに接続できる人なら誰でもその仮想マシンの画面にアクセスできるという状態です。単純にパスワード認証したいのであればdisable-ticketingの代わりにpassword=パスワードを指定してください。X.509やSASLによる認証もサポートしています。

アドレスや認証関連はWAN経由でSPICEを使いたい場合に,特に必要になってきます。また経路をTLSで暗号化する方法も存在します。これらのオプションについてはqemu-systemのマニュアルを参照してください。

仮想マシンが立ち上がったので,あとはこれから紹介するクライアントで接続するだけです。ここからは仮想マシンのホストのアドレスが「vmserver.local」である前提で説明します。ポート番号とセットで「vmserver.local:5900」「SPICEアドレス」と呼ぶことにします。適宜,各自のホスト名やIPアドレス,ポート番号などに読み替えてください。

著者プロフィール

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

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