今月のニッチネタ。 タイトルの通り手元のWSLからリモートのLXDのデスクトップの画面を表示したい。 LXDというのはCanonical社が出しているコンテナと仮想マシンを管理するソフトウェアである。
結論から書くと * sshするユーザをlxdグループに所属させる * sshするときにUnixドメインソケットを転送する * virt-managerもしくはspice-client-gtkで接続する
LXDではVNCがサポートされていない
LXD 4.4くらいから?VNCのサポートがおわりSPICEだけになったようだ。
VNCならクライアントもおおくて5900/tcpをポートフォワードすればいいだけなのだが、SPICEはあまり情報がなくて少しハマってしまった。
LXDでグラフィカルなコンソールに接続する場合は以下のコマンドを実行する。
lxc console <vm name> --type vga
このコマンドを実行すると以下のような出力がされる。
LXD relies on either remote-viewer or spicy to provide VGA console access. Those can't be bundled with the LXD snap and so need to be manually installed. - "remote-viewer" usually comes in a package called virt-viewer - "spicy" usually comes in a package called spice-client-gtk Install either of those and they will automatically start. Alternatively you may use another SPICE client using the following URI: spice+unix:///<home dir>/snap/lxd/common/config/sockets/4203575398.spice
.spiceとなっているファイルはUnixドメインソケットになっているので、ここに対してSPICEクライアントから接続する必要がある。 UnixドメインソケットではなくTCPでLISTENしてくれればポートフォワードだけでいいのだが…そういったオプションはLXDにはなさそうだった。 幸いなことに昨今のsshではUnixドメインソケットも転送できるのでそれを使うことにする。
sshユーザをlxdグループに所属させる
spiceファイルが作成される場所はlxc consoleを実行したユーザのhome dirになる。 そのためsudoをつけてlxc consoleしてしまうとrootユーザのホームディレクトリ配下に作られてしまう。 そうなるとsshユーザからはアクセスできなくなってしまうので、転送もできなくなる。 そこで、まずはlxdグループにsshユーザを所属させる。
usermod -G lxd -a <ssh user>
所属させたら一旦ログアウトして再度ログインする。 問題なければlxdグループ所属しているはず。
$ id -Gn
lxd
[!NOTE] socatをつかってrootユーザのhome dir配下のUnixドメインソケットをTCPにリダイレクトして、それをsshのポートフォワードで転送するという方法もある。lxdグループに追加できない場合にはつかえるかも。
ポートフォワードする
まずはssh接続してlxc consoleを実行し、URIをメモする。
$ ssh <remote host> remote host$ lxc console <vm name> --type vga -- snip -- Alternatively you may use another SPICE client using the following URI: spice+unix:///<home dir>/snap/lxd/common/config/sockets/4203575398.spice
2つ目のsshセッションを起動する。 その時に-Lを使って、上記のUnixドメインソケットを転送する。 ローカル側は取り回しがいいのでTCPを使うことにする。 特にSPICEで決まったデフォルトのポート番号はなさそうだが、KVMのSPICEのページを見ると5900になっているのでそれを踏襲することにする。
ssh -L localhost:5900:/<home dir>/snap/lxd/common/config/sockets/4203575398.spice
[!NOTE] sshセッション中に~Cを入力することであとからポート転送をすることができるが、手元ではControlMaster(Multiplexing)が有効だったためかこの方法は使えなかった
~C escape not available to multiplexed sessions
手元から接続する
手元からはvirt-managerもしくはspice-client-gtkを使って接続。 機能差はなさそう?なので好きな方を使えばよい。
$ sudo apt install -y virt-manager or $ sudo apt install -y spice-client-gth
インストール後は以下のコマンドで接続できる。
$ remote-manager spice://localhost:5900 or $ spicy -h localhost -p 5900
やったぜ! ↑はspicyコマンドで接続した結果。