blog · git · desktop · images · contact
2008-07-25
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:
startx-flex
: Startet alle X-Server auf einmal. Dabei startet es
eventuell für jeden Server einen kleinen "Keeper", der den
jeweiligen Server automatisch (nach kurzer Wartezeit) neu startet,
falls dieser mal beendet wird.startx-flex-keeper
: Wie schon gesagt, pro Server ein Keeper. Die
Wartezeit ist absichtlich eingebaut, damit man nicht in einer
gnadenlosen Endlosschleife landet, falls sich mal ein X-Server nicht
starten lässt. Daher empfiehlt sich auch eine Wartezeit von
mindestens 10 Sekunden, um ansatzweise eine Chance zur Reaktion zu
haben.In /etc/X11/sessions-flex/ liegen dann alle Einstellungen. Gestaltet sich folgendermaßen:
sessions.init
: Hier drin steht, welche Server gestartet werden
sollen. Die Namen hier bestimmen die Dateinamen für die folgenden
beiden "Dateitypen".*.init
: Hier werden alle Umgebungsvariablen für einen Server
gesetzt, also z.B. der Aufruf an "X" oder die Wartezeit für den
Keeper (0 = kein Keeper).*.rc
: Diese Dateien werden dann als "xinitrc" genutzt. Hier kann
Xfce, GNOME oder was auch immer gestartet werden.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: