"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

X Server per xrandr steuern - von außerhalb der laufenden X Session

GrandAdmiralThrawn 15.11.2018 - 11:14 1585 3
Posts

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ich habe aktuell das Problem, daß ich eine X Session per xrandr steuern möchte, allerdings automatisiert, d.h. von außerhalb der laufenden X Session.

d.h. ein System fährt hoch, zieht sich dann über's Netzwerk ein Konfigurationsskript, daß eine Maschine in einen gewissen Zustand versetzt (da gehören zig andere Sachen auch dazu).

Jetzt soll auch die Outputkonfiguration über dieses Skript, das von Init gesteuert im Hintergrund läuft verändert werden.

Ich habe dazu Code geschrieben, der nach einer laufenden Window Manager Session sucht (weil dann ist das X sicher schon up), und wenn diese vorhanden ist, versucht das Ding per xrandr einen Klonmodus einzustellen, wie folgt:

Code:
xrandr --output DVI-D-1 --same-as VGA-1
xrandr --output HDMI-4 --same-as VGA-1

Es wird also VGA-1 auf DVI-D-1 und HDMI-4 geklont. Rufe ich diese Befehle von innerhalb der laufenden X Sesson (hier: von einem LXDE Terminal) auf, funktioniert alles, egal ob ich der User bin, der die Session ursprünglich gestartet hat, oder ob ich root oder sonstwer bin. Es geht einfach, solange ich in der Session drinsitze.

Wechsle ich aber per <CTRL>+<Alt>+<F1> auf ein TTY1 raus, kann ich das Display von dort nicht mehr steuern, auch dann nicht, wenn ich das laufende Display korrekt spezifiziere:

Code:
xrandr -d :0.0 --output DVI-D-1 --same-as VGA-1
xrandr -d :0.0 --output HDMI-4 --same-as VGA-1

Man bekommt dann "Configure crtc 0 failed" oder "Configure crtc 1 failed". versucht man z.B. per "--size 1024x768" die Auflösung zu ändern, erhält man "Failed to change the screen configuration".

echo $DISPLAY in der laufenden X Session liefert :0.0 zurück, also das Display paßt. Wenn ich ein falsches Display wie etwa :0.1 angebe, kommt ja auch eine andere Fehlermeldung, wie etwa "Can't open Display :0.1"

Wenn ich vor dem Aufruf der xrandr Kommandos auf einer root shell mit der ich das machen will lokal das korrekte Display setze (# export DISPLAY=:0.0) hilft das auch nicht.

Und genau dasselbe Problem habe ich halt beim Versuch, das ganze automatisiert zu lösen.

Faszinierend ist: Prinziell ansprechen geht aber!

"xrandr -d :0.0 -q" zum Beispiel zeigt mir korrekt die Konfig des aktuell laufenden Displays! Ich kann's nur nicht umstellen.


Daher abschließend meine Frage: Wie kann ich ein X Display mit xrandr von außerhalb der laufenden X Session rekonfigurieren?

Kirby

0x19
Avatar
Registered: Jun 2017
Location: Lesachtal/Villac..
Posts: 822
also du willst den gleichen output auf beiden bildschirmen?

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
In dem Fall sind es drei Schirme. Genau genommen eigentlich zwei Schirme und vier Beamer (da wird auch hardwaretechnisch noch geklont, außerhalb vom Rechner).

Aber das ist nicht wichtig. Der Rechner hat einfach 3 Ausgänge: VGA-1, DVI-D-1 und HDMI-4, und ja, das soll alles geklont werden. Innerhalb der X Session, also in einem laufenden LXDE in dem Fall funzt das alles ohne Probleme. Ich kann das per arandr oder per xrandr auf'm grafischen Terminal einstellen, und es haut hin.

Wie gesagt will ich das aber auch von außerhalb der laufenden X Session einstellen können. Also das X und LXDE laufen jetzt (sagen wir Mal), dann startet im Hintergrund automatisch mein Skript und soll diese Rekonfiguration erledigen, damit es der Benutzer des Systems nicht manuell machen muß auf der Maschine. Viele der Nutzer vergessen mit der Zeit nämlich einfach, wie arandr zu bedienen ist, und flippen dann, wenn die Ausgabe nicht paßt...

GrandAdmiralThrawn

XP Nazi
Avatar
Registered: Aug 2000
Location: BRUCK!
Posts: 3682
Ok, es funzt jetzt! Ich habe einen Fehler gemacht, nämlich den zu denken, daß sich die Displays gleich verhalten würden, wenn's aktiv sind und wenn man grade mit <Ctrl>+<Alt>+<F1> o.ä. auf einer lokalen TTY sitzt. Wechselt man das System auf eine TTY, dann können die Displays nicht mehr rekonfiguriert werden! Weder lokal noch remote (SSH Terminal). Auch dann nicht, wenn man das korrekte Display spezifiziert. Man kann nur mehr Werte auslesen, aber nichts ändern (auch nicht die Auflösung o.ä.).

Ist die X Session aber aktiv, sitzt der User also aktiv auf der grafischen Oberfläche, dann funktioniert das Setzen im Hintergrund per Initscript gesteuert sehr wohl. Ich hatte nur in meinem Automatismus das -d :0.0 vergessen gehabt!

In meinem Bash Konfigurationsskript, das die jeweiligen Maschinen (und Räume) zur Bootzeit gemäß der gerade bestehenden Anforderungen herrichtet steht jetzt folgender sicherlich recht schmutziger kleiner Hack:
Code:
(
IsXpresent=0;
while [[ ${IsXpresent} = 0 ]]; do
  sleep 2
  if [[ $(ps ax | grep lxsession | grep -v grep) ]]; then
    xrandr -d :0.0 --output DVI-D-1 --same-as VGA-1
    xrandr -d :0.0 --output HDMI-4 --same-as VGA-1
    IsXpresent=1;
  fi
done
) &

Der prüft also in einer Subshell alle zwei Sekunden, ob schon eine lxsession up ist, und wenn ja, setzt er die Befehle zum Klonen der Displays ab und terminiert die Schleife und die Subshell. Ende gut, alles gut! :)

War also tlw. meine Schuld.

Nur interessant, daß ich die Displays im Hintergrund (also wenn ich lokal auf einer Shell und nicht auf'm laufenden X sitze) nicht steuern, sondern nur auslesen kann. Ich dachte sowas würde gehen, grade bei einem System mit Kernel Modesetting. Ist aber scheinbar nicht so.
Bearbeitet von GrandAdmiralThrawn am 16.11.2018, 14:34
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz