Info usb sda sdb sdc sda1... ? [RESOLU]

Bonjour
Je suis debian etch 4
Je dois coder un truc qui doit surveiller l’insertion spcécifique d’une clef USB (avec un ID déterminé) afin de la monter dans un répertoire précis et effectuer des opérations de contrôle.

Pour détecter la présence de la clef, pas de problèmes
un parcours du /proc/scsi/usb-storage/* ou bien un lsusb

Par exemple voici un Disque externe

cat /proc/scsi/usb-storage/3

Host scsi3: usb-storage Vendor: [b]Genesys Logic[/b] Product: [b]USB TO IDE[/b] Serial Number: None Protocol: Transparent SCSI Transport: Bulk Quirks: GO_SLOW MAX_SECTORS_64

lsusb -v

Bus 005 Device 006: ID 05e3:0702 [b]Genesys Logic[/b], Inc. USB 2.0 IDE Adapter Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x05e3 Genesys Logic, Inc. idProduct 0x0702 USB 2.0 IDE Adapter bcdDevice 0.02 iManufacturer 0 iProduct 1 USB TO IDE iSerial 0 bNumConfigurations 1

Jusque la tout va bien avec ces infos (le iProduct “USB TO IDE” et le IdVendor “Genesys Logic, Inc”), mon programme est amené à détecter que le disque/clef est connecté sur le PC. Par contre, celui-ci n’est pas encore “mounté”… Ca mon programme doit le faire…

La ou ca devient compliqué c’est :

Comment savoir que le point source de montage est /dev/sdb1 ou /dev/sdb2 ou voir même /dev/sdc* ???

car le fdisk -l ne m’indique pas vraimment les infos précises afin de faire la relation entre le bon périphérique et le point de source…

il m’indique ceci :

Périphérique Amorce Début Fin Blocs Id Système /dev/sdb1 1 4864 39070048+ c W95 FAT32 (LBA)

ok, dans ce cas c’est /dev/sdb1 mais l’Id c W95 n’est pas vraimment parlant et ne permet pas à mon programme de faire la relation avec le “USB TO IDE” découvert avec les méthodes lsusb ou /proc/scsi/usb-storage

la je pêche, au secours !!!???

Je ne pense pas qu’utiliser directement les informations de /proc ou de lsusb soit une bonne idée. Il existe un logiciel HAL (Hardware Abstraction Layer) utilisée de nos jours sur pratiquement toutes les distributions pour gérer le matériel, le montage automatique, etc.

À mon avis, il serait beacoup plus propre de coder un petit daemon qui utilise la libhal afin de détecter le branchement de la clef, puis de de récupérer les informations que tu souhaites. La libhal est une bibliothèque en C permettant d’envoyer ou de recevoir des informations provenant du daemon HAL.

Voici par un exemple, les informations que hal fournit sur une clef USB :

0: udi = '/org/freedesktop/Hal/devices/volume_uuid_46CC_5D53'
  volume.fstype = 'vfat'  (string)
  volume.fsusage = 'filesystem'  (string)
  linux.hotplug_type = 3  (0x3)  (int)
  volume.fsversion = 'FAT32'  (string)
  info.product = 'Volume (vfat)'  (string)
  volume.uuid = '46CC-5D53'  (string)
  volume.label = ''  (string)
  info.udi = '/org/freedesktop/Hal/devices/volume_uuid_46CC_5D53'  (string)
  volume.mount_point = ''  (string)
  volume.is_mounted = false  (bool)
  volume.is_mounted_read_only = false  (bool)
  volume.linux.is_device_mapper = false  (bool)
  volume.is_disc = false  (bool)
  volume.is_partition = true  (bool)
  volume.partition.number = 1  (0x1)  (int)
  volume.block_size = 512  (0x200)  (int)
  volume.num_blocks = 2013698  (0x1eba02)  (int)
  volume.size = 1031013376  (0x3d740400)  (uint64)
  volume.partition.start = 31744  (0x7c00)  (uint64)
  volume.partition.media_size = 1031798272  (0x3d7ffe00)  (uint64)
  info.category = 'volume'  (string)
  volume.partition.scheme = 'mbr'  (string)
  info.capabilities = { 'volume', 'block' } (string list)
  volume.partition.type = '0x0b'  (string)
  volume.partition.label = ''  (string)
  volume.partition.uuid = ''  (string)
  volume.partition.flags = {  } (string list)
  block.device = '/dev/sdb1'  (string)
  volume.ignore = false  (bool)
  block.major = 8  (0x8)  (int)
  org.freedesktop.Hal.Device.Volume.method_names = { 'Mount', 'Unmount', 'Eject' } (string list)
  block.minor = 17  (0x11)  (int)
  org.freedesktop.Hal.Device.Volume.method_signatures = { 'ssas', 'as', 'as' } (string list)
  block.is_volume = true  (bool)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:02.2/usb1/1-4/1-4:1.0/host4/target4:0:0/4:0:0:0/block/sdb/sdb1'  (string)
  org.freedesktop.Hal.Device.Volume.method_argnames = { 'mount_point fstype extra_options', 'extra_options', 'extra_options' } (string list)
  info.parent = '/org/freedesktop/Hal/devices/storage_serial_UT163_USB_Flash_Disk_20071300000389_0_0'  (string)
  org.freedesktop.Hal.Device.Volume.method_execpaths = { 'hal-storage-mount', 'hal-storage-unmount', 'hal-storage-eject' } (string list)
  block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_UT163_USB_Flash_Disk_20071300000389_0_0'  (string)
  volume.mount.valid_options = { 'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'noexec', 'quiet', 'remount', 'exec', 'utf8', 'shortname=', 'codepage=', 'iocharset=', 'umask=', 'dmask=', 'fmask=', 'uid=', 'flush' } (string list)
  volume.unmount.valid_options = { 'lazy' } (string list)
  storage.model = ''  (string)
  info.interfaces = { 'org.freedesktop.Hal.Device.Volume' } (string list)

Je te propose donc d’explorer cette piste. Je n’ai jamais utilisé la libhal donc je ne pourrai pas vraiment t’aider beaucoup plus dessus. La documentation de l’API est fournie dans le tarball.

freedesktop.org/wiki/Software/hal

Tu tapes :

et ça te donne la liste de tes devices avec leur UUID respectif :wink:

Comme ça il suffit de lister les UUID et de voir si l’UUID associé au périphérique que tu souhaites tester est présent. Si oui, le périphérique est monté, si non… il n’est pas monté.

EDIT : je ne sais pas si ça liste les devices montés ou les devices connectés… à toi de tester.

boaaaaa trop fort !!!
la piste de desintegr m’a envoyé vers hmount qui me permet de mounter avec simplicité !!
sourceforge.net/project/showfile … _id=186602

et la piste de tntprog répond carrément a ma demande !!!

Super maintenant je CODE !!!

Congratulons nous mutuellement, nous sommes très forts :smt040

Ravi de voir qu’on a pu t’aider efficacement en tout cas !