web-dev-qa-db-fra.com

Comment détecter l'insertion d'un disque DVD?

En particulier, comment l'attraper pour le montage automatique du système de fichiers DVD?


Mise à jour en réponse à la réponse d'Oli:

udev semble pouvoir détecter l'insertion d'un DVD, comme le montrent les modifications apportées à la sortie de udevadm avant et après l'événement:

% udevadm info -q env -n /dev/cdrom

ce qui entraîne des variables d'environnement supplémentaires comme suit:

ID_CDROM_MEDIA=1
ID_CDROM_MEDIA_DVD=1
ID_CDROM_MEDIA_SESSION_COUNT=1
ID_CDROM_MEDIA_STATE=complete
ID_CDROM_MEDIA_TRACK_COUNT=1
ID_CDROM_MEDIA_TRACK_COUNT_DATA=1
ID_FS_LABEL=20130926_Backup
ID_FS_LABEL_ENC=20130926_Backup
ID_FS_TYPE=udf
ID_FS_USAGE=filesystem

Cependant, lorsque j’ai essayé la règle udev suivante (qui tente de détecter ID_FS_TYPE == "udf"),

SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_FS_TYPE}=="udf", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-0:0:0:0", ACTION=="add", RUN+="/bin/mount -t udf -o ro /dev/cdrom /var/run/usbmount/dvdrom"

ça ne marche pas. Quel pourrait être le problème?


Solution

A finalement pu résoudre ce problème grâce aux suggestions d'Oli:

/ etc/udev/rules.d/autodvd.rules:

SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:1f.2-scsi-0:0:0:0", ACTION=="change", RUN+="/usr/local/bin/autodvd"

/ usr/local/bin/autodvd:

#!/bin/bash
{
  if [ $ID_CDROM_MEDIA -eq 1 ]; then
    mkdir -p /var/run/usbmount/dvdrom
    mount -t $ID_FS_TYPE -o ro /dev/cdrom /var/run/usbmount/dvdrom
  else
    umount -l /var/run/usbmount/dvdrom
    rm -rf /var/run/usbmount/dvdrom
  fi
} &>> "/var/log/autodvd.log" &

Apparemment, ACTION=="add" n'est pas déclenché lorsqu'un disque DVD est inséré. Donc, au lieu de cela, nous utilisons ACTION=="change", puis détectons l'événement d'insertion ou d'éjection via un script.

6
silvernightstar

UDEV envoie des événements pour les lecteurs de CD/DVD (je viens de le tester avec udevadm). Vous devriez donc pouvoir écrire un script UDEV ou un script upstart comme ceci:

start on block-device-added

task

script
   if [ `$DEV` -eq "/dev/sr0" ]; then
      # do something
   fi
end script

Vous devrez peut-être faire attention à la vérification de son statut de montage. Je pille ceci de ne réponse similaire à la mienne qui est un peu plus explicatif.


Lorsque vous exécutez udevadm monitor --property --udev, voici le résultat obtenu lors de la gravure d'un DVD (--property en fait un commentaire assez détaillé, mais vous permet de savoir exactement à quoi vous avez affaire):

UDEV  [2251414.166711] change   /devices/pci0000:00/0000:00:1c.1/0000:07:00.0/ata17/Host16/target16:0:0/16:0:0:0/block/sr0 (block)
ACTION=change
DEVLINKS=/dev/cdrom /dev/cdrw /dev/disk/by-id/ata-Optiarc_DVD_RW_AD-7240S /dev/disk/by-label/UT2004_DVD /dev/disk/by-path/pci-0000:07:00.0-scsi-0:0:0:0 /dev/dvd /dev/dvdrw
DEVNAME=/dev/sr0
DEVPATH=/devices/pci0000:00/0000:00:1c.1/0000:07:00.0/ata17/Host16/target16:0:0/16:0:0:0/block/sr0
DEVTYPE=disk
DISK_MEDIA_CHANGE=1
GENERATED=1
ID_ATA=1
ID_ATA_SATA=1
ID_ATA_SATA_SIGNAL_RATE_GEN1=1
ID_BUS=ata
ID_CDROM=1
ID_CDROM_CD=1
ID_CDROM_CD_R=1
ID_CDROM_CD_RW=1
ID_CDROM_DVD=1
ID_CDROM_DVD_PLUS_R=1
ID_CDROM_DVD_PLUS_RW=1
ID_CDROM_DVD_PLUS_R_DL=1
ID_CDROM_DVD_R=1
ID_CDROM_DVD_RAM=1
ID_CDROM_DVD_RW=1
ID_CDROM_MEDIA=1
ID_CDROM_MEDIA_DVD=1
ID_CDROM_MEDIA_SESSION_COUNT=1
ID_CDROM_MEDIA_STATE=complete
ID_CDROM_MEDIA_TRACK_COUNT=1
ID_CDROM_MEDIA_TRACK_COUNT_DATA=1
ID_CDROM_MRW=1
ID_CDROM_MRW_W=1
ID_FS_LABEL=UT2004_DVD
ID_FS_LABEL_ENC=UT2004_DVD
ID_FS_TYPE=iso9660
ID_FS_USAGE=filesystem
ID_FS_VERSION=Joliet\x20Extension
ID_MODEL=Optiarc_DVD_RW_AD-7240S
ID_MODEL_ENC=Optiarc\x20DVD\x20RW\x20AD-7240S\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
ID_PATH=pci-0000:07:00.0-scsi-0:0:0:0
ID_PATH_TAG=pci-0000_07_00_0-scsi-0_0_0_0
ID_REVISION=1.00
ID_SERIAL=Optiarc_DVD_RW_AD-7240S
ID_TYPE=cd
MAJOR=11
MINOR=0
SEQNUM=4400
SUBSYSTEM=block
TAGS=:udev-acl:
UDEV_LOG=3
UDISKS_PRESENTATION_NOPOLICY=0
USEC_INITIALIZED=10393360
5
Oli

Cette règle semble fonctionner pour moi et devrait être plus générique que celle qui fait référence au périphérique par ID. De plus, il ne doit se déclencher qu'une fois par insertion et non lorsque vous éjectez le disque.

ACTION=="change", KERNEL=="sr[0-9]*", ENV{ID_CDROM_DVD}=="1", ENV{ID_CDROM_MEDIA_STATE}=="complete", ENV{ID_FS_TYPE}=="udf", RUN+="/usr/local/bin/dvd-automount"
ACTION=="change", KERNEL=="sr[0-9]*", ENV{ID_CDROM_DVD}=="1", ENV{ID_CDROM_MEDIA_STATE}=="complete", ENV{ID_FS_TYPE}=="iso9660", RUN+="/usr/local/bin/dvd-automount"

Le script de montage que j'utilise ressemble à ceci:

#!/bin/bash

sleep 5

if ! mount | grep -q /dev/sr0; then
  mount /dev/sr0 /media/cdrom0
fi
1
highfellow