Udev et clef USB

pmount c’est bien mais crée une entrée dans fstab c’est mieux. Les paquets existants sont un peu des usines à gaz. Donc un eplongée dans udev et finalement faire un système créant des répertoires et des entrées correspondantes dans fstab et les enlevant au retrait est très simple avec udev:

  1. Le programme effectuant les manipulations:

[code]/lib/udev/usb_fstab.sh:

#!/bin/sh
date >> /tmp/dev_usb
echo $ACTION >> /tmp/dev_usb
echo $1 $ID_FS_TYPE $ID_TYPE >> /tmp/dev_usb
echo $ID_SERIAL >> /tmp/dev_usb
echo “----------”>> /tmp/dev_usb

if [ “$ACTION” = “add” ] ; then
NOM=$1_$ID_SERIAL
DEVICE=/dev/$1
if [ “$ID_FS_TYPE” = “” ] ; then
ID_FS_TYPE=auto
fi
mkdir -p /media/$1
echo “#$NOM” >> /etc/fstab
if grep -q $DEVICE /etc/fstab > /dev/null ; then
echo -n “#” >> /etc/fstab
fi
echo $DEVICE /media/$1 $ID_FS_TYPE user,defaults 0 0 >> /etc/fstab
fi
if [ “$ACTION” = “remove” ] ; then
NOM=.*_$ID_SERIAL
DEVICE=/dev/$1
umount -f /media/$1
rmdir /media/$1
while [ -f /tmp/fstab ] ; do /bin/true ; done
echo “sed -e '/^#”$NOM"/{N;d}’ /etc/fstab > /tmp/fstab"> /tmp/edite.$1
cp /etc/fstab /tmp/fstab.$1
sh /tmp/edite.$1
mv /tmp/fstab /etc/fstab
fi
[/code]

et la règle appelant ce programme lors de l’insertion des clefs (c’est ça qui a été long à faire):

[code]/etc/udev/rules.d/z99_clef.rules
ACTION==“add”, ENV{SUBSYSTEM}==“block”, ENV{ID_TYPE}==“floppy” , PROGRAM="/lib/udev/usb_fstab.sh %k"
ACTION==“add”, ENV{SUBSYSTEM}==“block”, ENV{ID_FS_TYPE}!="" , PROGRAM="/lib/udev/usb_fstab.sh %k"
ACTION==“remove”, ENV{SUBSYSTEM}==“block”, ENV{ID_TYPE}==“floppy” , PROGRAM="/lib/udev/usb_fstab.sh %k"
ACTION==“remove”, ENV{SUBSYSTEM}==“block”, ENV{ID_FS_TYPE}!="" , PROGRAM="/lib/udev/usb_fstab.sh %k"

[/code]

J’en ai fait un paquet plugusb disponible pour Etch sur

deb boisson.homeip.net/debian etch divers

Finalement, udev est plus souple que hotplug à l’usage :slightly_smiling:

merci fran.b … je teste trés bientôt … busy, so busy avec mes usines à moi :smiley:

Bonjour, je profite du sujet actuel pour poser ma question…

d’abord, mes deux règles udev :

cat /etc/udev/rules.d/z80_local.rules KERNEL=="sd?2", DRIVERS=="usb", ATTRS{idProduct}=="1000", ATTRS{idVendor}=="090c", ACTION=="add", NAME="key", RUN+="/home/erwann/bin/auto_connect" KERNEL=="sd?2", DRIVERS=="usb", ATTRS{idProduct}=="1000", ATTRS{idVendor}=="090c", ACTION=="remove", RUN+"/home/erwann/bin/auto_disconnect"

la règle correspondant à l’action “add” fonctionne

par contre, rien ne se passe au remove, je ne comprend pas pourquoi

si ça peut aider, voilà le udevmonitor lors de la déconnexion de la clef :

UEVENT[1186579006.517954] remove@/class/usb_endpoint/usbdev1.15_ep81
UEVENT[1186579006.517972] remove@/class/usb_endpoint/usbdev1.15_ep02
UEVENT[1186579006.517978] remove@/class/scsi_generic/sg3
UEVENT[1186579006.517983] remove@/class/scsi_device/18:0:0:0
UEVENT[1186579006.517989] remove@/class/scsi_disk/18:0:0:0
UEVENT[1186579006.517994] remove@/block/sdc/sdc2
UEVENT[1186579006.517999] remove@/block/sdc/sdc1
UEVENT[1186579006.518004] remove@/block/sdc
UEVENT[1186579006.518009] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4:1.0/host18/target18:0:0/18:0:0:0
UEVENT[1186579006.518015] remove@/class/scsi_host/host18
UEVENT[1186579006.518020] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4:1.0
UEVENT[1186579006.518025] remove@/class/usb_device/usbdev1.15
UEVENT[1186579006.518031] remove@/class/usb_endpoint/usbdev1.15_ep00
UEVENT[1186579006.518036] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4
UDEV  [1186579006.518487] remove@/class/usb_endpoint/usbdev1.15_ep81
UDEV  [1186579006.520965] remove@/class/usb_endpoint/usbdev1.15_ep02
UDEV  [1186579006.521031] remove@/block/sdc/sdc2
UDEV  [1186579006.521789] remove@/class/scsi_generic/sg3
UDEV  [1186579006.521849] remove@/block/sdc/sdc1
UDEV  [1186579006.522428] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4:1.0/host18/target18:0:0/18:0:0:0
UDEV  [1186579006.522442] remove@/class/scsi_device/18:0:0:0
UDEV  [1186579006.523036] remove@/class/scsi_disk/18:0:0:0
UDEV  [1186579006.523804] remove@/block/sdc
UDEV  [1186579006.524279] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4/1-4:1.0
UDEV  [1186579006.524571] remove@/class/scsi_host/host18
UDEV  [1186579006.524931] remove@/class/usb_device/usbdev1.15
UDEV  [1186579006.525529] remove@/devices/pci0000:00/0000:00:1a.7/usb1/1-4
UDEV  [1186579006.525592] remove@/class/usb_endpoint/usbdev1.15_ep00

j’ai trouvé…

comme ça ça fonctionne :

cat /etc/udev/rules.d/z80_local.rules
KERNEL=="sd?2", DRIVERS=="usb", ATTRS{idProduct}=="1000", ATTRS{idVendor}=="090c", ACTION=="add", NAME="key", RUN+="/home/erwann/bin/auto_connect"
DRIVERS=="usb", ACTION=="remove", RUN+="/home/erwann/bin/auto_disconnect"

des tests supplémentaire sont faits dans le deuxième script du coup.

Est ce que c’est possible de detecter l’insertion de cd/dvd dans le lecteur et de le monter via des règles udev? Avec udevmonitor, on ne voit rien lors de l’insertion d’un media dans le lecteur je pense que non, mais a tous hazard je demande.

Merci

Pourquoi ?