Como detectar a inserção do disco de DVD?

5

Em particular, como capturá-lo para fins de montagem automática do sistema de arquivos em DVD?

Atualizar em resposta à resposta de Oli:

udev parece ser capaz de detectar a inserção de DVD, conforme demonstrado pelas alterações na saída de udevadm antes e depois do evento:

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

que resulta em variáveis de ambiente adicionais da seguinte forma:

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

No entanto, quando tentei a seguinte regra do udev (que tenta detectar 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"

não funciona. Qual poderia ser o problema?

Solução

Finalmente conseguiu resolver isso graças às sugestões de 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" &

Aparentemente, o ACTION=="add" não é acionado quando o disco de DVD é inserido. Então, em vez disso, usamos ACTION=="change" e, em seguida, detectamos o evento inserir ou ejetar via script.

    
por silvernightstar 16.10.2013 / 16:07

2 respostas

5

O UDEV envia eventos para unidades de CD / DVD (eu acabei de testá-lo com udevadm ), então você deve ser capaz de escrever um script UDEV ou escrever um script upstart assim:

start on block-device-added

task

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

Você pode ter que ter cuidado ao verificar seu status de montagem. Estou saqueando isso de uma resposta semelhante de meu que é um pouco mais explicativo.

Ao executar udevadm monitor --property --udev , aqui está a saída que recebi quando coloco um DVD ( --property torna isso bastante detalhado, mas permite que você saiba exatamente com o que está lidando):

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
    
por Oli 16.10.2013 / 16:20
1

Esta regra parece funcionar para mim e deve ser mais genérica do que uma que se refere ao dispositivo por ID. Além disso, deve ser acionado apenas uma vez por inserção e não acionado quando você ejetar o disco.

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"

O script de montagem que uso é semelhante ao seguinte:

#!/bin/bash

sleep 5

if ! mount | grep -q /dev/sr0; then
  mount /dev/sr0 /media/cdrom0
fi
    
por highfellow 18.03.2016 / 05:33