Neden iki ayrı X server tek GPU'da çalışmaz (ve bunun yerine ne yapmalı)

Bu, Ubuntu 26.04’te 30 saniyede Chromium Kiosk kurulumu yazısının devamı ve tek X server ile ikinci ekranda ikinci program çalıştırma yaklaşımının alternatifidir.

TL;DR: Aynı anda görünür iki X server (:0 ve :1) tek GPU’yu paylaşamaz. İkinci server başlangıçta drmSetMaster failed: Device or resource busy ile ölür. Bu kurulum sadece iki GPU’nuz varsa (veya ayrı bir seat’teki USB DisplayLink adaptörü gibi ikinci bir görüntü cihazı) çalışır. Tek GPU’da bunun yerine tek-X-server yaklaşımını kullanın — gerçekten çalışan odur.

Ne denedik ve nerede başarısız oluyor

Fikir: ekran 1 için startx ... :0 çalıştıran mevcut kiosk.service‘i tut ve ekran 2 için :1‘de ikinci bir X server çalıştıran kiosk2.service ekle. Kiosk için bu cazip — her ekran kendi DISPLAY‘ini, kendi oturumunu alır ve crash/restart’lar bağımsızdır.

Problem 1: startx konsolu bulamıyor

systemd servisi içindeki ikinci startx hemen başarısız olur:

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 servislerinin controlling terminal’i yoktur, bu yüzden startx VT’yi otomatik algılayamaz. Servise TTYPath=/dev/tty7 + StandardInput=tty vermek algılamayı düzeltir ama PAM login oturumunu takıltır — tty7 ilk X server altında zaten grafik modunda (KD_GRAPHICS), bu yüzden üzerinde konsol I/O yapmaya çalışan her şey sonsuza dek bloklanır.

Problem 2: Sadece bir DRM master’a izin var

startx‘i atlayıp Xorg :1‘i doğrudan çalıştırmak daha ileri gider — server GPU’yu probe eder, hatta glamor’u initialize eder — ama sonra ölür:

/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).

Kernel modesetting ile aynı anda tam bir process /dev/dri/card*‘ın DRM master’ı olabilir. :0 server’ı VT’si aktif olduğunda master’ı kapar ve — VT-switch yapamadığımız için (switch ekran 1’i karartır) — asla bırakmaz. -sharevts -novtswitch yardım etmez: bu flag’ler Xorg’un VT switch yapmasını durdurur ama ikinci server modeset için hâlâ DRM master’a ihtiyaç duyar ve onu alamaz. Eski çoklu Zaphod-head tarifleri KMS driver’larından önceye ait; artık geçerli değiller.

İki X server’ın çalıştığı durumlar

  • İki GPU: her Xorg farklı /dev/dri/card*‘ın master’ı olur. Her kartı loginctl attach veya udev ID_SEAT tag’leriyle kendi seat’ine ata, her server’a kendi VT’sini ver ve gerçek multiseat elde et.
  • USB görüntü adaptörleri (DisplayLink/udl): adaptör ayrı bir DRM cihazıdır, yani ikinci bir Xorg ona sahip olabilir.

Tek GPU’da bunun yerine ne yapmalı

İki monitöre yayılan tek X server kullan ve ikinci uygulamayı monitör 2’ye sabitle — normal uygulamalar için openbox rc.xml <monitor>2</monitor> kuralıyla veya --kiosk Chromium (openbox yerleşimini yok sayar) için xdotool/wmctrl pencere taşımayla. Tam talimatlar: Tek X server ile ikinci ekranda ikinci program çalıştırma.

Yaklaşımdan bağımsız bir bonus ipucu: kiosk unit’inin [Service] bölümüne TimeoutStopSec=5 ekle. Varsayılan 90s stop timeout, X crash’in ortasındayken her systemctl restart kiosk.service‘i bir buçuk dakika takıltır.


Check out similar posts by category: Ubuntu Linux