Ubuntu 12.04 Precise Pangolin
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Multiseat ist die englische Bezeichnung für einen Mehrplatzrechner. Mit einem solchen System ist es möglich, mit mehreren Benutzern zur gleichen Zeit unabhängig an einem Computer zu arbeiten. Jeder Benutzer besitzt einen eigenen Monitor, eine Tastatur, Maus und auch einen eigenen Desktop. Während dieser Ansatz in den westlichen Industrienationen eher selten ist, gewinnt er in vielen anderen Teilen der Welt an Bedeutung.
Ein Beispiel: ein Vierkern-Prozessor kann auf diese Weise bis zu 10 Office-Arbeitsplätze gleichzeitig bedienen, spart aber die Anschaffung und den Energiebedarf für 9 weitere Rechner ein. Weitere Vorteile liegen in der Systempflege und der gemeinsamen Nutzung von Druckern etc. (Quelle: The world's largest Linux desktop deployment ).
Viele Bereiche von Ubuntu sind noch nicht an einen Multiseat-Betrieb angepasst und es kann an einigen Stellen zu Einschränkungen kommen. Außerdem gibt es noch einige ungelöste Bugs, sodass sich in jedem Fall das Studieren des Abschnitts mit häufigen Problemen und der einschlägigen Bug-Tracker lohnt.
Ein Mehrplatzrechner stellt höhere Anforderungen an das verwendete System. Sollte ein Benutzer die Ressourcen des Systems voll auslasten, sind alle weiteren Benutzer in dieser Zeit nur eingeschränkt arbeitsfähig. Ein schneller Prozessor mit 2 Kernen und mindestens 2 GB Arbeitsspeicher sollten vorhanden sein, um sinnvoll arbeiten zu können. Weiter müssen für jeden Benutzer eine Grafikkarte, ein Bildschirm, eine Tastatur und eine Maus zur Verfügung gestellt werden. Grundsätzlich können Grafikkarten verschiedener Hersteller gemischt werden, sofern nur freie Treiber zum Einsatz kommen. Verwendet man hingegen proprietäre Treiber, so werden bestimmte Bibliotheken überschrieben, sodass andere Grafiktreiber nicht oder nur eingeschränkt funktionieren. Wenn möglich, sollten also alle Grafikkarten vom selben Hersteller sein, um Probleme zu vermeiden.
Zunächst muss die PCI-Adresse der Grafikkarten ermittelt werden. Falls eine auf dem Mainboard integrierte Grafikkarte (onboard) und eine weitere Grafikkarte parallel betrieben werden soll, muss vorher im BIOS der Parallelbetrieb beider Grafiksysteme aktiviert werden. Auch wenn viele moderne Mainboards dies unterstützten, ist diese Option standardmäßig deaktiviert, um Strom zu sparen.
Mit folgendem Befehl können die internen PCI-Adressen der Grafikkarten ermittelt werden [1][2].
lspci | grep -i 'vga\|graphic'
Beispielausgabe:
00:02.0 Display controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) 01:00.0 VGA compatible controller: ATI Technologies Inc Cedar PRO [Radeon HD 5450]
Die PCI-Adresse (im Beispiel: 00:02.0 und 01:00.0) werden im Folgenden für die Zuordnung der Seats benötigt.
Für jeden Benutzer wird jeweils eine eigene Konfiguration (Seat) angelegt [3][4], um einen separaten XServer zu ermöglichen. Dabei sollte immer möglichst wenig vorkonfiguriert werden und stattdessen die Autokonfiguration genutzt werden. Die Konfigurationsdateien werden im Ordner /etc/X11/ angelegt. Für ein System mit zwei Seats kann dies wie folgt aussehen:
xorg_seat1.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Section "Device" Identifier "Seat1" Driver "intel" # Hier den Grafikkartentreiber einstellen z.B. Intel, AMD BusID "PCI:0:2:0" # Hier die BusID anpassen EndSection Section "InputClass" Identifier "ignore_other_seats" Option "Ignore" "yes" EndSection Section "InputClass" Identifier "use_seat_devices" MatchTag "input_seat1" Option "Ignore" "no" EndSection |
xorg_seat2.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Section "Device" Identifier "Seat2" Driver "ati" # Hier den Grafikkartentreiber einstellen z.B. Intel, AMD BusID "PCI:1:0:0" # Hier die BusID anpassen EndSection Section "InputClass" Identifier "ignore_other_seats" Option "Ignore" "yes" EndSection Section "InputClass" Identifier "use_seat_devices" MatchTag "input_seat2" Option "Ignore" "no" EndSection |
In jeder Konfigurationsdatei gibt es zwei Abschnitte InputClass. Der erste Abschnitt blockiert zunächst alle Eingabegeräte, wobei der zweite wieder selektiv Eingabegeräte mit einem bestimmten MatchTag zulässt. Welche Eingabegeräte zugeordnet werden, wird später mittels udev-Regeln eingestellt. Für jeden weiteren Seat lassen sich analog weitere Konfigurationen hinzufügen.
Werden Konfigurationen für den XServer aktiviert, die ausschließlich Eingabegeräte mit einer bestimmten Kennzeichnung verwenden, müssen entsprechende udev-Regeln erstellt werden. Anderenfalls lassen sich keine Eingaben tätigen.
Um Problemen vorzubeugen, sollten die PCI-Adressen in den Konfigurationsdateien einstellig angegeben werden. Aus 00:02.0
wird so 0:2:0
.
Neben den individuellen Einstellungen der Seats können auch allgemeine Einstellungen, die für alle Seats gelten sollen, vorgegeben werden. Hierfür können im Verzeichnis /usr/share/X11/xorg.conf.d/ (bei Ubuntu 10.04 /usr/lib/X11/xorg.conf.d/) Konfigurationsdateien hinterlegt werden, die bei jedem Start eines XServers oder beim Entfernen und Hinzufügen von Eingabegeräten angewandt werden. Dabei sollten möglichst neue Dateien hinzugefügt werden und bestehende nicht geändert werden. Die Konfigurationen werden in alphanumerischer Reihenfolge anhand ihrer Dateinamen verwendet. Dazu beginnen diese mit 00...
, 01...
usw.
Um für alle Seats ein deutsches Tastaturmodell einzustellen, kann folgende Datei genutzt werden:
00-german-keylayouts.conf:
1 2 3 4 5 6 | Section "InputClass" Identifier "German Keyboard Layout" MatchIsKeyboard "yes" Option "XkbModel" "evdev" Option "XkbLayout" "de" EndSection |
Das generelle Aktivieren des XServer-Neustarts mit Strg + Alt + ⌫ ist wie folgt möglich:
00-x-restart-shortcut.conf:
1 2 3 4 5 6 | Section "InputClass" Identifier "Enable X Restart Shortcut" MatchIsKeyboard "yes" Option "XkbModel" "evdev" Option "XkbOptions" "terminate:ctrl_alt_bksp" EndSection |
Und das Deaktivieren des Grafikkartenlogos beim XServer-Start funktioniert mit:
00-nolog.conf:
1 2 3 4 | Section "Device" Identifier "Disable Logo" Option "NoLogo" "True" EndSection |
Um Eingabegeräte wie z.B. Tastaturen, Mäuse, Tablets usw. nur einzelnen Seats zugänglich zu machen, werden sie im Hotplug-Manager udev entsprechend gekennzeichnet. Zu diesem Zweck können Regeln im Verzeichnis /etc/udev/rules.d/ angelegt werden. Die Abarbeitung erfolgt alphanumerisch anhand der Nummerierung der Dateinamen. Eine Regel muss die Endung .rules besitzen. Systemregeln sind zumeist unter /lib/udev/rules.d/ zu finden. Zugunsten der Übersichtlichkeit sollte für jeden Seat eine eigene Datei angelegt werden.
Regeln können anhand des Gerätenamens, der Geräte-ID oder des USB-Anschlusses erstellt werden. Deshalb werden zunächst die benötigten Informationen ermittelt.
Folgendes Kommando gibt alle Eingabegeräte des System aus:
dmesg | grep -i "input:"
Beispielausgabe:
[ 1745.947493] input: Logitech USB-PS/2 Optical Mouse as /devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.1/2-1.1:1.0/input/input21
Um Informationen über USB-Anschlüsse zu erhalten, kann auch:
lsusb
oder
dmesg | grep -i "usb"
verwendet werden.
Eine sehr ausführliche Information zu einem bestimmten Gerät und dem verwendeten Anschluss kann aus dem udev-System ermittelt werden:
udevadm info --query=all --path=/devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.1/2-1.1:1.0/input/input21 --attribute-walk
Darauf folgt eine sehr ausführliche Ausgabe aller beteiligten Komponenten. Für die spätere udev-Regel sind vor allem diese Zeilen wichtig:
looking at device '/devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.1/2-1.1:1.0/input/input21': ... ATTR{name}=="Logitech USB-PS/2 Optical Mouse" ATTR{phys}=="usb-0000:00:1a.0-1.1/input0" ATTR{uniq}=="" ... looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb2/2-1/2-1.1': ... ATTRS{urbnum}=="445270" ATTRS{idVendor}=="046d" ATTRS{idProduct}=="c01e" ...
Um aktuelle Änderungen im udev-System in Echtzeit verfolgen zu können, kann auch
udevadm monitor
verwendet werden.
Geräte können anhand der ATTRS Attribute identifiziert werden. Empfehlenswert sind idVendor und idProduct. Das Attribut muss in der udev-Regel geprüft werden und anschließend gekennzeichnet werden. Eine Konfiguration, die zunächst alle Geräte für den ersten Seat markiert, könnte wie folgt aussehen:
99-seat1.rules:
1 | SUBSYSTEM=="input", ENV{ID_INPUT.tags}="input_seat1" |
Jede weitere Regel wird in eine neue Zeile geschrieben. Anschließend kann für jeden weiteren Seat eine Konfiguration erstellt werden, die bestimmte Geräte gemeinsam nutzen oder separat übernehmen. Soll die oben gefundene Maus ausschließlich am zweiten Seat genutzt werden, kann dies wie folgt erreicht werden:
99-seat2.rules:
1 | SUBSYSTEM=="input", ATTRS{idProduct}=="c01e", ENV{ID_INPUT.tags}="input_seat2" |
Diese Regel besagt, dass alle Eingabegeräte (SUBSYSTEM=="input"
) mit der Geräte-ID c01e
(ATTRS{idProduct}=="c01e"
) für den zweiten Seat markiert werden (ENV{ID_INPUT.tags}="input_seat2"
). Die Markierung für den ersten Seat wird dabei überschrieben. Sollen Geräte gemeinsam genutzt oder endgültig einem Seat zugewiesen werden, können weitere Funktionen von udev genutzt werden, die in weitere Zuweisungsmöglichkeiten beschrieben werden.
Soll für einen Seat ein eigener USB-Hub / USB-Anschluss verwendet, kann dies mittels DEVPATH
realisiert werden. Dabei wird jedes Eingabegerät, dass dort angeschlossen wird, dem entsprechendem Seat zugewiesen. Um alle Geräte am USB-HUB 2 dem zweiten Seat zuzuweisen, kann die Konfiguration so aussehen:
99-seat2.rules:
1 | SUBSYSTEM=="input", DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb2/*", ENV{ID_INPUT.tags}="input_seat2" |
Dabei können Platzhalter, wie "*
", "?
" und "[]
" eingesetzt werden. Außerdem können in der Manpage zu udev weitere vordefinierte Variablen nachgelesen werden.
Der DEVPATH
kann sich an einigen Systemen bei jedem Neustart ändern, sodass in diesem Fall eine Identifikation über das angeschlossene Gerät erfolgen muss.
Für die Umsetzung komplexerer udev-Regeln stehen weitere Funktionen zur Verfügung. Zu den wichtigsten gehören:
den bisherigen Wert einer Variable überschreiben: =
einen Wert einer Variable hinzufügen: +=
den bisherigen Wert einer Variable löschen: =""
weitere Änderungen einer Variable verhindern: OPTIONS+="last_rule"
oder :=
ein Gerät vollständig ignorieren (gilt für alle Seats): OPTIONS+="ignore_device"
Zusätzlich stehen vordefinierte Variablen für die Verwendung in Regeln zur Verfügung. Mithilfe des Attributs SYMLINK
können eigene Einträge im Verzeichnis /dev/ erzeugt werden. So ist es denkbar, alle Geräte eines Seats in einen separaten Ordner zu sammeln. Mittels des Attributs RUN
können sogar (kurze) externe Programme gestartet werden.
sudo udevadm trigger
Dieses Kommando macht die Regeln wirksam und die Eingabegeräte stehen sofort den jeweiligen Seats zu Verfügung. Alternativ können Eingabegeräte auch kurz vom System getrennt werden, um sie automatisch zu erkennen.
Zur grafischen Anmeldung am System gibt es eine Vielzahl an Displaymanagern. Seit Ubuntu 11.10 ist der desktopübergreifende LightDM bei Ubuntu und Xubuntu Standard (bei Lubuntu ab 12.04, bei Kubuntu ab 12.10). LightDM unterstützt den Multiseat-Betrieb von Haus aus und kann in Verbindung mit allen Desktops eingesetzt werden. Bei Systemen vor Ubuntu 11.10 kann LightDM jedoch nicht eingesetzt werden. Hier sollten die klassischen Displaymanager (z.B. GDM, KDM und LXDM) Verwendung finden.
Die Aufgabe der Displaymanager besteht darin, einen XServer zu starten und ein grafisches Anmeldefenster bereit zustellen. In einer Multiseat-Umgebung müssen natürlich mehrere XServer mit unterschiedlichen Konfigurationen gestartet werden und verschiedenen Grafikkarten zugewiesen werden. Dabei stehen viele Parameter zur Verfügung. Die Wichtigsten sind:
XServer Parameter | |
Parameter | Erläuterung |
:X | Displaynummer des XServers |
vtX | Gibt die Nummer des virtuellen Terminals an (z.B. vt7 ) |
-config DATEINAME | Anzuwendende Konfigurationsdatei |
-nolisten tcp | Verhindert die Kommunikation des X-Servers über das Netzwerk (default) |
-sharevts | Gestattet mehreren Seats, sich ein virtuelles Terminal zu teilen. Dies sollte nicht für den ersten Seat angegeben werden. |
-novtswitch | Verhindert das Wechseln der virtuellen Konsole mit Strg + Alt + F1 bis Strg + Alt + F6 |
-keeptty | Erhält die Verbindung zwischen X-Server und Terminal. Sollte nur zum Debugging genutzt werden. |
-isolateDevice PCI:ADRESSE | Separiert PCI-Geräte (z.B. Grafikkarten) |
Der Displaymanager LightDM wird ab Ubuntu 12.04 als Standard bei Ubuntu, Xubuntu und Lubuntu eingesetzt. Die Konfigurationsdatei /etc/lightdm/lightdm.conf muss mit Root-Rechten editiert werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | [LightDM] minimum-display-number=0 minimum-vt=7 [SeatDefaults] xserver-command=/usr/bin/X greeter-show-manual-login=true allow-guest=false exit-on-failure=true # Unity greeter-session=unity-greeter user-session=ubuntu ## Unity 2D #greeter-session=unity-greeter #user-session=ubuntu-2d ## GNOME 2 #greeter-session=unity-greeter #user-session=gnome-fallback ## GNOME 3 #greeter-session=unity-greeter #user-session=gnome-shell ## Xfce #greeter-session=lightdm-gtk-greeter #user-session=xubuntu ## LXDE #greeter-session=lightdm-gtk-greeter #user-session=lubuntu ## KDE #greeter-session=lightdm-qt-greeter #user-session=kubuntu [Seat:0] xserver-command=/usr/bin/X xserver-config=xorg_seat1.conf [Seat:1] xserver-command=/usr/bin/X :1 -sharevts -keeptty xserver-config=xorg_seat2.conf |
In dieser Datei müssen die Dateinamen der XServer-Konfigurationsdateien und die PCI-BUS-IDs angepasst werden. Um weitere Seats hinzuzufügen, kann der Abschnitt [Seat:1]
als Vorlage verwendet werden. Sollen für Seats unterschiedliche Einstellungen gelten, müssen diese aus dem Abschnitt [SeatDefaults]
in alle [Seat:]
-Abschnitte verschoben werden.
Häufig ist bei Multiseat-System auch der gemeinsame Zugriff auf Dateien erwünscht. Damit Dateien nicht immer explizit freigegeben werden müssen, empfielt sich der Einsatz von ACL. Auf diese Weise können unter anderem Share-Verzeichnisse einegrichtet werden, in denen jeder Datei automatisch die Freigabe für bestimmte Benutzer und Gruppen hinzugefügt wird.
Standardmäßig wird für jeden angemeldeten Nutzer eine Pulseaudio-Session gestartet. Dabei belegt die Pulseaudio-Session des ersten Nutzers alle Audio-Geräte. Als Workaround muss Pulseaudio als systemweiter Dienst eingerichtet werden. Dadurch werden Zugriffskonflikte auf die Audio-Geräte vermieden und Nutzer können sich an jedem beliebigen Seat anmelden. Für den Zugriff auf den systemweiten Pulseaudio-Dienst müssen alle Nutzer der Gruppe "pulse-access" angehören.
Anschließend können die Audio-Geräte den Seats in Abhängigkeit zur Display-Variablen automatisch per /etc/profile.d/multiseat-audio.sh zugeordnet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # # Select multi-seat audio devices # # !!! Run Pulseaudio in system daemon mode because of # sound device access conflicts in session mode # and ability to switch seats !!! # # !!! Add all users to pulseaudio group "pulse-access" !!! ## Get device names with "pactl list | grep Name" case "${DISPLAY#:}" in 0) ### Radeon GPU 1 HDMI audio export PULSE_SINK='alsa_output.pci-0000_01_00.1.hdmi-stereo' ### Onboard analogue input export PULSE_SOURCE='alsa_input.pci-0000_00_1b.0.analog-stereo' ;; 1) ### Radeon GPU 2 HDMI audio export PULSE_SINK='alsa_output.pci-0000_03_00.1.hdmi-stereo' ### Onboard analogue input export PULSE_SOURCE='alsa_input.pci-0000_00_1b.0.analog-stereo' ;; # 2) # ### <custom name of audio output> # export PULSE_SINK='<your ALSA output device>' # # ### <custom name of audio input> # export PULSE_SOURCE='<your ALSA input device>' # ;; # # . # . # . # . # . *) ### Fallback audio device for displays/seats not listed here export PULSE_SINK='<your ALSA output device>' export PULSE_SOURCE='<your ALSA input device>' ;; esac |
Bei Verwendung des proprietären NVidia-Treibers (ab Version 302.xx) kann es vorkommen, dass manche Seats schwarz bleiben. Hier muss folgende Zeile in jede xorg.conf in den Abschnitt "Device" eingetragen werden.
1 2 3 4 5 | Section "Device" ... Option "ProbeAllGpus" "false" ... EndSection |
Bei der Verwendung von nur einer Soundkarte kann nur ein Anwender auf das Audiogerät zugreifen. Weitere Anwender bekommen von PulseAudio nur einen Audio-Dummy zur Verfügung gestellt. Das Problem kann behoben werden, indem jeder Benutzer den Gruppen audio
und pulse-access
zugewiesen wird. Jedoch blockieren bestimmte Anwendungen wie Java-Programme und der Flashplayer das Audiogerät, so dass diese Anwendungen trotzdem nur einmal zur gleichen Zeit auf ein Gerät zugreifen können. Sollten mehrere Soundkarten im System vorhanden sein, können Arbeitsplätze an eine bestimmte Audiohardware gebunden werden.
Es ist möglich, dass sämtliche Tastatureingaben auf der Konsole landen. Dieses Problem kann behoben werden, indem beim Booten der Kernelparameter "vga=
" entfernt wird. Sollte dies nicht helfen, kann noch "nomodeset
" als Parameter angegeben werden. Außerdem soll der XServer-Parameter "-keeptty
" helfen. Das Problem ist leider noch nicht abschließend gelöst.
Es kommt vor, dass bei einem XServer Grafikfehler durch Mausbewegungen entstehen. Beheben lässt sich das Problem, indem man die Parameter "-novtswitch -sharevts
" bei dem betreffenden Server weglässt. Bei allen weiteres Seats werden sie aber weiterhin benötigt! XDM, GDM und KDM müssen diesbezüglich entsprechend angepasst werden.
Alle Benutzer müssen der Gruppe video
hinzugefügt werden, da sie sonst nicht auf die Grafikschnittstelle DRI zugreifen können.
Dies liegt zumeist an einer falschen Einstellung des XServers und der zugehörigen udev-Regeln. Durch das Booten in die Konsole können die Einstellungen korrigiert werden. Solange zumindest ein Seat funktioniert, ist die Konfiguration auch ohne Neustart möglich.
Dieser Bug ist noch nicht vollständig gelöst. Ein Workaround sieht vor, für jeden Seat den XServer-Parameter "-keeptty
" anzuwenden (893590). Dieser Bug steht wahrscheinlich in Verbindung mit diesem Problem: Tastatureingaben landen auf der Konsole.
Die Automounter der verschiedenen Desktops sind noch nicht Multiseat-fähig und konkurrieren beim Einhängen externer Massenspeicher. Dabei kommt es zumeist zu Fehlermeldungen in etlichen Seats. Hier hilft das Deaktivieren des Automounters und die Verwendung eines selbst geschriebenen udev-basierten Automounters: Forumsbeitrag.
MultiseatX - Ubuntu-Wiki
Multiseat on Debian - Blogbeitrag, 04/2010
Build a Six-headed, Six-user Linux System - Linux Gazette, 03/2006
Diese Revision wurde am 20. Mai 2015 18:51 von aasche erstellt.