TigerVNC
TigerVNC は Virtual Network Computing (VNC) プロトコルの実装です。この記事ではサーバー機能に焦点をあてています。
目次
インストール
Vncserver には2つのリモート制御機能が存在します:
- 標準的な X サーバーと同じような仮想 (ヘッドレス) サーバー。物理的な画面ではなく仮想スクリーンを使用する。仮想サーバーは物理的な X サーバーと並行して動作します。
- 物理モニターを使用しているローカルの X セッションの直接制御。
vncserver をバーチャル(ヘッドレス)セッションで起動する
初回セットアップ
クイックスタートについては、以下のステップを参照してください。 設定オプションの完全なリストについては vncserver(8) を読むことをお勧めします。
vncpasswd
を使用してパスワードを作成して、ハッシュ化したパスワードを~/.vnc/passwd
に保存します。/etc/tigervnc/vncserver.users
を編集して、ユーザマッピングを定義します。このファイルで定義された各ユーザは、そのセッションが実行される対応するポートを持っています。ファイル内の数字は、TCP ポートに対応します。デフォルトでは、:1 が TCP ポート 5901 (5900 1) になっています。別の並列サーバが必要な場合、2 番目のインスタンスは次に高い空きポート、つまり 5902 (5900 2) で実行することができます。~/.vnc/config
を作成し、最低限session=foo
のような行で、実行するデスクトップ環境を foo に対応させたセッションの種類を定義してください。どのデスクトップ環境がシステムで利用できるかは、/usr/share/xsessions/
内の .desktop ファイルで確認できます。例えば:
~/.vnc/config
session=lxqt geometry=1920x1080 localhost alwaysshared
tigervnc の開始と終了
[email protected]
テンプレートのインスタンスを 起動 します。オプションで起動時やシャットダウン時に動くよう有効化します。この場合のインスタンス識別子はディスプレイ番号であることに注意してください(例:ディスプレイ番号 :1
のインスタンス vncserver@:1.service
など)。
ローカルディスプレイを直接公開する
Tigervnc は libvnc.so
を同梱しており、これは X の初期化中に直接ロードすることができます。これにより、パフォーマンスが向上します。
以下のファイルを作成し、X を再起動してください:
/etc/X11/xorg.conf.d/10-vnc.conf
Section "Module" Load "vnc" EndSection Section "Screen" Identifier "Screen0" Option "UserPasswdVerifier" "VncAuth" Option "PasswordFile" "/root/.vnc/passwd" EndSection
x0vncserver を直接実行してローカルディスプレイを制御する
tigervnc はまた、x0vncserver(1) も提供しており、これによって物理的な X セッションを直接制御することができます。vncpasswd ツールを使ってセッションパスワードを定義した後、以下のようにサーバーを起動します:
$ x0vncserver -rfbauth ~/.vnc/passwd
xprofile とともに
x0vncserver を簡単に起動する方法の一つは、xprofile ファイルの一つに以下のような行を追加することです:
~/.xprofile
... x0vncserver -rfbauth ~/.vnc/passwd &
systemd とともに
システムサービスとして
このオプションは、ユーザーが現在のディスプレイ、およびディスプレイマネージャーが提供するログイン画面にアクセスできるようにします。
このサービスは、ユーザーがセッションからログオフするたびに自動的に再起動されます。
以下の例では LightDM が使用されていますが、XAUTHORITY
変数を修正することで他のディスプレイマネージャーに適応させることが可能です。
/etc/systemd/system/x0vncserver.service
[Unit] Description=Remote desktop service (VNC) for :0 display Requires=display-manager.service After=network-online.target After=display-manager.service [Service] Type=simple Environment=HOME=/root Environment=XAUTHORITY=/var/run/lightdm/root/:0 ExecStart=x0vncserver -display :0 -rfbauth ~/.vnc/passwd Restart=on-failure RestartSec=500ms [Install] WantedBy=multi-user.target
このサービスはシステムユニットなので、-rfbauth ~/.vnc/passwd
は /root/.vnc/passwd
を指します。
x0vncserver.service
を開始/有効化してください。
ユーザーサービスとして
現在のデスクトップにリモートアクセスをすぐに設定できる最も簡単な方法として、x0vncserver を実行する VNC サーバーを持つために、以下のように systemd ユニットを作成して、必要なユーザーとオプションで置き換えてください:
~/.config/systemd/user/x0vncserver.service
[Unit] Description=Remote desktop service (VNC) [Service] Type=simple ExecStartPre=/bin/sh -c 'while ! pgrep -U "$USER" Xorg; do sleep 2; done' ExecStart=/usr/bin/x0vncserver -rfbauth %h/.vnc/passwd [Install] WantedBy=default.target
ExecStartPre
行は、${USER}
によって Xorg が開始されるのを待っています。
ユーザーネームとパスワードでログインする場合は、ExecStart
を /usr/bin/x0vncserver -PAMService=login -PlainUsers=${USER} -SecurityTypes=TLSPlain
に置き換えてください。
x0vncserver.service
ユーザーユニットを開始/有効化してください。
XDMCP と組み合わせて Xvnc をオンデマンドセッションで実行する
systemd のソケットアクティベーションと XDMCP を組み合わせることで、ログインしようとする各ユーザーごとに自動的に VNC サーバーを生成することができます。そのため、ユーザーごとにサーバー/ポートを設定する必要はありません。このセットアップでは、ディスプレイマネージャーを使用してユーザーを認証し、ログインするため、VNC パスワードは必要ありません。欠点としては、ユーザーがサーバー上でセッションを継続して後で再接続することはできません。
これを動作させるには、まず XDMCP を設定し、ディスプレイマネージャーが動作していることを確認してください。 次に、以下を作成します:
/etc/systemd/system/xvnc.socket
[Unit] Description=XVNC Server [Socket] ListenStream=5900 Accept=yes [Install] WantedBy=sockets.target
/etc/systemd/system/[email protected]
[Unit] Description=XVNC Per-Connection Daemon [Service] ExecStart=-/usr/bin/Xvnc -inetd -query localhost -geometry 1920x1080 -once -SecurityTypes=None User=nobody StandardInput=socket StandardError=syslog
xvnc.socket
を開始/有効化してください。これで、任意の数のユーザーがポート 5900 に接続することで独自のデスクトップを取得できます。
VNC サーバーがインターネットに公開されている場合は、[email protected]
の Xvnc
に -localhost
オプションを追加してください(-query localhost
と -localhost
は異なるスイッチです)、#Accessing vncserver via SSH tunnels に従ってください。接続後にユーザーを選択するだけなので、VNC サーバーはユーザー nobody として実行され、vncserver
スクリプトの代わりに直接 Xvnc
を使用するため、~/.vnc
のオプションは無視されます。オプションで、クリップボードが動作するように vncconfig を 自動起動させてください(vncconfig は非 VNC セッションで即座に終了します)。作成する一つの方法は:
/etc/X11/xinit/xinitrc.d/99-vncconfig.sh
#!/bin/sh vncconfig -nowin &
vncserver に接続する
vncserver に接続できるクライアントは多数存在します。下は 10.1.10.2 のポート 5901 (:1) で動作している vncserver に接続するコマンド例です:
$ vncviewer 10.1.10.2:1
パスワードなしで認証
-passwd
スイッチを使うことでサーバーの ~/.vnc/passwd
ファイルの場所を定義することができます。サーバー上のこのファイルには SSH か物理的なアクセスによってユーザーがアクセスすることが期待されています。どちらの場合でも、クライアントのファイルシステム上の安全な場所、つまり特定のユーザーだけが読み込みアクセスできる場所にファイルを置いて下さい。
$ vncviewer -passwd /path/to/server-passwd-file
GUI ベースのクライアント
TigerVNC の vncviewer にはシンプルが GUI が存在し、何もパラメータを付けずに実行します:
$ vncviewer
SSH トンネル経由で vncserver にアクセス
SSH 接続を提供するサーバの利点は、VNC トラフィックが SSH ポートを介してトンネリングされるため、既に開いている SSH ポート以外のポートを外部に開く必要がないことです。
サーバー側
サーバ側では、vncserver または、 x0vncserver を実行する必要があります。
これらのどちらかを実行する場合、~/.vnc/config
の localhost
オプション、または -localhost
スイッチ(x0vncserver の場合)を使用することをお勧めします。例えば
~/.vnc/config
session=lxqt geometry=1920x1080 localhost alwaysshared
例えば、[email protected]
を開始または再起動してください(#初回セットアップも参照してください)。
クライアント側
サーバーはローカルホストからの接続だけを許可しているので、-L スイッチを使ってトンネルを有効にして ssh で接続します。例えば:
$ ssh 10.1.10.2 -L 5901:localhost:5901
上記はサーバーのポート 5901 をクライアントのポート 5901 に転送します。サーバーとクライアントでポート番号を必ずしも一致させる必要はありません。例:
$ ssh 10.1.10.2 -L 8900:localhost:5901
上記のコマンドはサーバーのポート 5901 をクライアントマシンのポート 8900 に転送します。
SSH で接続したら、サーバーと接続するための暗号化トンネルとして xterm やシェルのウィンドウは開いたままにしてください。暗号化トンネルを使って接続するには、vncviewer でローカルホストのクライアントポートを指定します。
サーバーとクライアントで同じポートを使用する場合:
$ vncviewer localhost:1
サーバーとクライアントで違うポートを使用する場合:
$ vncviewer localhost:8900
SSH で Android デバイスから VNC サーバーに接続する
Android デバイスを使って SSH で VNC サーバーに接続するには:
1. 接続するマシン上で SSH サーバーを動作させる。 2. 接続するマシン上で VNC サーバーを動作させる (上述のように -localhost フラグでサーバーを起動する)。 3. Android デバイスで SSH クライアントを使う (ConnectBot が人気があります、この外では例としてこれを使います)。 4. Android デバイスで VNC クライアントを使う (androidVNC)。
固定 IP アドレスを持たないマシンではダイナミック DNS サービスを使うことを考慮してください。
ConnectBot で、IP を入力してマシンに接続してください。オプションキーをタップして、Port Forwards を選択し新しいポートを追加してください:
Nickname: vnc Type: Local Source port: 5901 Destination: 127.0.0.1:5901 (it did not work for me when I typed in 192.168.x.xxx here, I had to use 127.0.0.1)
保存してください。
androidVNC で:
Nickname: nickname Password: the password used to set up the VNC server Address: 127.0.0.1 (we are in local after connecting through SSH) Port: 5901
接続してください。
ヒントとテクニック
macOS に接続する
https://help.ubuntu.com/community/AppleRemoteDesktop を見てください。Remmina でテスト済みです。
推奨セキュリティ設定
SecurityTypes は使用するセキュリティアルゴリズムを制御します。現在のバージョン 1.5.0 でのデフォルトは "X509Plain,TLSPlain,X509Vnc,TLSVnc,X509None,TLSNone,VncAuth,None" です。"X509Vnc,TLSVnc" とすることで暗号化しないデータのやりとりを無効化できます。
TLSVnc では同一性確認がないため、X509Vnc を使うことを推奨します:
$ vncserver -x509key /path/to/key.pem -x509cert /path/to/cerm.pem -SecurityTypes X509Vnc :1
x509 証明書の作成方法はこの記事では説明しません。Let’s Encrypt を使用したり、OpenSSL を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。
フルスクリーンの切り替え
これは VNC クライアントのメニューから行うことができます。デフォルトでは、VNC クライアントの mkey は F8
です。
マウスの戻る/進むボタンが動作しない場合の回避策
現在の VNC プロトコルは 7つのマウスボタン(左、中、右、スクロールアップ、スクロールダウン、スクロール左、スクロール右)しか使用していないため、マウスに戻るボタンと進むボタンがある場合、これらは使用できず、入力は無視されます。
evrouter は、マウスの戻る/進むボタンをクリックしたときにキーボードのキー押下を送信してこの制限を回避するために使用できます。オプションで、xautomation と xbindkeys をサーバーで使用して、必要に応じてキーボードのキー押下をマウスボタンのクリックにマップバックできます。
キーボードキー XF86Back/XF86Forward でマウスの戻る/進むボタンを代用する
この方法はシンプルで、例えば Web ブラウザやファイルブラウザを使用している間に戻る/進むをナビゲートする方法が必要な場合に適しています。
クライアントで evrouterAUR と xautomation をインストールします。evrouter を設定します。正確なデバイス名、ウィンドウ名、ボタン名などを見つける方法とヒントについては、マウスボタン#evrouter と evrouter の man ページを参照してください。例の設定は以下の通りです:
~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # Window title used as filter # Using Shell to avoid repeating key presses (see evrouter manual) "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Back'" "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Forward'" # Use XKey below instead if repeating keys is desired (see evrouter manual) #"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/275 "XKey/XF86Back" #"Logitech Gaming Mouse G400" "/dev/input/by-id/usb-Logitech_Gaming_Mouse_G400-event-mouse" none key/276 "XKey/XF86Forward"
クライアントで evrouter を起動します。上記の設定で、マウスの戻るボタンをクリックすると VNC サーバーに XF86Back
が送信され、進むボタンをクリックすると XF86Forward
が送信されます。
サーバーでキーボードキー押下をマウスボタンクリックにマップバックする
必要に応じて、サーバーでキーボードキーをマウスボタンクリックにマップバックすることが可能です。この場合、クライアントやサーバーで絶対に使用されないキーボードキーを使用することが良いでしょう。以下の例では、キーボードキー XF86Launch8
/ XF86Launch9
がマウスボタン 8/9 として使用されています。
クライアントでの evrouter 設定:
~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # ウィンドウタイトル # キー押下を繰り返さないように Shell を使用(evrouter マニュアルを参照) "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/275 "Shell/xte 'key XF86Launch8'" "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"
サーバーで xautomation と xbindkeys をインストールします。xbindkeys を設定して、キーボードキー XF86Launch8
/ XF86Launch9
を xte を使ってマウスボタン 8/9 にマップします。
~/.xbindkeysrc
"xte 'mouseclick 8'" XF86Launch8 "xte 'mouseclick 9'" XF86Launch9
xbindkeys(xbindkeys -f ~/.xbindkeysrc
)を起動します。サーバーは、XF86Launch8
/ XF86Launch9
をマウスボタン 8/9 にマップするようになります。
トラブルシューティング
ウィンドウの代わりに黒い四角
おそらく、これはアプリケーションが Composite Xorg 拡張を厳密に必要としているためです。例えば、webkit ベースのアプリ:midori、psi-plus など。
この場合、以下のようなコマンドで vncserver を再起動してください:
$ vncserver -geometry ... -depth 24 :1 extension Composite
Composite 拡張は、VNC で 24 ビット深度でしか動作しないようです。
マウスカーソルのある空の黒いウィンドウ
ユーザーが物理的な X セッションにログインしていないことを確認してください、x0vncserver
でこのオプションが設定されていない限り。単一のユーザーで複数の X セッションはサポートされていません。詳細は https://github.com/TigerVNC/tigervnc/issues/684#issuecomment-494385395 を参照してください。
逆に、VNC サーバーサービスがそのユーザーで動作している間にローカルの X セッションにログインしようとすると、うまくいかない可能性があり、デスクトップ環境を使用している場合、スプラッシュスクリーンで詰まることがあります。
マウスカーソルが表示されない
x0vncserver を使用していてマウスカーソルが表示されない場合、以下のように vncviewer を起動してください:
$ vncviewer DotWhenNoCursor=1 サーバー
または、TigerVNC の設定ファイル(デフォルトで ~/.vnc/default.tigervnc
にあります)に DotWhenNoCursor=1
を追加してください。
リモートマシンからのクリップボードの内容をコピーする
リモートマシンからローカルマシンへのコピーが機能しない場合は、サーバー上で autocutsel
を実行してください。詳しくは [1] を参照:
$ autocutsel -fork
次に、F8
キーを押して VNC メニューのポップアップを表示し、Clipboard: local -> remote
オプションを選択してください。
ウィンドウ装飾 / 境界線 / タイトルバーがない / ウィンドウを動かせない
空の xterm フレームを修正するためにウィンドウマネージャーを起動してください。例えば、Xfce 上では xfwm4 &
を実行してください。
デスクトップ環境でフォントがボックスで表示される
一部のデスクトップ環境では、ASCII 文字を表示するための必要なフォントが欠けている可能性があります。ttf-dejavu をインストールしてください。