Xpra

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

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

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

インストール

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

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

使用方法

詳しいマニュアルは 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
ヒント: 画面の解像度は xrandr で変更できます。

シャドウリモートデスクトップの実行

既存のディスプレイサーバーを複製するには:

  • 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 [...]
ノート: --net=eth0 はネットワーク用の名前空間を作成して xorg やシステムソケットを xpra から遮蔽します。この設定を行わないとサンドボックスはあまり意味をなしません (issue-54#153757284)。

ヒントとテクニック

ブート時に起動

サーバー

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

トラブルシューティング

Error: Only console users are allowed to run the X server

エラーによって実行が失敗する場合 /etc/X11/Xwrapper.config ファイルを以下の内容で作成してください:

/etc/X11/Xwrapper.config
allowed_users=anybody

参照