Xpra

提供: ArchWiki
移動先: 案内検索

Xpra は 'screen for X' です: リモートホストで X プログラムを実行して、ディスプレイをローカルマシンに飛ばすことができ、状態を維持したままプログラムから切断して他のマシンから再接続できます。Xpra を使うことで個別のアプリケーションにリモートアクセスすることが可能になります。

  • Xpra は "rootless" あるいは "seamless" です: Xpra で実行したプログラムは普通のプログラムと同じようにデスクトップに表示され、ウィンドウマネージャで管理されます。
  • SSH を通してセッションにアクセスしたり、パスワードで保護した平文の TCP ソケットを使うことができます。
  • Xpra は接続速度が遅くても使うことができ、ネットワークの帯域幅の変化に対応します (アダプティブ JPEG モードを参照)。
  • Xpra はオープンソース (GPLv2+)、マルチプラットフォーム、多言語対応です。クライントは Python と Java で書かれています。

インストール

サーバーとクライントの両方で AUR から xpra-winswitchAUR パッケージをインストールしてください。

ヒント: nvidiaATi などのグラフィックドライバーを使って既存の Xorg セッションでローカルに Xpra を実行する場合、デフォルトの xpra の設定を変更する必要があります。Xpra は xorg-server-xvfb (/etc/X11/xorg.conf.d になります) から -configdir を取得しますが、そこで xpra をローカルに実行するために 1333056#p1333056 に書かれている手順に従って変更が必要です。

使用方法

アプリケーションを実行したいマシンで 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

詳しいマニュアルは man 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

クライアント

ノート: クライアントがリモートマシンの場合、まずは SSH 鍵を使ってパスワードを入力しなくてもサーバーに接続できるようにしてください。詳しくは SSH 鍵を参照。
方法 1: .xinitrc

~/.xinitrc ファイルに接続を開始するのに必要な行を追加してください。行末には & を付けます。

exec 行の前に追加するようにしてください。

例えば、リモートクライアントの場合なら以下のようになります:

~/.xinitrc
xpra attach ssh:user@example.com:7 &
方法 2: systemd ユーザーセッション

systemd ユーザーセッションを使うようにセッションを設定します。詳しくは Systemd/ユーザー を参照。

ノート: 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 フラグを付けるのを忘れずに。

参照