なぜ2つの別々のXサーバーは単一GPUでは動作しないか(そして代わりに何をすべきか)

これは Ubuntu 26.04 で30秒で Chromium Kiosk をセットアップする方法 の続編であり、1つのXサーバーで2つ目の画面に2つ目のプログラムを実行する 代替アプローチ。

TL;DR:同時に表示される2つのXサーバー(:0 と :1)は1つのGPUを共有できない。 2つ目のサーバーは起動時に drmSetMaster failed: Device or resource busy で死ぬ。このセットアップは2つのGPUがある場合(または別のシート上の USB DisplayLink アダプタのような2つ目の表示デバイス)にのみ機能する。単一GPUでは代わりに単一Xサーバーアプローチを使う——それが実際に動作するもの。

試したこと、そして失敗する場所

アイデア:既存の kiosk.service が画面1用に startx ... :0 を実行しているのを維持し、画面2用に :1 で2つ目のXサーバーを実行する kiosk2.service を追加。キオスクには魅力的——各画面が独自の DISPLAY、独自のセッションを持ち、クラッシュ/再起動が独立。

問題1:startx がコンソールを見つけられない

systemd サービス内の2つ目の startx は即座に失敗:

journalctl -u kiosk2.service
(startx)[4247]: pam_unix(login:session): session opened for user kiosk(uid=1001) by kiosk(uid=0)
startx[4283]: Couldn't get a file descriptor referring to the console.
kiosk2.service: Main process exited, code=exited, status=1/FAILURE

systemd サービスには制御端末がないので、startx は VT を自動検出できない。サービスに TTYPath=/dev/tty7+StandardInput=tty を与えると検出は修正されるが、PAM ログインセッションがハングする——tty7 は最初のXサーバーの下で既にグラフィックスモード(KD_GRAPHICS)なので、それでコンソール I/O を試みるものはすべて永遠にブロックされる。

問題2:DRM マスターは1つだけ

startx を迂回して Xorg :1 を直接実行するとさらに進む——サーバーはGPUをプローブし glamor を初期化さえする——が、その後死ぬ:

/var/log/Xorg.1.log
(II) xfree86: Adding drm device (/dev/dri/card1)
(II) modeset(0): glamor: Using OpenGL 4.6 context.
(II) modeset(0): glamor X acceleration enabled on AMD Radeon Vega 8 Graphics (...)
(EE) modeset(0): drmSetMaster failed: Device or resource busy
(EE) AddScreen/ScreenInit failed for driver 0
(EE) Server terminated with error (1).

カーネルモード設定では、一度に正確に1つのプロセスだけが /dev/dri/card* の DRM マスターになれる。:0 サーバーはその VT がアクティブになるときにマスターを掴み、そして——VT 切り替えができないので(切り替えると画面1がブランクになる)——決して解放しない。-sharevts -novtswitch は助けにならない:それらのフラグは Xorg が VT 切り替えを行うのを止めるが、2つ目のサーバーは依然としてモード設定に DRM マスターが必要で、それを持てない。古いマルチ Zaphod-head レシピは KMS ドライバ以前のもの;もはや適用されない。

2つのXサーバーが機能する場合

  • 2つのGPU:各 Xorg が異なる /dev/dri/card* のマスターを取る。各カードを loginctl attach または udev ID_SEAT タグで独自のシートに割り当て、各サーバーに独自の VT を与えれば、真のマルチシートが得られる。
  • USB ディスプレイアダプタ(DisplayLink/udl):アダプタは別の DRM デバイスなので、2つ目の Xorg がそれを所有できる。

単一GPUで代わりにすべきこと

両方のモニターにまたがる1つのXサーバーを使い、2つ目のアプリケーションをモニター2にピン留めする——通常のアプリには openbox rc.xml <monitor>2</monitor> ルール、または --kiosk Chromium(openbox 配置を無視する)には xdotool/wmctrl ウィンドウ移動。完全な手順:1つのXサーバーで2つ目の画面に2つ目のプログラムを実行する方法。

アプローチに関わらずボーナスのヒント:キオスクユニットの [Service] セクションに TimeoutStopSec=5 を追加。デフォルトの90秒停止タイムアウトは、X がクラッシュの途中にあるとき、すべての systemctl restart kiosk.service を1分半ハングさせる。


同じカテゴリの類似記事をチェック: Ubuntu Linux