ヘッドレス サーバーで gnome-terminal をリモートで起動するにはどうすればよいですか? (X11 転送経由で起動できません)

ヘッドレス サーバーで gnome-terminal をリモートで起動するにはどうすればよいですか? (X11 転送経由で起動できません)

私はヘッドレス VM (Ubuntu サーバー 17.04 を実行) を持っており、SSH を使用してアクセスしています。X11 転送の基本は理解しており、xterm やその仲間を問題なく転送できます。XFCE ターミナルも問題なく転送できます。

Gnome ターミナルを使いたいのですが、起動しないようです。代わりに、しばらくハングアップし、最終的に次のエラーが発生します。

Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: Error calling StartServiceByName for org.gnome.Terminal: Timeout was reached

興味深いことに、VM 上でローカル デスクトップ セッションが実行されている場合 (startx 経由で起動)、gnome-terminal は X11 経由でリモートで動作します。

何らかの Gnome サービスが実行されている必要があると推測していますが、それが何であるか、または完全なデスクトップ セッションのコンテキスト外でそれを起動する方法がわかりません。VM はデフォルトでヘッドレスであるため、通常はそれらを起動しません。

自分の VM 上で GUI デスクトップ セッションをローカルに開始せずに、Gnome ターミナルをリモートで動作させるにはどうすればよいか、誰か知っている人はいませんか?

答え1

それはうまくいかない。なぜならgnome-terminal(他のgnome-thing) は dbus への接続を試みますが、長時間応答を受信しないため失敗します。

最も簡単な回避策は、セッション用に dbus インスタンスを開始することです。

export $(dbus-launch)
gnome-terminal

もしあなたがウェイランドセッションリモートを最初に実行してからマシンが起動していない場合はexport $(dbus-launch)、再度実行する必要があります。そうしないと、転送されたディスプレイ上の X11 インスタンスではなく、リモート ディスプレイ上gnome-terminalの Wayland インスタンスが起動されますgnome-terminal

gnome-terminal-serverこの場合の別の回避策は、それを使用している最後のウィンドウが閉じられた後に終了するX11 を明示的に実行することです。例:

#! /bin/bash
ID=foo.bar$RANDOM
GDK_BACKEND=x11 /usr/libexec/gnome-terminal-server --app-id "$ID" &
sleep .4        # yuck
gnome-terminal --app-id "$ID"
wait

答え2

標準の Ubuntu または Debian では、次のコマンドで実行できます。

ssh -X user@host dbus-launch gnome-terminal

私のメモには、次のdbus-launchような共通のフラグがあります。--exit-with-x11または--exit-with-session

残る問題は、読み込みに時間がかかることです。

私の意見では、ローカルがgnome-terminalリモートと通信するようですgnome-terminal-server。コードをダウンロードして変更する必要がありますが、かなり単純なソフトウェアです。単純すぎるのです。

編集: さらに、パッケージを必要とせずにこれを行うことができますx11-dbus(パッケージは小さいですが、デフォルトでは Ubuntu に含まれていません)。

これはすべてのバージョンで動作するわけではありませgnome-terminalんが、Ubuntu 22 と Debian 11 でテストしたところ、動作しました。

ssh -X user@host gnome-terminal --disable-factory

これらのアプローチには、ターミナル コマンドのスタイルや長さ以外にも違いがあります。

元のアプローチでは、リモート マシンとのやり取り方法に応じてインスタンスdbus-launchが起動されます。gnome-terminalgnome-terminal-server

ただし、この--disable-factoryアプローチではインスタンスが起動されgnome-terminal、たとえば Ubuntu 22 ドックとよりシームレスに動作します。

これら 2 つのオプションのいずれかが要件を満たしてくれることを願っています。他のアプローチもありますが、私の意見では、これらが最も簡単なので最適です。

答え3

単一セッションからのX11転送の単純なケースでは、 https://askubuntu.com/a/1279065/463121

ログイン後:

$ dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY

そして、gnome-terminal は高速で、X11 経由で問題なく転送されます。

問題が発生し始めた場合は、個人の dbus デーモンが停止している可能性があります。すべてのユーザー プロセスを終了して再度ログインできる場合は問題ありません。

編集: あるいは:

$ dbus-update-activation-environment --all

からhttps://unix.stackexchange.com/a/243696/139357

答え4

X 経由でアプリを起動すると、非常に遅くなる可能性があります。
私は世界中の顧客システムで SSH 経由で VNC をトンネリングすることに成功しました。

リモート マシンで、tigervnc などの VNC サーバーをインストールし、デーモンを起動します。(yum install -y tigervnc-server ; vncserver :3 - または使用する任意のポート)。パスワードを設定するように求められます。

ローカルマシンにVNCクライアントをインストールします(yum install -y tigervnc)。「exec /usr/bin/gnome-terminal」を~/.vnc/xstartupファイルに追加します。次に、次のコマンドを実行します:ssh -L 5903:localhost:5903 -N -f -l user remote-server-IP-or-hostnameここでのポート番号は59で、選択したポート番号になります。

別のターミナルで次を実行します: vncviewer :3

サーバーに設定されているパスワードの入力を求められます。

関連情報