「TigerVNC」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) |
Kusanaginoturugi (トーク | 投稿記録) |
||
147行目: | 147行目: | ||
これを動作させるには、まず [[XDMCP]] を設定し、ディスプレイマネージャーが動作していることを確認してください。 |
これを動作させるには、まず [[XDMCP]] を設定し、ディスプレイマネージャーが動作していることを確認してください。 |
||
次に、以下を作成します: |
次に、以下を作成します: |
||
− | |||
{{hc|/etc/systemd/system/xvnc.socket|2= |
{{hc|/etc/systemd/system/xvnc.socket|2= |
2023年9月15日 (金) 20:48時点における版
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 の開始と終了
vncserver@.service
テンプレートのインスタンスを 起動 します。オプションで起動時やシャットダウン時に動くよう有効化します。この場合のインスタンス識別子はディスプレイ番号であることに注意してください(例:ディスプレイ番号 :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/xvnc@.service
[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 サーバーがインターネットに公開されている場合は、xvnc@.service
の 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
例えば、vncserver@.service
を開始または再起動してください(#初回セットアップも参照してください)。
クライアント側
サーバーはローカルホストからの接続だけを許可しているので、-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 を使って手動で証明書を発行してサーバーとクライアントで鍵を共有できます。
Toggling fullscreen
This can be done through vnc client's menu. By default, vnc client's mkey is F8
.
Workaround for mouse back and forward buttons not working
The VNC protocol currently only uses 7 mouse buttons (left, middle, right, scroll up, scroll down, scroll left, scroll right) which means if your mouse has a back and a forward button, these are not usable and input will be ignored.
evrouter can be used to work around this limitation by sending keyboard key presses when clicking the mouse back/forward buttons. Optionally, xte found in xautomation and xbindkeys can be used on the server to map the keyboard key presses back to mouse button clicks if needed.
Substituting mouse back/forward buttons with keyboard keys XF86Back/XF86Forward
This method is simple and suitable if you only need a way to navigate backward/forward while using web browsers or file browsers for example.
Install evrouterAUR and xautomation on the client. Configure evrouter, see Mouse buttons#evrouter and evrouter man pages for instructions and tips on how to find the correct device name, window name, button names etc. Example config:
~/.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"
Start evrouter on the client. With above configuration keyboard key XF86Back
is sent to the VNC server when clicking the back button on the mouse, and XF86Forward
is sent when clicking the forward button.
Mapping the keyboard key presses back to mouse button clicks on the server
If needed, it is possible to map the keyboard keys back to mouse button clicks on the server. In this case, it might be a good idea to use keyboard keys which are never on the client or server. In the example below, keyboard keys XF86Launch8
/XF86Launch9
are used as mouse buttons 8/9.
Evrouter configuration on the client:
~/.evrouterrc
Window "OtherComputer:0 - TigerVNC": # Window title # 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 XF86Launch8'" "USB mouse" "/dev/input/by-id/usb-Mouse-name-event-mouse" none key/276 "Shell/xte 'key XF86Launch9'"
Install xautomation and xbindkeys on the server. Configure xbindkeys to map keyboard keys XF86Launch8
/XF86Launch9
to mouse buttons 8/9 with xte.
~/.xbindkeysrc
"xte 'mouseclick 8'" XF86Launch8 "xte 'mouseclick 9'" XF86Launch9
Start xbindkeys (xbindkeys -f ~/.xbindkeysrc
). The server will now map XF86Launch8
/XF86Launch9
to mouse buttons 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 をインストールしてください。