Mint 11, basierend auf Ubuntu 11.04
Wenn ich die SD-Karte mit Fotos in den Schlitz stecke, fragt mich Mint (Ubuntu): Digitalfotos blabla, Wählen Sie die zu startende Anwendung aus. Da möchte ich gern haben, was über den Terminal mittels „digikam --detect-camera“ funktioniert. Wenn ich aber diesen Befehl festlege, wird nur „digikam“ übernommen, und das Programm startet nicht. Wie kann ich das ändern?
lg
Kalsan
Mint 11, basierend auf Ubuntu 11.04
Ich weiss nicht, wie Mint diese Aufgabe angeht, es wird jedoch wohl auf udev beruhen. Entweder schreibt Mint unter /etc/udev/rules.d/ selbst eine Regeldatei fort, oder in einer der dortigen Regeldateien ist allgemein festgehalten, welches Programm beim Einstecken einer SD-Karte aufgerufen wird.
Egal wie, du kannst entweder die bestehenden Regeln anpassen, oder auf die von Mint vorgesehene Automatik verzichten, und eine eigene Regeldatei schreiben, die zuerst greift und das gewünschte Programm inkl. Parametern aufruft.
Ich habe z. B. für das Auslesen einer Kamera eine Datei /etc/udev/rules.d/usb.rules erstellt (ohne führende Zahl im Namen, sie wird daher als allererstes abgefragt) mit der Regel
# LIP Kamera
KERNEL=="sd?[0-9]", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ACTION=="add", ATTRS{idVendor}=="1d6b", ATTRS{serial}=="0000:00:1d.7", SYMLINK+="cybershot", RUN+="/home/edv/add\_usb cybershot"
Den Befehl „/home/edv/add_usb cybershot“ würdest du durch „digikam --detect-camera“ ersetzen (wobei statt einfach nur ‚digikam‘ schon der komplette Pfad dastehen sollte, also z. B. /usr/bin/digikam), die Vendor-ID und die Seriennummer der Karte entnimmst du dem Befehl udevadm info --attribute-walk --name=/dev/sd?[0-9] (z. B. sdb1, wenn dmesg sagt, dass für die Karte ein Device sdb1 angelegt wurde).
Der Symlink ist dir freigestellt. Der sorgt dafür, dass du unter immer gleicher Device-ID (im Beispiel /dev/cybershot) auf das Gerät zugreifen bzw. es mounten kannst.
HTH
Hallo Herrmann,
Vielen Dank für deine Antwort. Leider funktioniert es noch nicht. Folgendes habe ich gemacht:
Datei /etc/udev/rules.d/usb.rules angelegt, mit Inhalt:
# LIP Kamera
KERNEL=="sdb", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ACTION=="add", ATTRS{idVendor}=="1d6b", ATTRS{serial}=="058F0O1111B1", SYMLINK+="CANON\_DC", RUN+="/usr/bin/digikam --detect-camera"
Hier ist der Inhalt von udevadm info --attribute-walk --name=/dev/sdb1
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/host7/target7:0:0/7:0:0:0/block/sdb/sdb1':
KERNEL=="sdb1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="1"
ATTR{start}=="8192"
ATTR{size}=="15946752"
ATTR{ro}=="0"
ATTR{alignment\_offset}=="0"
ATTR{discard\_alignment}=="4290772992"
ATTR{stat}==" 89 2438 2807 296 1 0 1 4 0 208 300"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/host7/target7:0:0/7:0:0:0/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{range}=="16"
ATTRS{ext\_range}=="256"
ATTRS{removable}=="1"
ATTRS{ro}=="0"
ATTRS{size}=="15954944"
ATTRS{alignment\_offset}=="0"
ATTRS{discard\_alignment}=="0"
ATTRS{capability}=="51"
ATTRS{stat}==" 110 2438 2975 320 1 0 1 4 0 232 324"
ATTRS{inflight}==" 0 0"
ATTRS{events}=="media\_change"
ATTRS{events\_async}==""
ATTRS{events\_poll\_msecs}=="-1"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/host7/target7:0:0/7:0:0:0':
KERNELS=="7:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device\_blocked}=="0"
ATTRS{type}=="0"
ATTRS{scsi\_level}=="0"
ATTRS{vendor}=="Multi "
ATTRS{model}=="Flash Reader "
ATTRS{rev}=="1.00"
ATTRS{state}=="running"
ATTRS{timeout}=="30"
ATTRS{iocounterbits}=="32"
ATTRS{iorequest\_cnt}=="0xcf"
ATTRS{iodone\_cnt}=="0xcf"
ATTRS{ioerr\_cnt}=="0x2"
ATTRS{evt\_media\_change}=="0"
ATTRS{dh\_state}=="detached"
ATTRS{queue\_depth}=="1"
ATTRS{queue\_type}=="none"
ATTRS{max\_sectors}=="240"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/host7/target7:0:0':
KERNELS=="target7:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0/host7':
KERNELS=="host7"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0':
KERNELS=="2-4:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="02"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{supports\_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-4':
KERNELS=="2-4"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="575"
ATTRS{idVendor}=="058f"
ATTRS{idProduct}=="6366"
ATTRS{bcdDevice}=="0100"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="2"
ATTRS{devnum}=="8"
ATTRS{devpath}=="4"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{avoid\_reset\_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Generic"
ATTRS{product}=="Mass Storage Device"
ATTRS{serial}=="058F0O1111B1"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2':
KERNELS=="usb2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="77"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="480"
ATTRS{busnum}=="2"
ATTRS{devnum}=="1"
ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="6"
ATTRS{quirks}=="0x0"
ATTRS{avoid\_reset\_quirk}=="0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.38-8-generic ehci\_hcd"
ATTRS{product}=="EHCI Host Controller"
ATTRS{serial}=="0000:00:1d.7"
ATTRS{authorized\_default}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.7':
KERNELS=="0000:00:1d.7"
SUBSYSTEMS=="pci"
DRIVERS=="ehci\_hcd"
ATTRS{vendor}=="0x8086"
ATTRS{device}=="0x293a"
ATTRS{subsystem\_vendor}=="0x103c"
ATTRS{subsystem\_device}=="0x30e8"
ATTRS{class}=="0x0c0320"
ATTRS{irq}=="20"
ATTRS{local\_cpus}=="ff"
ATTRS{local\_cpulist}=="0-7"
ATTRS{dma\_mask\_bits}=="32"
ATTRS{consistent\_dma\_mask\_bits}=="32"
ATTRS{broken\_parity\_status}=="0"
ATTRS{msi\_bus}==""
ATTRS{companion}==""
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
Hier ist das Resultat von fdisk -l
...
Platte /dev/sdb: 8168 MByte, 8168931328 Byte
39 Köpfe, 5 Sektoren/Spur, 81820 Zylinder
Einheiten = Zylinder von 195 × 512 = 99840 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Gerät boot. Anfang Ende Blöcke Id System
/dev/sdb1 43 81821 7973376 b W95 FAT32
Auf den ersten Blick:
KERNEL==„sdb“,
Das sollte genauso aussehen, wie in meinem Beispiel. Ist bereits z. B. ein USB-Stick eingestickt, könnte sdb für diesen vergeben sein, deine SD-Karte bekäme dann sdc und deine Regel scheiterte.
ATTRS{idVendor}==„1d6b“,
Hier hingegen hast du dich zu eng an meine Vorlage gehalten. Laut deiner udevadm-Liste sieht diese Eigenschaft für deine SD-Karte so aus: ATTRS{idVendor}==„058f“
Wenn du diese beiden Korrekturen vorgenommen hast, solltest du mindestens in der syslog mitverfolgen können, was beim Einstecken (bzw. Abziehen) der SD-Karte passiert (tailf /var/log/syslog). Das Abziehen der Karte verlangt übrigens möglicherweise noch nach eigenen spezifischen Aktionen, aber das ist dann das nächste Kapitel.
HTH
Beim Einstecken der Karte kratzt jetzt die Festplatte kurz, dann aber öffnet sich das gewohnte Fenster. Kein digikam
# LIP Kamera
KERNEL=="sd?[0-9]", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ACTION=="add", ATTRS{idVendor}=="058f", ATTRS{serial}=="058F0O1111B1", SYMLINK+="CANON\_DC", RUN+="/usr/bin/digikam --detect-camera"
Beim Einstecken der Karte kratzt jetzt die Festplatte kurz,
dann aber öffnet sich das gewohnte Fenster. Kein digikam
Wenn du diese beiden Korrekturen vorgenommen hast, solltest du
mindestens in der syslog mitverfolgen können, was beim Einstecken
(bzw. Abziehen) der SD-Karte passiert (tailf /var/log/syslog).
Und?
Sorry, das hab ich übersehen.
Sep 21 18:22:32 lp-user-mint kernel: [987.616110] usb 2-4: new high speed USB device using ehci\_hcd and address 8
Sep 21 18:22:32 lp-user-mint kernel: [987.751411] scsi7 : usb-storage 2-4:1.0
Sep 21 18:22:33 lp-user-mint kernel: [988.749535] scsi 7:0:0:0: Direct-Access Multi Flash Reader 1.00 PQ: 0 ANSI: 0
Sep 21 18:22:33 lp-user-mint kernel: [988.751181] sd 7:0:0:0: Attached scsi generic sg2 type 0
Sep 21 18:22:33 lp-user-mint kernel: [989.274531] sd 7:0:0:0: [sdb] 15954944 512-byte logical blocks: (8.16 GB/7.60 GiB)
Sep 21 18:22:33 lp-user-mint kernel: [989.275398] sd 7:0:0:0: [sdb] Write Protect is off
Sep 21 18:22:33 lp-user-mint kernel: [989.275398] sd 7:0:0:0: [sdb] Write Protect is off
Sep 21 18:22:33 lp-user-mint kernel: [989.275406] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
Sep 21 18:22:33 lp-user-mint kernel: [989.276360] sd 7:0:0:0: [sdb] No Caching mode page present
Sep 21 18:22:33 lp-user-mint kernel: [989.276368] sd 7:0:0:0: [sdb] Assuming drive cache: write through
Sep 21 18:22:33 lp-user-mint kernel: [989.280472] sd 7:0:0:0: [sdb] No Caching mode page present
Sep 21 18:22:33 lp-user-mint kernel: [989.280479] sd 7:0:0:0: [sdb] Assuming drive cache: write through
Sep 21 18:22:33 lp-user-mint kernel: [989.281869] sdb: sdb1
Sep 21 18:22:33 lp-user-mint kernel: [989.287658] sd 7:0:0:0: [sdb] No Caching mode page present
Sep 21 18:22:33 lp-user-mint kernel: [989.287665] sd 7:0:0:0: [sdb] Assuming drive cache: write through
Sep 21 18:22:33 lp-user-mint kernel: [989.287671] sd 7:0:0:0: [sdb] Attached SCSI removable disk
Sep 21 18:22:38 lp-user-mint kernel: [994.269021] usb 2-4: USB disconnect, address 8
lg
Kalsan
Ich war davon ausgegangen, dass man im syslog sieht, welche Regeldatei angefasst bzw. welche Regel tatsächlich ausgeführt wird. Das ist leider nicht der Fall. Man kann von udevadm die Aktionen des udev-Subsystems mitloggen lassen (udevadm monitor --udev bzw. udevadm --debug monitor), da steht die gewünschte Information aber auch nicht drin. Das macht die Fernunterstützung natürlich ein bissken schwierig…
Du solltest auf jeden Fall noch mal den Namen deiner selbstgeschriebenen Regeldatei überprüfen. Der Name muss auf .rules enden, also z. B. usb.rules. Ansonsten wird die Datei ignoriert. Zur Reihenfolge der Abarbeitung der Regeldateien sagt die udev-Dokumentation, dass der Name ‚lexikalisch‘ ausgewertet wird. Das widerspricht meiner Behauptung in einem meiner vorherigen Postings, dass eine Datei z. B. usb.rules vor einer anderen Datei mit dem Namen z. B. 70-persitent-usb.rules aufgerufen werde. Du solltest deine Regeldatei daher ggf. umbenennen, z. B. nach /etc/udev/rules.d/10-usb.rules.
Die mint-Regeldatei, die im Moment greift, sollte übrigens im Verzeichnis /lib/udev/rules.d/ liegen (k. A., wie weit das bei mint auch zutrifft).
HTH
Die Datei lautet jetzt 10-usb.rules und befindet sich in /etc/udev/rules.d/
LS des Ordners rules.d: 10-usb.rules 70-persistent-cd.rules 70-persistent-net.rules README
Leider noch immer kein Erfolg, auch bei geöffneter DigiKam.
lg
Kalsan
Kein Zugriff auf Desktop bzw. X
Eben kommt mir was! Du rufst ein Programm
RUN+="/usr/bin/digikam --detect-camera"
auf, welches Zugriff auf den Desktop verlangt. Der Anwender, der das Programm startet, bist aber nicht du, sondern das ist das udev-Subsystem. Und das darf auf fremde Desktops erstmal grundsätzlich nicht zugreifen. Dafür musst du diesem Programm Zugriff auf das Desktop-Authorisierungscookie geben.
Ich hab nicht die geringste Ahnung, ob bzw. wie diese Aufgabenstellung mit udev direkt zu realisieren ist. Es gibt aber einen einfachen Workaround: Rufe nicht digikam auf, sondern erstelle ein eigenes Script, welches digikam erst mit dem Zugriff auf das Cookie austattet und dann startet. Ganz grob etwa so:
#!/bin/sh
DISPLAY=:0 XAUTHORITY=/home/herrmann/.Xauthority /usr/bin/digikam --detect-camera
Testen kannst du das Script, indem du es in einer root-Shell startest. Wenn es in der funktioniert, sollte es auch aus dem udev-Subsystem heraus funktionieren. Clever wäre, das Script gleich auch noch ein paar debug-Infos ausgeben zu lassen, damit du weisst, ob es von udev überhaupt aufgerufen wurde:
echo "date
usb.rules aufgerufen ACTION=$ACTION" >>/tmp/usb.log
Zu deinem letzten Posting:
LS des Ordners rules.d:
Das ist /etc/udev/rules.d/. Interessanter wäre /lib/udev/rules.d/
Da sollte sich auch das Script verstecken, welches von mint aufgerufen wird. Das solltest du dir mal anschauen um zu sehen, mit welchen Techniken dort gearbeitet wurde.
Gruß
P.S.
XAUTHORITY=/home/herrmann/.Xauthority
Klar, dass da bei dir nicht ‚herrmann‘ stehen darf, oder?
Jetzt /lib/udev/rules.d/10-usb.rules:
# LIP Kamera
KERNEL=="sd?[0-9]", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ACTION=="add", ATTRS{idVendor}=="058f", ATTRS{serial}=="058F0O1111B1", SYMLINK+="CANON\_DC", RUN+="sh /home/user/scripts/usb.sh"
/home/user/scripts/usb.sh:
#!/bin/sh
DISPLAY=:0 XAUTHORITY=/home/user/.Xauthority /usr/bin/digikam --detect-camera
echo "`date` usb.rules aufgerufen ACTION=$ACTION" \>\>/tmp/usb.log
Skript ist ausführbar und meines.
Selbes Resultat '-(
Wo steckt denn jetzt der Wurm drin?
lg und danke für deine Ausdauer
Kalsan
Back to the roots
Wir sind hier inzw. schon bald in den Bereich der Systemprogrammierung hineingerutscht. Es dürfte erfolgswahrscheinlicher und zielführender sein, dein ursprüngliches Problem nochmal anzugehen - Den ‚Mint way of autostarting‘.
Hast du eigentlich mal probiert, dem Anwendungsauswahldialog den Befehl incl. Parametern mit Gänsefüßchen „geklammert“ zu übergeben? Also
„befehl --parameter“
anstelle von
befehl --parameter
bzw. die Doku oder Hilfe zu dem Befehl zum Thema Parameterübergabe mal befragt?
Alternativ, wenn das partout nicht funktionieren will: Ruf stattdessen im Auswahldialog dein usb.sh-Script auf! Dabei solltest du dir dann auch das Geraffels mit der XAUTHORITY sparen können. Vor allem sparst du dir so den Umweg über udev und machst dir das debugging wesentlich einfacher!
Und wenn’s das auch nicht tut - es gibt noch ein paar weitere nützliche debug-Ausgaben, die du in dein Script einbauen kannst. Z. B.
echo "------------------- WHOAMI whoami
" >> /tmp/usb.log
echo "------------------- ENV env
" >> /tmp/usb.log
Daraus kannst du erkennen, ob die Umgebung, in der das Script letztendlich läuft, identisch ist mit der Umgebung, in der du es getestet hast.
Gruß
Ach herrje - dass ich da zuvor nicht draufgekommen bin!
Natürlich! Die ausgewählte Aktion ist das Skript, und im Skript steht: digikam --detect-camera
Problem gelöst.
Vielen Dank für deine Hilfe!
lg
Kalsan