Xpra
Xpra は 'screen for X' です: リモートホストで X プログラムを実行して、ディスプレイをローカルマシンに飛ばすことができ、状態を維持したままプログラムから切断して他のマシンから再接続できます。Xpra を使うことで個別のアプリケーションにリモートアクセスすることが可能になります。
- Xpra は "rootless" あるいは "seamless" です: Xpra で実行したプログラムは普通のプログラムと同じようにデスクトップに表示され、ウィンドウマネージャで管理されます。
- SSH を通してセッションにアクセスしたり、パスワードで保護した平文の TCP ソケットを使うことができます。
- Xpra は接続速度が遅くても使うことができ、ネットワークの帯域幅の変化に対応します (アダプティブ JPEG モードを参照)。
- Xpra はオープンソース (GPLv2+)、マルチプラットフォーム、多言語対応です。クライントは Python と Java で書かれています。
目次
インストール
サーバーとクライントの両方で xpra パッケージをインストールしてください。
使用方法
詳しいマニュアルは man xpra
を確認してください。
アプリケーションの実行
アプリケーションを実行したいマシンで xpra サーバーを起動 (例としてディスプレイ番号は 7 を使用):
$ xpra start :7
それからアプリケーションを実行します (例: firefox):
$ DISPLAY=:7 firefox
もしくは、コンソールを閉じても問題ないように screen セッションを起動してプログラムを実行するには:
$ DISPLAY=:7 screen [screen starts] $ firefox
上記のように screen
を起動したときはプログラムを起動する際にディスプレイ番号を指定する必要はありません。自動的に xpra のディスプレイで実行されます。
上のコマンドを実行しても、ウィンドウはまだ表示されません。アプリケーションをディスプレイに表示するには、xpra サーバーに接続しなければなりません。同一マシン上にある xpra サーバーに接続する場合、以下のように xpra クライアントを起動してください:
$ xpra attach :7
もしくは、ssh を介してリモートマシンに接続する場合:
$ xpra attach ssh:user@example.com:7
クライアントの起動後、リモートサーバーのディスプレイで実行されているプログラムは全てローカルマシンの画面に表示されます。解除するには、ctrl-c
と入力するか以下のコマンドを使用:
$ xpra detach ssh:user@example.com:7
プログラムはサーバー側で実行し続けるので後から再度表示することもできます。
サーバーを停止するには、サーバーを実行しているマシンで次を実行:
$ xpra stop :7
あるいはリモートから停止する場合:
$ xpra stop ssh:user@example.com:7
デスクトップ環境の実行
デスクトップを実行するには (サーバー側で実行):
$ xpra start-desktop :7 --start-child=xfce4-session --exit-with-children
:7
は xorg の DISPLAY セッションの数字--start-child=xfce4-session
は xpra サーバーの子プロセスとして xfce4 セッションを実行--exit-with-children
はセッションからログアウトした (子プロセスが終了) 際にサーバーを終了
アタッチするには (サーバー側で実行):
$ xpra attach :7
アタッチするには (クライアント側で実行):
$ xpra attach ssh:user@example.com:7
デタッチするにはターミナルで ctrl+c を押すか以下のコマンドを実行:
$ xpra detach :7
シャドウリモートデスクトップの実行
既存のディスプレイサーバーを複製するには:
- ssh でログインしているユーザーと同じユーザーでディスプレイを認証する必要があります。
- ディスプレイをリモートスクリーンで表示する必要があります。
シャドウデスクトップを実行するにはクライアント側で以下のコマンドを実行:
$ xpra shadow ssh:DISPLAY_user@example.com:DISPLAY_number
Xorg サンドボックスとして実行
Firejail を使うことでサンドボックスを作成できます:
- アプリケーションのサンドボックスの場合 (
eth0
は適当なインターフェイス名かnone
に置き換えてください):
$ firejail --x11=xpra --net=eth0 firefox
- xpra をアタッチする場合:
$ firejail --net=eth0 xpra [...]
ヒントとテクニック
ブート時に起動
サーバー
systemd ユニットを使うことで xpra サーバーをブート時に起動することができます。
ユニットファイルを作成:
/etc/systemd/system/xpra@.service
[Unit] Description=xpra display [Service] Type=simple User=%i EnvironmentFile=/etc/conf.d/xpra ExecStart=/usr/bin/xpra --no-daemon start ${%i} [Install] WantedBy=multi-user.target
そして設定を作成して、xpra ディスプレイを表示したいユーザーの行を追加します:
/etc/conf.d/xpra
myusername=:7
ディスプレイを表示するユーザーを指定してサービスを有効化してください。上記の例なら、サービスは次のようになります: xpra@myusername.service
。
クライアント
方法 1: .xinitrc
~/.xinitrc
ファイルに接続を開始するのに必要な行を追加してください。行末には & を付けます。
exec
行の前に追加するようにしてください。
例えば、リモートクライアントの場合なら以下のようになります:
~/.xinitrc
xpra attach ssh:user@example.com:7 &
方法 2: systemd ユーザーセッション
systemd ユーザーセッションを使うようにセッションを設定します。詳しくは Systemd/ユーザー を参照。
以下のサービスユニットを作成:
$HOME/.config/systemd/user/xpra-client@.service
[Unit] Description=xpra client [Service] Type=simple EnvironmentFile=%h/.config/conf/xpra_client ExecStart=/usr/bin/xpra attach %i $OPTS [Install] WantedBy=default.target
適当なオプションを使って設定ファイルを作成:
$HOME/.config/conf/xpra_client
OPTS=--encoding=jpeg --quality=90
サービス名は xpra-client@ssh:username@hostname:<display number>.service
という形式になります。例:
xpra-client@ssh:myuser@example.com:7.service
サービスを有効化してください。systemctl
コマンドに --user
フラグを付けるのを忘れずに。
トラブルシューティング
Error: Only console users are allowed to run the X server
エラーによって実行が失敗する場合 /etc/X11/Xwrapper.config
ファイルを以下の内容で作成してください:
/etc/X11/Xwrapper.config
allowed_users=anybody