Login
Newsletter
Werbung

So, 4. September 2005, 00:00

USB-Digitalkameras unter Linux

Wir schließen eine Digitalkamera an

In letzter Zeit sind in den Linux-Distributionen viele Änderungen vorgenommen worden. Schauen wir also, was passiert, wenn wir eine Digitalkamera an einen USB-Port anschließen.

Kernel

Die Unterstützung des USB-Busses befindet sich im Kernel des Systems - genauer gesagt, im Modul uhci_hcd, ohci_hcd oder ehci_hcd, je nachdem, welcher USB-Controller im Rechner vorhanden ist. Dieses Modul muss geladen werden, damit wir auf eine Kamera zugreifen können, es wird aber standardmäßig beim Starten einer der modernen Distributionen geladen. Nachdem ein neues Gerät angeschlossen wurde, sendet der Kernel die Informationen über dieses Gerät an die Programme, die im Userspace laufen. Unabhängig davon, welche Distribution wir verwenden, werden die Informationen über das angeschlossene Gerät immer an den Hotplug-Daemon weitergeleitet - in manchen Distributionen, wie z.B. Fedora Core und Aurox, wird neben hotplug auch der HAL-Daemon (Hardware Abstraction Layer) benachrichtigt. Der Benutzer kann Informationen über die angeschlossene Hardware erhalten, indem er das Kommando dmesg eingibt. Der Befehl lsusb -v (vom root-Account aus) liefert uns eine detaillierte Beschreibung aller USB-Geräte.

Wenn wir nicht wissen, ob unsere Digitalkamera überhaupt unter Linux funktionieren wird, dann bietet sich hier eine Gelegenheit, dies zu überprüfen. Finden wir nach dem Ausführen des Befehls lsusb -v in der Beschreibung unseres Gerätes die Zeile bInterfaceClass 8 Mass Storage, bedeutet dies, dass das Gerät mit usb-storage kompatibel sein sollte. Sonst können wir prüfen, ob das Gerät durch die libgphoto2-Treiber erkannt wird, indem wir den Befehl gphoto2 --auto-detect ausführen. Dieser Befehl sollte am besten vom root-Account aus ausgeführt werden, da in unserer Distribution die Zugangsberechtigungen zu USB für einen gewöhnlichen Benutzer vielleicht noch nicht konfiguriert sind.

Hotplug

In jeder Distribution wird nach dem Anschließen eines beliebigen USB-Gerätes das Skript /etc/hotplug/usb.agent gestartet, an das verschiedene Informationen weitergeleitet werden, unter anderem darüber, ob das Gerät angeschlossen oder getrennt wurde (Variable $ACTION), der aktuelle Pfad des Devices, z.B. /proc/bus/usb/001/010 (Variable $DEVICE), sowie die drei USB-IDs des Gerätes (Variable $PRODUCT). Anschließend durchsucht das Skript die Dateien mit der Erweiterung *.usermap, die in den Verzeichnissen /etc/hotplug, /etc/hotplug/usb und /etc/hotplug.d abgelegt wurden. Jede Zeile in den *.usermap-Dateien beinhaltet die USB-ID eines Devices sowie den Namen des Skripts, das ausgeführt werden soll, falls das Gerät angeschlossen wird. Nachdem eine Zeile gefunden wurde, die dieselbe ID beinhaltet, die sich in der Variable $PRODUCT befindet, wird das Programm, das in der ersten Spalte der Datei *.usermap angegeben wurde, mit denselben Variablen wie zuvor das Skript hotplug gestartet, also unter anderem $ACTION, $DEVICE und $PRODUCT.

Um diesen Vorgang genauer zu erklären, schauen wir uns an, wir dies im Falle der Digitalkamera Canon PowerShot A60 und der Distribution Knoppix aussieht. Wir fangen deshalb mit dieser Distribution an, weil es sich daran am einfachsten erklären läßt. Nachdem wir die Digitalkamera angeschlossen haben, geben wir das Kommando dmesg ein und sollten folgende Zeile zu sehen bekommen:

usb 1-1: new full speed USB device using uhci_hcd and address 4

Der Hotplug-Daemon wurde gestartet und hat die Datei /etc/hotplug/usb/libgphoto2.usermap gefunden, die eine Zeile beinhaltet, die folgendermaßen beginnt:

libgphoto2 0x0003 0x04a9 0x3074 0x0000 0x0000 0x00 ...

Wenn wir die ID unserer Kamera mit Hilfe des Kommandos lsusb -v überprüfen, erhalten wir Folgendes:

idVendor 0x04a9 Canon, Inc.
idProduct 0x3074 PowerShot A60 (ptp)
bcdDevice 0.01

Wir sehen, dass die ersten IDs richtig sind; die dritte ID (bcdDevice) wird in den meisten Fällen nicht verwendet. Das System hat das Skript /etc/hotplug/usb/libgphoto2 ausgeführt, dessen Funktion in der Distribution Knoppix darin besteht, allen Benutzern der Gruppe camera Zugriffsrechte zum angeschlossenen Gerät zu gewähren. Nach dem Anschließen des Gerätes passiert in dieser Distribution nichts mehr. In Knoppix gehört der Default-User der Gruppe camera an, wir können also nach dem Anschließen der Kamera das in Knoppix verfügbare Programm GTKam starten und auf sie zugreifen.

Ist unsere Kamera mit usb-storage kompatibel, wird sie von Knoppix etwas anders behandelt. Das System wird nämlich automatisch ein Kernelmodul namens usb-storage laden. Führen wir nach dem Anschließen der Hardware den Befehl dmesg aus, erhalten wir Zeilen, die in etwa folgendermaßen aussehen:

usb 1-1: new full speed USB device using uhci_hcd and address 4
scsi3 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 4
 Vendor: SAMSUNG Model: DIGIMAX 420 Rev: 1.00
 Type: Direct-Access ANSI SCSI revision: 00
SCSI device sdc: 499712 512-byte hdwr sectors (256 MB)
sdc: assuming Write Enabled
 sdc: sdc1

Der Befehl gibt eine wichtige Information über den Devicenamen preis, unter dem unsere Digitalkamera verfügbar sein wird. In meinem Fall handelt es sich um /dev/sdc1. Selbstverständlich können wir dieses Device nun im System mounten, z.B. mit dem Befehl mount -t vfat /dev/sdc1 /mnt/unsere_kamera. In der Praxis können wir jedoch davon absehen - zumindest in Knoppix, weil diese Distribution über eine spezielle Version der Hotplug-Skripte verfügt, die zusätzlich die Programme /usr/sbin/updfstab und /usr/sbin/scanpartitions starten, nachdem ein usb-storage-Gerät angeschlossen wurde. Danach wird das Gerät gescannt, in der Datei /etc/fstab wird eine Information über dieses Device eingetragen und auf dem Desktop erscheint ein Icon, mit dessen Hilfe das Device gemountet werden kann. Anschließend können wir durch einen Mausklick auf das Gerät zugreifen.

In der Distribution Mandriva (ehemals Mandrakelinux) ist dieser Mechanismus ein wenig komplexer. Kann auf unsere Kamera über libgphoto2 zugegriffen werden, finden wir deren ID in der Datei /etc/hotplug/usb.usermap und nach dem Anschließen des Gerätes startet das System das Skript /etc/hotplug/usb/usbcam. In diesem Fall hat es zwei Funktionen. Erstens vergibt es Zugangsberechtigungen zu diesem Device und zwar nicht einer ganzen Benutzergruppe, sondern ausschließlich dem Benutzer, der zur Zeit im System angemeldet ist. Zweitens startet es ein anderes Skript, das auf dem Desktop das Icon des Devices platziert.

Um die Funktionsweise des Hotplug-Skriptes besser zu verstehen, können wir am Anfang (aber nach der Zeile #!/bin/bash) folgende Zeile eintragen:

logger "Device $DEVICE ID $PRODUCT Aktion $ACTION"

Dadurch werden wir nach dem Anschließen des Gerätes in den Systemlogs grundlegende Parameter finden, die von hotplug zurückgegeben wurden. Diese Daten können uns helfen, einige Modifikationen durchzuführen, wenn wir z.B. Schwierigkeiten haben, auf das Device zuzugreifen. Wie wir sehen, wird die ID des richtigen Benutzers mit Hilfe der Datei /var/run/console.lock oder /var/lock/console.lock ermittelt. Dies funktioniert in Mandriva in der Regel gut. Sollte sich jedoch herausstellen, dass ein bestimmtes Device nach dem Ausführen des Skriptes immer noch dem Benutzer root angehört, können wir die dort vorhandene Zeile

CONSOLEOWNER=

folgendermaßen ergänzen:

CONSOLEOWNER=piotr

Daraufhin wird der Benutzer piotr vollen Zugang zum Gerät erhalten. Im weiteren Verlauf des Skriptes befindet sich der Code, der für das Platzieren eines entsprechenden Icons auf dem Desktop zuständig ist. Wenn wir uns ein Paket von kleineren Skripten im Verzeichnis /etc/dynamic genauer anschauen, stellen wir schnell fest, dass in der GNOME-Umgebung ein Icon zum Starten von GTKam, in KDE dagegen ein Icon von FlPhoto auf dem Desktop erscheinen wird. Die entsprechenden Objekte, die auf dem Desktop platziert werden, befinden sich im Verzeichnis /etc/dynamic/launchers/camera. Dadurch, dass wir die in diesem Verzeichnis vorhandenen Dateien gtkam.desktop oder flphoto.desktop modifizieren, können wir nicht nur das Aussehen des Icons ändern, sondern auch das Programm, das gestartet wird, wenn das Icon angeklickt wurde. Anstatt lediglich das Icon auf den Desktop zu legen, kann unser Skript selbstverständlich einfach ein Programm starten. Wir sollten daran denken, dass dieses Skript mit den Rechten des Benutzers root ausgeführt wird. Möchten wir also ein Programm in der grafischen Umgebung starten, sollten wir das Kommando su [Name_des_Benutzers] [Name_des_Programms] verwenden.

Wenn wir unter Mandriva eine Digitalkamera anschließen, die mit usb-storage kompatibel ist, wird ein anderes Skript ausgeführt - und zwar /etc/dynamic/scripts/part.script. Dessen Aufgabe besteht in der Aktualisierung von /etc/fstab sowie aus dem Hinzufügen eines Icons auf dem Desktop. Wir können es beliebig modifizieren.

In den Distributionen Fedora Core 3 und Aurox finden wir ebenfalls den Hotplug-Daemon. Im Falle von Digitalkameras, auf die über libgphoto2 zugegriffen werden kann, wird das Skript /etc/hotplug/usb/usbcam gestartet. Dessen einzige Funktion ist die Vergabe von entsprechenden Zugriffsberechtigungen auf das gerade angeschlossene USB-Device. Obwohl es in Fedora Core 3 funktioniert, war dies auf meinem Rechner unter Aurox nicht der Fall. Das System hat die Datei console.lock vermisst, aus der die Daten über den angemeldeten Benutzer ermittelt werden. Wir müssen daher eine Übergangslösung anwenden, die ähnlich wie die im Falle von Mandriva ist, die ich bereits erwähnt habe (CONSOLEOWNER=piotr).

Aurox und Fedora Core 3 zeichnen sich im Vergleich zu anderen Distributionen dadurch aus, dass die eigentliche Unterstützung der Geräte, die während der Arbeit des Systems angeschlossen werden, durch den HAL und den Gnome Volume Manager übernommen wird.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung