Dieser Artikel wurde archiviert, da er - oder Teile daraus - nur noch unter einer älteren Ubuntu-Version nutzbar ist. Diese Anleitung wird vom Wiki-Team weder auf Richtigkeit überprüft noch anderweitig gepflegt. Zusätzlich wurde der Artikel für weitere Änderungen gesperrt.
Ab Ubuntu 10.04 ist HAL komplett aus Ubuntu entfernt worden. Dieser Artikel ist nur noch für die KDE-Versionen (Kubuntu bis einschließlich 10.10) gültig!
XServer-Einstellungen für Eingabegeräte können entweder über udev-Regeln oder über die neue xorg.conf.d-Methode angepasst werden.
Der XServer beherrscht natives Plug&Play über HAL. Eingabegeräte können im laufenden Betrieb hinzugesteckt und voll benutzt werden, ohne dass Anpassungen an der xorg.conf nötig wären oder die grafische Oberfläche neu gestartet werden müsste. Dieser Artikel beschreibt, wie man in den Konfigurationsprozess eingreifen und fein abstimmen kann.
Das größte Manko der bisherigen Konfiguration von Eingabegeräten über die xorg.conf ist, dass diese statisch an eine Gerätedatei "/dev/input/..." gebunden werden, die sich aber ändern kann. Seit Ubuntu 8.04 sind diese Einträge nun obsolet; sie werden auch standardmäßig nicht mehr verwendet. Der XServer kann beim Start Gerätetypen erkennen und passende Treiber laden. In diese Automatismen kann man über eine sogenannte "HAL Policy" eingreifen, unter anderem um z.B. den leistungsfähigeren evdev-Treiber standardmäßig zu verwenden.
Die Einrichtung ist dabei denkbar simpel und beschränkt sich auf das Kopieren einer bereits vorhandenen Datei an die richtige Stelle. Weiterhin werden im Folgenden der Aufbau dieser Datei und einige sinnvolle Modifikationen beschrieben. Im Endeffekt kann man alle für Eingabegeräte spezifische Einträge aus der xorg.conf entfernen. Man wird belohnt mit vollständigem Plug&Play für alle Eingabegeräte und läuft zudem nicht mehr Gefahr, dass aufgrund falscher Einträge in der xorg.conf der XServer nicht mehr startet.
Das Einrichten der XServer-Konfiguration beschränkt sich im Wesentlichen auf das Anlegen der Datei /etc/hal/fdi/policy/10-x11-input.fdi und einem Neustart von HAL und des XServers. Dazu müssen folgende Schritte ausgeführt werden:
Da jedes System bereits eine Beispiel-Konfigurationsdatei hat, ist es das Einfachste, diese an die richtige Stelle zu kopieren. Dies erreicht man mit dem Konsolenbefehl [1]:
sudo cp /usr/share/doc/hal/examples/10-x11-input.fdi /etc/hal/fdi/policy/10-x11-input.fdi
Falls man Änderungen an der Datei vornehmen möchte, öffnet man sie einfach in einem Texteditor mit Root-Rechten[2]. In sehr vielen Fällen sind keine weiteren Anpassungen nötig, da deren Hauptaufgabe – das Laden des evdev-Treibers für eingesteckte Tastaturen und Mäuse – bereits die Beispielkonfiguration erledigt. Informationen zu Syntax und sinnvollen Änderungen sind in den folgenden Abschnitten beschrieben.
Nun startet man HAL und den XServer mittels der Befehle[1]
sudo /etc/init.d/hal restart sudo /etc/init.d/gdm restart
neu. Falls man nicht GNOME verwendet, kann man anstelle des zweiten Befehls auch einfach Strg + Alt + ⌫ drücken. In allen Fällen sollten vorher alle offenen Dokumente gespeichert werden.
Falls man /etc/hal/fdi/policy/10-x11-input.fdi wie oben beschrieben angelegt hat, erhält man eine Datei mit folgendem Inhalt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="ISO-8859-1"?> <deviceinfo version="0.2"> <device> <!-- FIXME: Support tablets too. --> <match key="info.capabilities" contains="input.mouse"> <merge key="input.x11_driver" type="string">mouse</merge> <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> <merge key="input.x11_driver" type="string">evdev</merge> </match> </match> <match key="info.capabilities" contains="input.keys"> <!-- If we're using Linux, we use evdev by default (falling back to keyboard otherwise). --> <merge key="input.x11_driver" type="string">keyboard</merge> <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> <merge key="input.x11_driver" type="string">evdev</merge> </match> </match> </device> </deviceinfo> |
Es handelt sich um eine XML-Datei. Eine gültige HAL-Datei muss dabei folgende Rahmenstruktur aufweisen:
1 2 3 4 5 6 | <?xml version="1.0" encoding="utf-8"?> <deviceinfo version="0.2"> <device> ... </device> </deviceinfo> |
Spezifische Geräte werden mit einem regelbasierten Ansatz konfiguriert:
<match>
: Falls ein Gerät eine bestimmte Eigenschaft hat, werden alle eingeschlossenen Regeln für dieses Gerät ausgeführt.
<merge>
: Für das aktuelle Gerät wird die angegebene Eigenschaft auf den eingeschlossenen Wert gesetzt. Sollte diese Eigenschaft bereits vorhanden sein, so wird ihr Wert überschrieben.
Die zu testenden/setzenden Eigenschaften werden durch das Attribut "key
" spezifiziert. In Falle von <match>
muss dabei noch das Testkriterium angegeben werden, und für <merge>
der Typ (Zeichenkette, Zahl, etc.) der zu setzenden Eigenschaft.
Es gibt noch eine ganze Reihe von weiteren gültigen Tags, die aber üblicherweise nicht gebraucht werden. Beispiele hierzu findet man zur Genüge in den weiteren HAL-Dateien in den Unterverzeichnissen von /usr/share/hal/fdi/policy/.
Bereits gesetzte Eigenschaften für eingesteckte Eingabegeräte können über den Befehl
hal-find-by-capability --capability input | xargs -I{} hal-device {}
in Erfahrung gebracht werden. Man erhält eine lange Liste mit Einträgen der Form
udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input' input.originating_device = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string) info.category = 'input' (string) input.device = '/dev/input/kbd-internal' (string) linux.sysfs_path = '/sys/devices/platform/i8042/serio0/input/input1/event1' (string) input.product = 'AT Translated Set 2 keyboard' (string) info.parent = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string) info.product = 'AT Translated Set 2 keyboard' (string) info.addons.singleton = { 'hald-addon-input' } (string list) info.udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input' (string) info.capabilities = { 'input', 'input.keyboard', 'input.keypad', 'input.keys', 'button' } (string list) ...
Jeder durch Leerzeilen getrennte Block beschreibt ein Gerät; obiger Befehl beschränkt die Liste dabei auf Eingabegeräte. Ein Block fängt mit dem "Unique Device Identifier" (udi) an, unter dem HAL das Gerät kennt. Alle folgenden Einträge sind Eigenschaften, in der Form
[Eigenschaft] = [Wert] (typ-name)
In der Konfigurationsdatei fügt man Einträge der Form
1 | <match key="[Eigenschaft]" typ-name="[Wert]">[Weitere Regeln für dieses Gerät]</match> |
hinzu, um für jedes Gerät mit der positiv getesteten Eigenschaft die weiteren Regeln auszuführen.
Es gibt einige komplizierte Konstrukte, mit denen man z.B. auf Eigenschaften des Geräte-Vaters testen kann, oder nur Teile eines Wertes abfragt. In der ausführlichen Konfigurationsdatei weiter unten finden sich einige Beispiele dazu.
Zur Konfiguration eines Eingabegerätes für den XServer ist nur eine einzelne Regel Pflicht, nämlich die, die den Treiber festlegt. Diese sieht immer so aus:
1 | <merge key="input.x11_driver" type="string">[Treiber]</merge> |
Dabei ist [Treiber]
durch den entsprechenden Treibernamen zu ersetzen. Für Mäuse und Tastaturen kann hier im Allgemeinen "evdev
" verwendet werden. Sollte ein Treiber nicht festgelegt werden, ignoriert X alles Folgende.
Eine Treiber-Option wird durch die Regel
1 | <merge key="input.x11_options.[xorg_option]" type="string">[xorg_option_wert]</merge> |
gesetzt. Als mögliche Optionen für den Treiber sind alle Optionen zulässig, die in den "InputDevice"-Abschnitten der xorg.conf Verwendung fanden. "[xorg_option]
" ist dabei durch deren Namen und "[xorg_option_wert]
" durch deren Wert zu ersetzen. Die type-Angabe ist dabei immer ein string, auch wenn Werte wie "on" oder "true" gesetzt werden.
Nur die xorg.conf-Einträge in den "InputDevice"-Abschnitten, die mit Option
beginnen, können übertragen werden. Weitere Einträge wie z.B. Identifier
oder Device
(auch: Option "Device"
) sind nicht nötig, sie sind entweder überflüssig oder werden durch HAL automatisch vorgenommen.
Optionen und deren Bedeutung kann man auf den man-Pages des entsprechenden Treibers nachschlagen.
Damit Änderungen wirksam werden, müssen nach dem Speichern HAL und X wie im Abschnitt Einrichten beschrieben neu gestartet werden.
In dem Verzeichnis /etc/hal/fdi/policy können beliebig viele .fdi-Dateien liegen; sie werden in lexikalischer Reihenfolge abgearbeitet. Am einfachsten ist es, eine "Universaldatei" mit dem Namen 10-x11-input.fdi wie oben beschrieben anzulegen, die den kleinsten gemeinsamen Nenner bildet. Falls man für z.B. die eigene Maus eines bestimmten Herstellers einige Anpassungen benötigt, legt man eine weitere Datei an – z.B. mit dem Namen 20-x11-hersteller.fdi. Wenn die Universaldatei bereits den Treiber festlegt, ist es zudem nicht nötig, dass die Dateien mit den weiteren Anpassungen für ein Gerät dies erneut tun. Dies dient primär der Übersichtlichkeit, man kann theoretisch auch alle Anpassungen in einer einzigen Datei machen.
Alle über HAL-Dateien konfigurierte Geräte benötigen keinen "InputDevice"-Eintrag in der xorg.conf mehr. Man kann entsprechende Einträge auskommentieren. Alle eventuellen Einstellungen, die man vorher für dieses Gerät in der xorg.conf vorgenommen hat, können wie im Abschnitt Syntax beschrieben übernommen werden.
Möchte man dagegen die Kontrolle über ein Eingabegerät wieder an die xorg.conf deligieren, so kann die entsprechende HAL-Konfiguration "entschärft" werden, indem auch hier über eine fdi-Datei die entsprechende Treiberinformation ausgeblendet wird:
1 2 3 | <match key="info.capabilities" contains="[Geräteklasse]"> <merge key="input.x11_driver" type="string"></merge> </match> |
Zu beachten ist, dass der Datenteil des merge-Tags leer ist.
HAL dient nicht nur der Konfiguration von Eingabegeräten. Da man für den XServer aber nur Eingabegeräte konfigurieren möchte, sollte man seine Anpassungen immer über das folgende Konstrukt kapseln:
1 2 3 | <match key="info.capabilities" contains="[Geräteklasse]"> ... </match> |
Dabei ist "[Geräteklasse]" durch "input.mouse", "input.touchpad", etc. (s.u.) zu ersetzen. Ansonsten könnte man versehentlich auch für Nicht-Eingabegeräte einen X11-Treiber konfigurieren – z.B. wenn man nur nach etwas wie "Hersteller=Logitech" für seine Maus testet, aber man auch eine Webcam dieses Herstellers hat.
Die korrekte Einstellung der Tastaturbelegung dürfte die am häufigsten gemachte Anpassung sein, da man über das Standard-Beispiel eine US-Belegung erhält. Dies ist allerdings nur für den Anmeldebildschirm relevant. Danach übernimmt der benutzte Desktop (GNOME, KDE, etc.) die Benutzer-spezifischen Einstellungen, die entsprechende Einträge aus xorg.conf oder 10-x11-input.fdi überschreiben.
Die Einstellung der Tastaturbelegung und ihrer Varianten erfolgt gemäß Dokumentation über die Eigenschaften
"input.x11_options.XkbRules" "input.x11_options.XkbModel" "input.x11_options.XkbLayout" "input.x11_options.XkbVariant" "input.x11_options.XkbOptions"
die die gleiche Bedeutung wie ihre Pendants in der xorg.conf haben. Leider muss man zumindest unter Hardy Heron an dieser Stelle noch auf die veraltete Syntax zurückgreifen, die folgende Eigenschaften erwartet
"input.xkb.rules" "input.xkb.model" "input.xkb.layout" "input.xkb.variant" "input.xkb.options"
Es ist allerdings problemlos möglich beide Eigenschaften zu setzen.
Ein fertiges Beispiel für Tastaturen mit deutscher Belegung:
1 2 3 4 5 6 | <!-- Keyboards (and everything else with buttons) --> <match key="info.capabilities" contains="input.keys"> <merge key="input.x11_driver" type="string">evdev</merge> <merge key="input.xkb.model" type="string">evdev</merge> <merge key="input.xkb.layout" type="string">de</merge> </match> |
Eine alternative Möglichkeit mit dem gleichen Effekt ist im Beispiel am Artikelende zu finden.
Mit diesen zusätzlichen Optionen kann man die Mausachsen invertieren:
1 2 | <merge key="input.x11_options.InvertY" type="string">true</merge> <merge key="input.x11_options.InvertX" type="string">true</merge> |
In der /etc/hal/fdi/policy/10-x11-input.fdi trägt man es dann folgt ein für die Maus:
1 2 3 4 5 6 7 8 9 | <match key="info.capabilities" contains="input.mouse"> <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> <merge key="input.x11_driver" type="string">evdev</merge> <merge key="input.x11_options.InvertY" type="string">true</merge> <merge key="input.x11_options.InvertX" type="string">true</merge> </match> </match> </match> |
Touchpads sind dadurch gekennzeichnet, dass sie sich unter der Eigenschaft "info.capabilities
" mit "input.touchpad
" melden. Für Touchpads existiert ein eigener Eintrag.
Grafiktabletts melden sich ebenfalls unter der Eigenschaft "info.capabilities
" mit "input.touchpad
", aber es erscheinen noch weitere Einträge, so kann sich ein Grafiktablett zusätzlich mit "input.mouse
" melden. Der folgende Code-Block ist ein Beispiel, das wahrscheinlich mit der Mehrheit der Grafiktabletts funktionieren wird; er sollte jedoch nach dem Code-Block des Touchpads eingetragen werden, um Konflikte zu vermeiden.
1 2 3 4 5 6 7 | <match key="info.capabilities" contains="input.touchpad"> <match key="info.capabilities" contains="input.mouse"> <merge key="input.x11_driver" type="string">wacom</merge> <merge key="input.x11_options.Type" type="string">stylus</merge> <merge key="input.x11_options.Mode" type="string">absolute</merge> </match> </match> |
Da aufgrund des regelbasierten Ansatzes nur Eingabegeräte konfiguriert werden, die auch tatsächlich vorhanden sind, kann folgende Beispieldatei ohne Bedenken auch als Ausgangsdatei für das eigene System verwendet werden.
Untenstehend eine Konfigurationsdatei, die die anfängliche Beispieldatei um die Benutzung einer deutschen Tastaturbelegung, Korrektur der Mausrad-Kipprichtung von einigen Logitech Funkmäusen und Laden des "synaptics
"-Treibers für entsprechende Touchpads nachrüstet.
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 48 49 50 51 52 53 54 55 56 57 58 59 | <?xml version="1.0" encoding="utf-8"?> <deviceinfo version="0.2"> <device> <!-- FIXME: Support tablets too. --> <!-- Touchpads --> <match key="info.capabilities" contains="input.touchpad"> <!-- Synaptic devices --> <match key="input.product" string="SynPS/2 Synaptics TouchPad"> <merge key="input.x11_driver" type="string">synaptics</merge> <merge key="input.x11_options.SHMConfig" type="string">on</merge> </match> </match> <!-- Mice --> <match key="info.capabilities" contains="input.mouse"> <!-- Set driver to "evdev" if on Linux, otherwise use "mouse" --> <merge key="input.x11_driver" type="string">mouse</merge> <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> <merge key="input.x11_driver" type="string">evdev</merge> </match> <!-- Logitech devices --> <match key="@input.originating_device:usb.vendor_id" int="0x46d"> <!-- MX Revolution (and others) --> <match key="@input.originating_device:usb.product_id" int_outof="0xc50e;0xc518;0xc51a"> <!-- Fix tilt wheel directions --> <merge key="input.x11_options.RelHWHEELOptions" type="string">invert</merge> </match> </match> </match> <!-- Keyboards (and everything else with buttons) --> <match key="info.capabilities" contains="input.keys"> <!-- Set driver to "evdev" if on Linux, otherwise use "keyboard" --> <merge key="input.x11_driver" type="string">keyboard</merge> <merge key="input.x11_options.XkbModel" type="string">pc105</merge> <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" string="Linux"> <merge key="input.x11_driver" type="string">evdev</merge> <merge key="input.x11_options.XkbModel" type="string">evdev</merge> </match> <!-- Choose layout --> <merge key="input.x11_options.XkbLayout" type="string">de</merge> <!-- Deprecated names for options (but needed in Hardy?) --> <merge key="input.xkb.model" type="copy_property">input.x11_options.XkbModel</merge> <merge key="input.xkb.layout" type="copy_property">input.x11_options.XkbLayout</merge> </match> </device> </deviceinfo> |
Diese Revision wurde am 9. Juni 2013 16:55 von frustschieber erstellt.