Desktop as a Service の Kasm Workspaces の内部で使われている KasmVNC を単独で利用する方法について記載します。KasmVNC はオープンソースとして公開されています。Linode で立ち上げた Linux サーバーの GUI を使う例として紹介します。後半では、VNC を使うときに気になるネットワーク転送量についても触れます。
Kasm Workspacs については下記の記事を参照してください。
KasmVNC とは
KasmVNC は Linux 環境で動くリモートデスクトップサービスです。KasmVNC はブラウザーからアクセスでき、 VNC アプリケーションを必要としないのが特徴です。サーバーおよびユーザーレベルで YAML 形式によって簡単に設定をカスタマイズできます。
KasmVNC の動作条件
Kasm Technologies 社の Document に詳細な動作環境が記載されています。
本記事では Ubuntu 20.04 LTS、Tokyo Region、Linode 2GB (2GB Memory、1 CPU、1 Core、2TB Transfer) のプランで試します。2 Core 以上が推奨されていますので、業務で利用されるときは Linode 4GB プラン以上を使うのがおすすめです。
KasmVNC のインストール
KasmVNC の GitHub から、最新バージョンのダウンロードページに行きます。
複数の .deb ファイルがあります。どれをダウンロードするかを確認するために、仮想サーバーの端末で、使っている CPU のベンダーを調べます。
% lscpu | grep AMD
Vendor ID: AuthenticAMD
AMD だと分かったので、kasmvncserver_jammy_1.0.1_amd64.deb
をダウンロードします。
wget https://github.com/kasmtech/KasmVNC/releases/download/v1.0.1/kasmvncserver_jammy_1.0.1_amd64.deb
ダウンロードしたファイルを使ってインストールします。
sudo apt-get install ./kasmvncserver_jammy_1.0.1_amd64.deb
パッケージを最新にします。
sudo apt update && apt upgrade
vncserver
を起動するためには、ssl-cert
グループが必要です。
sudo addgroup $USER ssl-cert
vncserver
を起動します。
vncserver
以下の選択項目がでます。
Creating default config /home/hideki/.vnc/kasmvnc.yaml
xauth: file /home/hideki/.Xauthority does not exist
In order to control your desktop, you need a KasmVNC user with write
permissions. Select what action to take:
[1] Create a new user with write access
[2] Start KasmVNC without a user with write access
Provide selection number:
1
を選択して、KasmVNC にアクセスするためのユーザーアカウントを作成します。
Provide selection number: 1
Let's create a user.
Enter username (default: hideki):
Password:
Verify:
Created user "hideki"
Please choose Desktop Environment to run:
[1] Manually edit xstartup
1
/etc/ssl/private/ssl-cert-snakeoil.key: certificate file doesn't exist or isn't a file
ファイルへのアクセスの権限がないため、起動できませんでした。
sudo ls -l /etc/ssl/private/ssl-cert-snakeoil.key
-rw-r----- 1 root ssl-cert 1704 Feb 10 17:26 /etc/ssl/private/ssl-cert-snakeoil.key
groups
コマンドで addgroup
した ssl-cert
が登録されていません。
$ groups
hideki sudo
/etc/group
には登録されています。
$ egrep ssl-cert /etc/group
ssl-cert:x:118:hideki
再度ログインし直したら、正しい状態になりました。
$ groups
hideki sudo ssl-cert
もう一度 vncserver
を起動します。
$ vncserver
New 'jammy:1 (hideki)' desktop is jammy:1
Users configured:
hideki (can use keyboard and mouse)
Log file is /home/hideki/.vnc/jammy:1.log
Creating default startup script /home/hideki/.vnc/xstartup
Starting applications specified in /home/hideki/.vnc/xstartup
Paste this url in your browser:
https://XXX.XXX.XXX.XXX:8444
KasmVNC にアクセスする
vncserver
を起動したときに、アクセス元の URL が記載されています。その URL にアクセスします。デフォルトのポート番号は 8444
です。アクセスすると、下図のような HTTP 認証のサインが表示されます。vncserver
を起動した時に作成したユーザーアカウントとパスワードを入力します。
ログインできた後の画面です。画面左側にコントロールパネルが表示されています。しかし、Ubuntu にデスクトップ環境をインストールしていないので、何もできない状況です。
ssh
で接続した端末から、ubuntu 用のデスクトップ環境をインストールします。
sudo apt-get -y install ubuntu-desktop
リブートします。
sudo reboot now
リブート後、ssh
で再度ログインし、 vncserver
を起動します。今度はデスクトップ環境が正しく表示されました。
Startup を終了したら、左上の Activities
からアプリケーションを選択できるようになります。
ブラウザーがないのでインストールします。
sudo apt -y install firefox firefox-locale-ja
インストールが終了すると、画面に Firefox のアイコンが表示されます。
KasmVNC の停止
vncserver
のディスプレイ番号を取得します。
vncserver -list
表示結果です。ディスプレイ番号は :1
であることが分かります。
$ vncserver -list
KasmVNC server sessions:
X DISPLAY # PROCESS ID
:1 982
vncserver
のプロセスを停止します。ディスプレイ番号を指定します。
vncserver -kill :1
vncserver
コマンドの詳細はマニュアルを参照ください。
man vncserver
KasmVNC の設定
vncserver
を起動すると以下のファイルが作成されています。
$ ls -lg .vnc .Xauthority .xsession-errors
-rw------- 1 hideki 160 Feb 10 18:19 .Xauthority
-rw------- 1 hideki 412 Feb 10 18:19 .xsession-errors
.vnc:
total 164
-rw-rw-r-- 1 hideki 154646 Feb 10 18:33 jammy:1.log
-rw-r--r-- 1 hideki 65 Feb 10 17:38 kasmvnc.yaml
-rw-rw-r-- 1 hideki 8 Feb 10 18:19 passwd
-rwxr-xr-x 1 hideki 553 Feb 10 17:53 xstartup
.log
はログファイル、xstartup
は X Window Manager の設定スクリプトです。kasmvnc.yaml
は KasmVNC の設定ファイルです。次の YAML 形式が記載されています。
logging:
log_writer_name: all
log_dest: logfile
level: 100
カスタマイズするには、ドキュメントを参照します。
サーバー単位での設定は /etc/kasmvnc/kasmvnc.yaml
で記入します。
クリップボードへのコピー
クリップボードのコピーができるので、ホストマシンとのテキストの共有ができます。
クリップボードのコピー機能を有効化するには、サーバーのコンフィグファイルを編集します。
sudo vi /etc/kasmvnc/kasmvnc.yaml
runtime_configuration.allow_client_to_override_kasm_server_settings
を true
にします。
# runtime_configuration:
# allow_client_to_override_kasm_server_settings: true
runtime_configuration.allow_client_to_override_kasm_server_settings: true
クリップボードの機能は Data Loss Prevention 機能の一つとして提供され、細かく設定できるようになっています。詳細はドキュメントを参照してください。
KasmVNC の制約
Kasm Workspace では対応している音声出力、ローカルホストとのファイルのアップロード/ダウンロードができないようです。
Chrome Developer Tool で KasmVNC のリクエストを見る
Chrome の Developer tool で KasmVNC を使ったときのリクエストを調べます。最初に WebSocket で接続されています。このソケットは常時接続され、状態を監視しています。
読み込まれたデータを Developer Tool の Preview で見るとイメージファイルの断片が見えます。
ダウンロードされるファイルを見ると、パズルを組み立てているみたいで興味深いです。WebP も使われています。
動画を閲覧しているときも、ダウンロードされているのはイメージファイルでした。
素晴らしい技術ですね。
Linode の LongView で状態を監視する
ブラウザーは KasmVNC (vncserver) から常にファイルをダウンロードしているので、CPU 処理やネットワークの使用量が気になります。Linode では LongView を使うことで、Linode Contol Panel から常に状態を監視することができます。
Linode にログインして、Longview から Add Client
します。コマンドを Linux 上で実施するように促されます。もし上手くいかない場合は、以下のようにコマンドを分割して実行してください。一旦 longview.sh
のファイルとしてダウンロードします。
curl -s https://lv.linode.com/DUMMY6C9-XXXX-XXXX-AA40A998C14DUMMY -o longview.sh
root ユーザーで実行します。
sudo bash ./longview.sh
実行されていることを確認します。
ps axuw| grep longview
root 33825 0.9 1.7 43132 35104 ? Ss 20:52 0:00 linode-longview
データ転送の比較
macOS の Chrome ブラウザーから、YouTube 画像を見たときの比較が次のとおりです。
方法 | データ転送量 | リクエスト数 |
---|---|---|
macOS から直接視聴 (動画フォーマット) | 82 MB | 538 requests |
KasmVNC で起動した Firefox アプリから視聴(Quality: Medium) | 258 MB | 147,660 requests |
KasmVNC で起動した Firefox アプリから視聴(Quality: Extreme) | 528 MB | 161,564 requests |
予想はしていましたが、やはり動画配信フォーマットと比較するとかなり転送量は多くなっています。それでも、イメージをベースにリアルタイムで配信している中で頑張っているのかもしれません。動画は一定時間の webM ファイルのチャンクを送信されていたのに対し、KasmVNC では細かい差分のイメージを送信しているため、リクエスト数は圧倒的に多くなっています。その中で、カクカクしたりすることもなく、また、通常の動画として視聴できるのは驚きです。
YouTube on Chrome on macOS
Chrome 上の表示です。
YouTubeの画質は自動 (1080p60 HD) でした。
YouTube on Firefox on KasmVNC (Quality Medium) on Chrome on macOS
KasmVNC の Steram Quality の設定は Medium を使いました。
画面イメージ
全ての評価は同じ macOS 上の Chrome で同じ開き方で比較しています。データは Chrome の Developer Kit の Network タブから取得しています。
YouTube on Firefox on KasmVNC (Quality Extreme) on Chrome on macOS
KasmVNC の Steram Quality の設定は Extreme を使いました。
Longview で見えるネットワーク監視状況
KasmVNC のようなデスクトップサービスは、ローカルに表示されるデスクトップイメージをサーバーから配信しているため、サーバーから見た場合のアウトバウンド転送量が多くなります。Linode の Longview を使うとインバウンドとアウトバウンドの量が可視化できますが、アウトバウンドの量が多いことが分かります。
デスクトップサービスを利用しない通常のアプリケーションでは、多くは逆で、インバウンドの量が多くなります。例えば、インターネットからブラウザーに対して動画を見るようなケースです。
KasmVNC の転送量
KasmVNC の Quality を Extreme にしたケースでは 20 分間の動画視聴に 500 MB強 をダウンロードしました。このケースのデータを使って、開発者が Linux サーバーで一日 10 時間、20 日使うと仮定した場合、500 x 60 / 20 x 10 x 20 = 300 GB アウトバウンドを消費します。Linode であれば、最安の $5 のプランでも 1TB の転送量が入っていますので、転送量に対して課金される心配はなさそうです。
KasmVNC スタンドアローンで一日中使うケースはあまり想像できませんが、Kasm Workspaces のようなワークスペースを提供するサービスであれば、セキュリティ強化の目的で、1,000 人規模で特定のアプリケーションだけを利用させるケースもあります。その場合のアウトバウンド転送量費用は無視できなくなります。
まとめ
Kasm Workspaces のコア技術である KasmVNC はブラウザー上で Linux の画面をストリーミング表示します。使った感じのストレスはないです。画質についても調整機能があります。インストールも簡単で、ブラウザーで動くので使い勝手が良いです。YouTube を視聴した時の転送量比較では、通常の動画ではなくイメージをベースとしたストリーム配信のため、 3.14 から 6.43 倍増加 (KasmVNC の Quality 設定が Medium (デフォルト)と Extreme の対比)しました。クラウドのデスクトップサービスだとアウトバウンド転送量が気になりますが、Linode のように egress コストが低いサービスは安心感があると思います。