Linux 環境における X11 転送
[History] [Last Modified] (2019/03/26 06:54:28)
Recent posts
What is this site?
A platform for makers to share their knowledge.

Share your robots/products with others.
New robots/products

概要

リモートホストの X Window System (X11) を転送して利用する方法を、SSH および Virtual Network Computing (VNC) の二つの方法について記載します。

SSH

サーバとホストの両方で X11 転送を有効にすることで利用できます。アプリケーション毎に転送できます。

サーバ側

sudo apt install xauth

/etc/ssh/sshd_config

$ egrep '(X11Forwarding|X11UseLocalhost)' /etc/ssh/sshd_config
X11Forwarding yes
X11UseLocalhost no

クライアント側

ssh -XC hostname
firefox &

あるいは以下のように ssh 設定しておきます。

~/.ssh/config

ForwardX11 yes

VNC

サーバ側で、X11 に対して VNC 接続できるように待ち受けるための x11vnc を起動します。

sudo apt install x11vnc
x11vnc -storepasswd
x11vnc -forever -usepw

何らかの VNC クライアントで接続します。Windows のリモートデスクトップのような感覚です。

sudo apt install gvncviewer
gvncviewer remotehost

VNC は平文で通信するため、暗号化したい場合は SSH ポート転送を併用します。以下では、remotehost から見た localhost の 5900 番を、localhost の 5959 番に転送しています。

ssh -L 5959:localhost:5900 remotehost
gvncviewer localhost::5959

仮想ディスプレイを作る (Xvfb)

実際のディスプレイが存在しない場合であっても X11 サーバの一つである Xvfb を利用することで仮想ディスプレイを作成できます。例えば、以下のコマンドで 99 番の DISPLAY を作成できます。

sudo apt install xvfb
export DISPLAY=:99
Xvfb :99 -screen 0 1024x768x24 &

これを先程の x11vnc で VNC 接続できるようにします。

sudo apt install x11vnc
x11vnc -storepasswd
x11vnc -display :99 -bg -usepw -listen 0.0.0.0 -xkb -forever

以上で 99 番のディスプレイに VNC 接続できるようになりました。パスワードなし、複数人で接続するためには -shared -nopw とします。

x11vnc -display :99 -listen 0.0.0.0 -forever -xkb -shared -nopw

VNC ポートが空いていない場合

VNC ポート 5900 番が空いていない場合は先程の SSH ポートフォワーディングを併用します。

ssh -L 5959:localhost:5900 remotehost

X11 アプリケーションの起動

Firefox を起動してみます。DISPLAY 環境変数を指定する必要があることに注意します。

ssh remotehost
sudo apt install firefox-esr
DISPLAY=:99 firefox &

X11 ウィンドウマネージャの併用

X11 アプリケーションとして Firefox を単体で起動しましたが、開発中の QT アプリケーション等で「閉じるボタン」がない場合等は fluxbox 等の X11 ウィンドウマネージャを同じ DISPLAY に X11 アプリケーションとして起動しておくと便利です。xvfbx11vnc をバックグラウンドで起動中のシェル等で fluxbox も追加起動します。

ssh remotehost
sudo apt install fluxbox
DISPLAY=:99 fluxbox &

今回は macOS の Finder から VNC クライアントを起動して接続しました。そのため、パスワードが無指定の VNC 待ち受けの場合は接続エラーが発生します。

Uploaded Image

「閉じるボタン」がない QT アプリケーションを起動した様子です。ウィンドウマネージャ配下にあるため閉じることができます。

Uploaded Image

X11 サーバの動作確認

sudo apt install x11-apps
DISPLAY=:99 xeyes

ディスプレイのリフレッシュレート等を確認および変更

DISPLAY=:99 xrandr
xrandr: Failed to get size of gamma for output screen
Screen 0: minimum 1 x 1, current 1024 x 768, maximum 1024 x 768
screen connected 1024x768+0+0 0mm x 0mm
   1024x768        0.00*

モニター一覧は以下のコマンドで確認できます。

DISPLAY=:0 xrandr --listmonitors

解像度等を変更するためには以下のようにします。

gtf 800 400 128
DISPLAY=:0 xrandr --newmode "800x400_128.00"  58.26  800 840 928 1056  400 401 404 431  -HSync +Vsync
DISPLAY=:0 xrandr --addmode screen 800x400_128.00
DISPLAY=:0 xrandr -s 800x400_128.00

OpenGL ベンチマーク

Xvfb で作成した仮想ディスプレイの場合、CPU が許容するリフレッシュレートが表示されます。

DISPLAY=:0 glxgears

例えば xvfb の CPU 使用率を制限すると glxgears の CPU 使用率は下がります。以下の設定では xvfb は N コア * 100 % のうちの 1.0 % しか使用できなくなります。

apt install cgroup-bin
cgcreate -g cpu:cpulimited
cgget -r cpu.cfs_period_us cpulimited
cgset -r cpu.cfs_period_us=1000000 cpulimited
cgget -r cpu.cfs_quota_us cpulimited
cgset -r cpu.cfs_quota_us=10000 cpulimited
cgexec -g cpu:cpulimited Xvfb :99 -screen 0 1024x768x24

リモート X11 サーバへのアクセス

リモートからの X11 アクセスを許可しておけば

Xvfb :99 -screen 0 1024x768x24 -listen tcp
DISPLAY=:99 xhost +
access control disabled, clients can connect from any host

以下のように接続できます。

DISPLAY=123.123.123.123:99 glxgears

-ac オプション (man xserver) を指定すれば xhost 設定は不要になります。

Xvfb :99 -screen 0 1024x768x24 -listen tcp -ac

X サーバに接続して録画する (ffmpeg x11grab)

以下のように仮想ディスプレイを作成してみます。

Xvfb :99 -screen 0 1024x768x24 -listen tcp -ac

何らかの X アプリケーションを接続します。

DISPLAY=:99 xcalc

VNC 経由で操作してみます。

x11vnc -display :99 -listen 0.0.0.0 -forever -xkb -shared -nopw
DISPLAY=:0 gvncviewer localhost::590

以下のようにして録画できます。-framerate で fps を調整すれば動画のサイズも軽くなります。

ffmpeg -y -video_size 1024x768 -framerate 30 -f x11grab -i localhost:99+0,0 -ac 2 grab.mp4

リモートホストの X11 を録画する場合は時刻情報が取得できずにエラーとなるため gvncviewer 等と併用するとよいです。

DISPLAY=localhost:99 gvncviewer 1.2.3.4::5900
ffmpeg -y -video_size 1024x768 -framerate 30 -f x11grab -i localhost:99+0,0 -ac 2 grab.mp4

スクリーンショットも取得できます。

sudo apt install imagemagick
DISPLAY=localhost:99 import -window root screenshot.png
Related pages
    概要 QT を Python から利用するためのライブラリには PyQt や PySide 等が存在します。PySide は元々 QT4 向けのライブラリでしたが、QT5 に対応するために新たに PySide2 が開発されました。PySide2 は Qt for Python ともよばれています。 Q: PySide? Qt for Python? what is the name?
    概要 こちらで公開されている stone という小型のツールを用いると、飛び石としてパケット転送を行う中継サーバを用意することができます。実際には多機能なツールですがここでは最も簡単な使用例を紹介します。 ビルド手順 ダウンロード 公式サイトから最新のもの stone version 2.3e をダウンロードします。
    概要 Qt 等で開発された X11 アプリケーションを利用するためには X サーバのクライアントが必要になります。X サーバは仮想的に Xvfb コマンドで作成することができます。X サーバのクライアントには fluxbox などの X11 ウィンドウマネージャ、ssh -X や x11vnc、その他 Qt 等で開発された X11 アプリケーションがあります。