claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 02/2005   »   Ausgabe bestellen

Treiberkonzepte unter Linux

Treibende Kraft

von Carsten Schnober


Wer neue Hardware kauft, legt unter Windows die mitgelieferte CD ein und installiert die notwendigen Treiber. Was macht Linux anders?

Das Logo klebt auf fast jedem Gerät im Computer-Handel: "Designed for Microsoft Windows XP". Eine Liste der kompatiblen Windows-Versionen steht direkt daneben. Linux dagegen erwähnen die wenigsten Verpackungen. Das heißt nicht zwangsläufig, dass die Geräte unter Linux den Dienst verweigern, aber auf der mitgelieferten CD werden Sie vergeblich nach Linux-Treibern suchen. Nur wenige Hersteller schreiben sich Linux-Kompatibilität auf die Fahnen, aber eine mit dem unter Windows üblichen Microsoft Installer (Abbildung 1) vergleichbare Installationsroutine gibt es auch bei ihnen nicht.

Abb. 1: Unter Windows installiert sich jeder Treiber gleich.

Das liegt nur teilweise an den variierenden Ansätzen der zahlreichen Linux-Distributionen. Das betrifft Windows ebenfalls auf, die Setup-Routine verschleiert das Problem jedoch mit seiner einheitlichen Oberfläche. Im Allgemeinen gilt: Treiber ist nicht gleich Treiber und Geräte erfordern oft völlig verschiedene Herangehensweisen.

So unterscheiden sich die unter Windows gewöhnlich unter dem Begriff "Treiber" subsumierten Programme und Dateien in ihren Funktionen deutlich. Beispielsweise liefern Multifunktionsgeräte mit Drucker, Scanner und Fax meist eine Anwender-Software für Windows mit, die die Einzelfunktionen unter einer einhaltlichen Oberfläche zusammenfasst. Vom Anwender meist unbemerkt ermöglichen betriebssystemnahe Programme im Hintergrund der Desktop-Software die Kommunikation mit der Hardware.

Die Anwender-Programme installieren Sie unter Linux selbst, unabhängig vom Hardware-Treiber. Die Verbindung zwischen Betriebssystem und Desktop-Applikation schaffen die Kernel-Module. Die Schnittstelle bilden dabei die so genannten "Device Files", die Gerätedateien.

Unix-Philosphie

Ein Ausflug in die Geschichte des Unix-Betriebssystems erklärt den Hintergrund. Lange vor Linux entstanden zahlreiche andere Varianten des Betriebssystems Unix. Sie eint unter Anderem der Ansatz: "Everything is a file" -- alles ist eine Datei. Das bedeutet, dass Textdokumente oder Konfigurationsdateien oberflächlich ebenso aussehen wie die genannten Gerätedateien. Letztere befinden sich unter Linux unterhalb des Verzeichnisses /dev/.

Für Anwender-Software bietet das einen gewaltigen Vorteil. Sie schreibt ausgehende Daten in eine Gerätedatei und hat sich damit ihrer Verantwortung entledigt. Eine einfache Möglichkeit, beispielsweise eine Musikdatei abzuspielen, sieht so aus:

cat sound.wav > /dev/dsp
Der Kommandozeilenbefehl cat gibt eine beliebige Datei aus, das Zeichen > leitet die Ausgabe um, in diesem Fall in die für Soundkarten zuständige Gerätedatei /dev/dsp. Ohne Umleitung würde der Inhalt der Sounddatei auf der Textkonsole landen. In der Praxis funktioniert diese Methode aber meist nicht, denn es kann immer nur ein Programm auf das Gerät zugreifen. Das Soundsystem von KDE nimmt die Soundkarte beim Login in Beschlag und verwaltet sie für alle KDE-Musikprogramme.

Analog funktioniert die Eingabe. Eine handelsübliche Maus kommuniziert beispielsweise über die Gerätedatei /dev/input/mice mit der grafischen Oberfläche. Geben Sie auf der Kommandozeile den Befehl

cat /dev/input/mice
ein, erscheinen bei jeder Mausbewegung einige Zeichen auf dem Bildschirm (Abbildung 2). Damit können Sie als Mensch nichts anfangen, aber die grafische Oberfläche bewegt den Maus-Cursor an Hand eben dieser Informationen.

Abb. 2: Die Ausgabe der Gerätedateien lässt sich anzeigen.

Module

Die Anwender-Software schreibt ausgehende Daten in die entsprechende Gerätedatei, eingehende liest sie bei Bedarf von einer anderen. Für den Datenverkehr zwischen Gerätedateien und dem Endgerät erklärt sich von nun an das Betriebssystem, also der Linux-Kernel für zuständig.

Moderne Linux-Distributionen liefern Kernel aus, die möglichst alle verfügbaren Hardware-Treiber enthalten. Damit der Kernel für viele Geräte sofort einsatzbereit ist, ohne dass sämtliche Treiber den Speicher durchgehend belasten, bietet Linux ein modulares System. Der feste und unveränderbare Teil der Standard-Kernel enthält nur die Funktionen, auf die das Betriebssystem zum Starten nicht verzichten kann.

Läuft Linux erstmal, lädt es während des Boot-Vorgangs oder auch beim Einstecken eines USB-Geräts im laufenden Betrieb die weiteren nötigen Treiber als Kernel-Module nach. Dieses Verfahren hält den Speicherbedarf so klein wie möglich und erlaubt dabei mit einem Standard-Kernel den Zugriff auf alle unterstützten Geräte. Hardware-Anbieter können für ihre Geräte auch eigene Module mitliefern, sie müssen aber exakt zum verwendeten Kernel passen.

Der Zugriff auf eine Hardware-Komponente besteht unter Linux im einfachsten Fall aus zwei Schritten: Die Hardware-Erkennung findet das Gerät und lädt das entsprechende Kernel-Modul. Dann starten Sie als Benutzer die gewünschte Desktop-Anwendung, die über die Gerätedatei mit der Hardware kommuniziert.

Mittlerweile erkennt Linux unterstützte Hardware-Komponenten automatisch, so dass Sie sich gewöhnlich nicht darum zu kümmern brauchen, das passende Modul zu laden. Möchten Sie erfahren, welche Module sich derzeit im Speicher befinden, geben Sie in einer Textkonsole den Befehl /sbin/lsmod ein (Abbildung 3).

Abb. 3: Kernel-Module lassen sich jederzeit nachladen.

Jede Zeile steht für ein Kernel-Modul. In der ersten Spalte steht dessen Name, dahinter die Größe des Moduls. Es folgt die Anzahl der Systemvorgänge, die das jeweilige Modul momentan benutzen; steht hier eine Null, ist es derzeit ungenutzt. In der letzten Spalte schließlich steht eine mitunter lange Liste weiterer Module, die auf das erste Modul zurückgreifen.

Zum manuellen Nachladen eines Kernel-Moduls dient der Kommandozeilenbefehl modprobe, gefolgt vom Namen des Moduls. modprobe -r entfernt ein Modul aus dem Speicher. Beide Operationen setzen root-Rechte voraus. Beide benötigen Sie im Alltag jedoch nicht. Das Entfernen eines Moduls kann unvorhersehbare Folgen haben, selbst wenn es momentan nicht genutzt wird. Der minimale Speichergewinn wirkt sich dagegen nicht spürbar aus. Das Laden von Modulen passiert gewöhnlich automatisch, so dass Sie auch diesen Befehl im Alltag nicht benötigen.

Treiber nicht gleich Treiber

Je nach Art des Geräts reicht ein Kernel-Modul nicht aus. Denn es gibt Hardware, die ein Benutzer als solche zunächst nicht wahrnimmt, aber dennoch Treiber benötigt. Die USB-Anschlüsse geben diesen Umstand beispielhaft wieder: Obwohl sie inzwischen meist fest zum Mainboard gehören, gehorchen sie einem eigenen Controller, den die Kernel-Module uhci-hcd, ohci-hcd oder ehci-hcd ansteuern, je nach Modell. Für die verschiedenen Arten der USB-Endgeräte gibt es wiederum weitere darauf aufbauende Module. Das Modul usb-storage addressiert Speichergeräte wie Memory-Sticks sowie die meisten Digitalkameras, USB-Mäuse benötigen unter anderem usbmouse.

Eine weitere Stufe ins Treiberkonzept bauen beispielsweise Drucker ein. Sie erfordern jeweils ein Kernel-Modul, das den jeweiligen Anschluss aktiviert. Bei parallelen Anschlüssen steuern die Module parport und lp die Gerätedatei /dev/lp0 an, im Falle von USB-Druckern heißt das Modul usblp, das je nach Distribution /dev/usblp0 oder /dev/usb/lp0 ansteuert (Abbildung 4).

Abb. 4: Anwender-Software kommuniziert mit der Hardware über Gerätedateien.

Da aber die meisten Drucker jeweils eigene Befehlssätze kennen, genügt es nicht, wenn ein Programm auszudruckende Daten einfach in die Gerätedatei schreibt. Deshalb schaltet sich zusätzlich ein Filter zwischen Anwender-Software und Gerätedatei. Er erhält Daten beispielsweise von einem Textverarbeitungsprogramm, passt sie an für den konfigurierten Drucker und leitet sie erst danach zur zuständigen Gerätedatei weiter.

Diese Aufteilung begründet sich in der Idee, den Linux-Kernel so klein wie möglich zu halten. Dazu versuchen die Entwickler, nur Komponenten in den Kernel aufzunehmen, die sich nicht durch Anwender-Software ersetzen lassen -- wie die genannten Module zum Ansteuern der Anschlüsse. Die Druckerfilter bietet vom Betriebssystem weitgehend unabhängige Software, die sich leichter und schneller an neue Geräte anpassen lässt. Das gebräuchlichste Druckersystem CUPS beispielsweise lässt sich über so genannte PPD-Dateien erweitern, die für jedes Betriebssystem gleich aussehen. Die PPD-Dateien enthalten für jeden Druckertyp alle benötigten Informationen, mit denen ein Filter die Daten ins druckerspezifische Format bringt. Auch sie erfüllen die Funktion eines Treibers.

Deutlich fällt die scheinbar willkürliche Aufgabenteilung zwischen Kernel und Anwender-Software bei Digitalkameras auf. Die meisten Apparate funktionieren wie externe Speichergeräte, sie lassen sich wie andere Laufwerke nach dem Laden des Moduls usb-storage einhängen. Andere dagegen arbeiten mit einem speziellen Protokoll namens PtP. Dieses läuft direkt auf dem USB-Anschluss und benötigt deshalb das Modul usb-storage nicht. Das hat für die Anwender-Software zur Folge, dass sie mehr leisten muss, als nur auf einen Datenträger zuzugreifen; sie muss zudem PtP unterstützten. Hier zeigt sich die Verschiebung der Aufgaben: Das Betriebssystem tritt einen Teil der Arbeit an die Anwender-Software ab. In einem Fall bietet der Kernel den Treiber, im anderen die Endanwendung.

Die Konkurrenz im Auge

Beim Umstieg von Windows auf Linux stellt das Einbinden neuer Hardware Neulinge meist vor die größten Schwierigkeiten. Abgesehen vom mangelnden Engagement stehen auch willige Hersteller vor einer Hürde: Im Gegensatz zum Windows-Kernel, variiert der Linux-Kernel von Distribution zu Distribution. Selbst wenn sie identische Versionsnummern tragen; ein Kernel 2.6.8 von Suse Linux unterscheidet sich beispielsweise deutlich von einem Kernel 2.6.8 von Fedora Core. Das liegt an zahlreichen Erweiterungen, die Distributoren eigenständig einfügen.

Innerhalb einer Distribution hat der Benutzer zudem die Freiheit, einen anderen Kernel seiner Wahl zu installieren. Oft rät der Distributor selbst zu einem Update, beispielsweise auf Grund auftretender Sicherheitslücken oder anderer Fehler im mitgelieferten Kernel. Andere Anwender wiederum basteln sich gänzlich eigene Kernel-Varianten.

Das stellt Hardware-Hersteller vor einige Unwägbarkeiten. Trotzdem gäbe es für sie einen recht sicheren Weg, die eigene Hardware auch unter Linux lauffähig zu machen: Veröffentlicht ein Produzent die Spezifikationen seiner Geräte, entwickelt möglicherweise die Linux-Community selbst Treiber, die daraufhin in den Linux-Kernel einfließen.

Für alle Seiten komfortabel gestaltet es sich, wenn Hardware bestehende Standards einhält. Gerade USB-Geräte eignen sich dafür besonders. Wie beschrieben gibt es für Speichergeräte, ob Festplatten, Speicher-Sticks oder auch Digitalkameras das usb-storage-Modul, das einem festgelegten Standard folgt. Solche Geräte lassen sich auch unter neueren Windows-Versionen ohne zusätliche Treiber benutzen. Ebenso verhält es sich bei USB-Netzwerkgeräten, -Tastaturen, -Mäusen und weiterer Hardware.

Leider existieren nicht in jedem Bereich solche Standards oder sie zu implementieren kostet mehr Geld als ein eigener Ansatz. Bei Druckern beispielsweise funktionieren die im professionellen Bereich verbreiteten PostScript-Drucker unter jedem Betriebssystem gleich und horchen auf einen einheitlichen Befehlssatz. Das setzt voraus, dass der Drucker in seinem eingebauten Miniprozessor die empfangenen Daten selbst umrechnet.

Das Extrem auf der anderen Seite bilden die so genannten Windows- oder GDI-Drucker: Diese Geräte sind meist sehr billig, denn sie haben überhaupt keinen eigenen Prozessor. Die gesamte Rechenarbeit erledigt die Treiber-Software über den Prozessor des Rechners. Neuere Computer stellt das kaum vor Performance-Probleme, aber ohne die Treiber funktioniert bei diesen Geräten nichts. Für die wenigsten existiert entsprechende Linux-Software.

Halbherziger Einsatz

Die meisten Hardware-Hersteller tun sich schwer mit der Open-Source-Idee. Ihnen missfällt der Gedanke, Software zu entwickeln, die anschließend jeder weiterverbreiten und verändern darf. Die Aufnahme in den Linux-Kernel setzt das jedoch voraus. Viele Firmen behalten sich jedoch gerne Änderungen an der Hardware vor oder möchten ihre Geschäftsgeheimnisse vor der Konkurrenz schützen.

Mit viel Arbeit schaffen es Linux-Programmierer immer wieder, auch Spezifikationen herauszufinden, die der Hersteller nicht freiwillig preisgibt und die sich nicht an Standards halten. Das geschieht über "Reverse Engineering": Der Entwickler verwendet die Windows-Treiber und belauscht mit Hilfe von Spezial-Software den Datenverkehr am entsprechenden Anschluss. Die abgefangenen Befehle überträgt er dann in ein Linux-Programm. Auf diese Art geschriebene Linux-Treiber funktionieren jedoch nicht immer reibungslos oder realisieren nicht alle Möglichkeiten der Hardware.

Einige wenige Hersteller liefern mit ihren Produkten Linux-Treiber aus, in Form von eigenen Kernel-Modulen. Da sie meist nur die am meisten verbreiteten Distributionen und Versionen unterstützen, stoßen sie jedoch schnell an Grenzen. Zudem bemängeln freie Entwickler, dass sie in diesem Fall Programmfehler nicht selbst beheben können.

Andere Produzenten geben tatsächlich die Spezifikation ihrer Hardware frei und überlassen die Arbeit des Treiber-Programmierens damit der Linux-Gemeinde, meist mit Erfolg. Durch deren freiwillig Arbeit spart der Hersteller die Entwicklungskosten und erhält doch qualitativ meist hochwertige Software.

Die Aussage "Linux unterstützt weniger Hardware als Windows" enthält derzeit also mehr als nur ein Körnchen Wahrheit. Es wurde schon viel spekuliert über die Gründe, weshalb sich viele Hardware-Hersteller schlichtweg weigern, funktionierende Linux-Treiber zu entwickeln oder dies wenigstens Freiwilligen zu ermöglichen. An der Tatsache ändern weder Vorwürfe noch Verständnis direkt nichts, aber das Wissen über die Verantwortung dafür beeinflusst vielleicht so manche Kaufentscheidung. Denn es ist keineswegs unmöglich, funktionierende Linux-Treiber herauszubringen -- und wer Geräte herstellt, die sich nicht an vorhandene Standards halten, sollte dafür sorgen, dass alle Kunden sie benutzen können. (csc)

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2021 COMPUTEC MEDIA GmbH | Last modified: 2007-04-05 11:10

[Linux-Magazin] [LinuxUser] [Linux-Community]