リモートマシンのgnuplotでX11が動かない場合の対処法
サーバーの環境:Fedora 36
サーバーのLinux環境は以下の通り.
$ cat /etc/os-release
NAME="Fedora Linux"
VERSION="36 (Server Edition)"
ID=fedora
VERSION_ID=36
VERSION_CODENAME=""
PLATFORM_ID="platform:f36"
PRETTY_NAME="Fedora Linux 36 (Server Edition)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:36"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f36/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=36
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=36
PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy"
VARIANT="Server Edition"
VARIANT_ID=server
X11フォワーディング
gnuplot
をはじめとするグラフィックを使うアプリケーションをリモートマシンで動作させる場合,自分のPCでXquartz(X11)を起動させてグラフィックの表示に使うのが常である.リモートアプリケーションの命令がsshを通して自分のPCに送られ,その命令をXquartzが描画する流れだ.これはsshのX11 ポートフォワーディングを使って可能になる.具体的にはXオプションまたはYオプション(こっちはtrusted x11)をつける.
ssh -X username@remotehost
ssh -Y username@remotehost
または.ssh/config
ファイルに
ForwardX11 yes # X option
Forwardx11trusted yes # Y option
を追記しても良い.
今回はこのようにXまたはYオプションをつけてもX11転送がうまくいかなかったのでその場合の対処について.
1 ローカルマシンの設定の変更
もし問題が起こっているサーバーが自分が管理しているサーバーではない場合,その原因は(多分サーバーは専門家が管理しているだろうから)自分のローカルマシンのことが多いと思う.
自分の場合はまさにこれで,サーバー上でInvalid MIT-MAGIC-COOKIE-1 key
と表示される問題が発生した.この場合,ローカルマシンでxhost
の設定を確認する.このコマンドはXサーバへのアクセスの許可不許可を設定する.
$ xhost
xhost
access control enabled, only authorized clients can connect
LOCAL:
このように表示されればローカルホストが追加されていて大丈夫だが,もし何もなければ
$ xhost +local:
でローカルホストを追加する.これで再度ssh接続して問題なければOK.
2 : 自分がサーバー管理者の場合の/etc/ssh/ssh_configの確認
自分がサーバー管理者の場合,サーバーのsshの設定でX11フォワードを許可しないといけない.このためには/etc/ssh/ssh_config
ファイルに以下の2行を追記する.
X11Forwarding yes
# ForwardX11Trusted yes これはTrustedX11を許可する場合にyesにする.
X11UseLocalhost no ← これが重要?
X11Forwardingが最も重要で,これがX11フォワードを許可する設定で必須.ForwardX11Trustedを許可するかどうかは時と場合によってだと思うので今回は触れない.
最後のX11UseLocalhost
はオプションで,サーバーの設定によってyesかnoかで結果が違うことがあるように思う.まず,このオプションはDISPLAY
環境変数の設定に影響する.この環境変数はXクライアントがどのXサーバーに接続するかを指定するもので,
hostname:D.S
という形をとる.ここで
- hostname: Xサーバーが走っているマシン(ここだとリモートサーバー)
- D: Sequence number,0のことが多い.
- S: Screen number, 0のことが多い.
X11UseLocalhost
をyes
とした場合,
$ echo $DISPLAY
localhost:10.0
のようにhostname部分がlocalhost
になる.一方でX11UseLocalhost
をno
にするとここには直接IPが入って
$ echo $DISPLAY
10.0.5.251:10.0
のようになる.どちらが良いかは環境によりそうで,自分のサーバーではno
にしたところうまく行ったのでそれを利用しているが原因は不明. もちろん,環境変数を直接手で
export DISPLAY=localhost:0.0
のように指定することも可能なのでトラブルシューティング時に活用されたい.
さて,以上の要領でssh_config
ファイルを編集したらsshdデーモンを再起動する.
sudo systemctl restart sshd
一度ログアウトしてから再度ログインしてX11転送が成功していればOK.
3:X11の調査に有用なアプリ
ちなみにこの調査をやる時にはxeyes
という可愛いグラフィックを表示するアプリがおすすめ.Fedoraだと
# インストール
$ sudo dnf -y install x11-apps
# 起動
$ xeyes
とすれば良い.
4 qtがうまく動かない場合
gnuplotでX11同様qtも動かなかったので,その対処法.今回はqtのライブラリのパスの設定がおかしかったことが原因だった.
まず,gnuplotで
gnuplot
> plot x
とすると
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
となって止まってしまう問題が発生した.まずはexport QT_DEBUG_PLUGINS=1
という環境変数を設定してから再度実行する.すると
Got keys from plugin meta data ("vnc")
QFactoryLoader::QFactoryLoader() looking at "/usr/lib64/qt5/plugins/platforms/libqxcb.so"
Found metadata in lib /usr/lib/qt/plugins/platforms/libqxcb.so, metadata=
...略
のようにデバック表示をしてくれる.今回はこれでlibqxcb.so
というライブラリをロードする時に問題があることがわかったので,このライブラリのリンクが大丈夫かどうかをldd
コマンドで確認する.
$ ldd /usr/lib64/qt5/plugins/platforms/libqxcb.so
ここでリンクしているライブラリの一覧がずらずら出てくるが,そこにnot found
とあった場合,依存しているライブラリが見つかっていないことを意味する.これはpathの設定(LD_LIBRARY_PATH)がおかしいか,そもそもそのライブラリがインストールされていないかの二つの可能性がある.前者なら
ライブラリの場所をfind
やlocate
コマンドを使って探した上で
export LD_LIBRARY_PATH=/usr/lib64:$LD_LIBRARY_PATH
のような内容を.bash_profileに追記すれば良いし,ライブラリがインストールされていない場合は
dnf whatprovides ライブラリ名
としてライブラリが入っているパッケージを何かインストールすれば良い.そのほかに一応qt5
とqt5-devel
の再インストールも試したがこちらは特に効果がなかった.
参考文献
https://forum.qt.io/topic/93247/qt-qpa-plugin-could-not-load-the-qt-platform-plugin-xcb-in-even-though-it-was-found