blog · git · desktop · images · contact & privacy · gopher


Mehrere getrennte X-Server für Spiele und Co.

Pathetische Einleitungstexte sind doof. Kurz und knapp: Diese News wird beschreiben, wie man es auf ganz einfachem Niveau - also ohne Loginmanager - bewerkstelligt, direkt beim Booten mehrere getrennte X-Server parallel zu starten.

Warum? Das hat mehrere Vorteile, insbesondere für Spiele:

Besonders RAM-intensiv oder so ist die Aktion auch nicht. Wenn ich nach dem Booten zwei X-Server laufen habe, davon einer meine normale Xfce-Umgebung, der andere ein Spiele-Server mit pekwm, dann zeigt mir htop einen Verbrauch von 93MB an.

Ich habe es bei mir so eingestellt, dass direkt ins X gebootet wird, ohne Anmeldung. Bei mir zuhause ist das in Ordnung. Bei Arch passiert das ganz klassisch über die /etc/inittab:

## Only one of the following two lines can be uncommented!
# Boot to console
#id:3:initdefault:
# Boot to X11
id:5:initdefault:

[...]

x:5:once:/bin/su USERNAME -l -c "/bin/bash --login -c startx-flex >/dev/null 2>&1"

Will man kein automatisches Anmelden etc, kann man ja auch immernoch einfach an die Console booten und dann bei Bedarf "startx-flex" eingeben oder das in die .bashrc tun. Ersteres ist zum Beispiel die Situation an meinem Notebook.

Mit "startx-flex" habe ich mir dann mein ganz eigenes, schlankes System für diesen Zweck geschaffen (Oha! ;)). Das Prinzip ist einfach und es sind auch nur simple Bash-Scripte:

In /etc/X11/sessions-flex/ liegen dann alle Einstellungen. Gestaltet sich folgendermaßen:

Die Files:

startx-flex

#!/bin/bash

# This script will take care of respawning a server if it got killed.
# In order to "detach" a server from it's keeper, just kill the keeper's
# process.
KEEPER="/usr/bin/startx-flex-keeper"

# Location of sessions-flex?
FLEXPATH="/etc/X11/sessions-flex"

# Servers to run. This is read from the following file, $FLEXSESSIONS
# will be set.
. "$FLEXPATH"/sessions.init

for i in $FLEXSESSIONS; do

    # let bash evaluate this file to get the env var's for this session:
    # - $XINITLINE      The arguments for this x-server
    # - $KEEPERWAIT     How long is a keeper supposed to wait after the
    #                   process died? 0 for no keeper
    . "$FLEXPATH"/"$i".init

    # now run this server
    if [ $KEEPERWAIT -gt 0 ]; then
        $KEEPER $KEEPERWAIT xinit "$FLEXPATH"/"$i".rc -- $XINITLINE >/dev/null 2>&1 &
    else
        xinit "$FLEXPATH"/"$i".rc -- $XINITLINE >/dev/null 2>&1 &
    fi

done

startx-flex-keeper

#!/bin/bash

# Wait after a process died. Prevents flood.
SAFETY=$1
shift

while true; do
    "$@"
    sleep $SAFETY
done

Hier noch ein einfaches Beispiel für zwei parallel zu startende Sessions:

/etc/X11/sessions-flex/sessions.init

# Servers to run. Just the order in which they will be run, doesn't affect
# $DISPLAY and stuff.
FLEXSESSIONS="games xfce"

/etc/X11/sessions-flex/games.init, also die Init-File für den Games-Server:

# This line will be passed to "xinit" AFTER the dashes!
# So the final call will be like: "xinit /path/to/rc -- $XINITLINE"
XINITLINE=":1 vt08"
KEEPERWAIT=15

Man sieht: Der Games-Server wird immer die Display-Nummer 1 haben und auf der virtuellen Console 8 liegen (also per STRG+ALT+F8 erreichbar). Hier muss man selbst darauf achten, dass man keine Kollisionen fabriziert.

/etc/X11/sessions-flex/games.rc, Auszug:

# --- MOUSE AND KEYBOARD SETTINGS, BLANKING
xset m 0 0 &
xset r rate 200 30 &

xset s off &
xset -dpms &

# start some nice programs
numlockx &
pekwm &
urxvt -geometry 75x28+1164+0 &
urxvt -geometry 75x28+1164+600 &
exec urxvt -geometry 115x58+0+0

Okay, analog müsste man jetzt noch "xfce.init" und "xfce.rc" anlegen und hier vorallem Display-Nummer und virtuelles Terminal anpassen.

Es müsste übrigens auch möglich sein, in der $XINITLINE die Parameter "-conf" oder "-layout" zu nutzen, näheres enthüllt "man Xorg".

Natürlich fehlen hier Abfragen für Fehlerfälle quasi komplett. ;) Ein solches Setup hätte mir zu meinen aktiven Gaming-Zeiten unglaublich viele Nerven sparen können ... dummerweise ist sowas bei Windows unmöglich.

TODO: