リモートホストの 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 アプリケーションとして起動しておくと便利です。xvfb
と x11vnc
をバックグラウンドで起動中のシェル等で fluxbox
も追加起動します。
ssh remotehost
sudo apt install fluxbox
DISPLAY=:99 fluxbox &
今回は macOS の Finder から VNC クライアントを起動して接続しました。そのため、パスワードが無指定の VNC 待ち受けの場合は接続エラーが発生します。
「閉じるボタン」がない QT アプリケーションを起動した様子です。ウィンドウマネージャ配下にあるため閉じることができます。
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
拡大縮小できる realvnc
deb ファイル等でインストールします。
sudo dpkg -i VNC-Viewer-6.19.325-Linux-x64.deb
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- 輪郭に関連した画像処理 (OpenCV3 C++)cv::Canny などで検出したエッジをもとに cv::findContours で輪郭を計算できます。輪郭に関連した処理の例を記載します。 輪郭の描画 #include <opencv2/opencv.hpp> #in
- Qt for Python (PySide2) の基本的な使い方QT を Python から利用するためのライブラリには PyQt や PySide 等が存在します。PySide は元々 QT4 向けのライブラリでしたが、QT5 に対応するために新たに PySide2 が開発されました。PySide2 は Qt for Python ともよばれています。 Q: PySide? Qt for Python? what is the name?A: The nam...
- OpenGL を Python3 から利用するための環境設定および簡単なサンプルコード (Linux)コンピュータグラフィックスのレンダリングライブラリの一つである OpenGL を Python3 から利用するための Linux 環境を準備して、設定例およびサンプルコードを記載します。特にここでは Debian9 を利用します。 Getting Started [Language bindings / Python](ht
- 立方体を回転させるサンプル (OpenGL、Python)立方体を二つ配置して回転させてみます。ライブラリを用いずに OpenGL API を直接利用します。 wget https://gist.githubusercontent.com/harubot/df886254396a449038ee542ed317f7b3/raw/92216e02d0210b9d81770562ddf7741339f1b286/opengl-setup2.py DISPLA...
- Open Dynamics Engine によるロボットの自己位置の推定 (Python)ロボットアプリケーションを開発する際に、ロボットの自己位置を推定する必要がある場合を考えます。ここでは Open Dynamics Engine を Python から利用した場合について、自己位置推定のサンプルを記載します。自己位置推定と環境の地図作成を同時に行う場合を SLAM (Simultaneous Localization and Mapping) とよびます。 検証に用いる車輪型ロボ...