リモートホストの 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
ログインするとコメントを投稿できます。




