具体来说,如何捕获它以便自动挂载 DVD 文件系统?
更新回应 Oli 的回答:
udev
似乎能够检测到 DVD 的插入,如udevadm
事件发生前后的输出变化所示:
% udevadm info -q env -n /dev/cdrom
这会导致出现如下附加环境变量:
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
但是,当我尝试以下 udev 规则(尝试检测 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"
它不起作用。可能是什么问题?
解决方案
最终在 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" &
显然,ACTION=="add"
插入 DVD 光盘时不会触发。因此,我们使用ACTION=="change"
脚本来检测插入或弹出事件。
答案1
UDEV 发送 CD/DVD 驱动器的事件(我刚刚用 进行了测试udevadm
),因此您应该能够编写 UDEV 脚本或编写 upstart 脚本,如下所示:
start on block-device-added
task
script
if [ `$DEV` -eq "/dev/sr0" ]; then
# do something
fi
end script
您可能需要小心检查其安装状态。我从我的类似答案这更有解释力。
运行时udevadm monitor --property --udev
,这是我放入 DVD 时得到的输出(--property
虽然这很冗长,但它可以让您确切地知道您正在处理什么):
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
答案2
这条规则对我来说似乎有效,并且应该比通过 ID 引用设备的规则更通用。此外,它应该只在每次插入时触发一次,而不是在弹出磁盘时触发。
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"
我使用的挂载脚本如下所示:
#!/bin/bash
sleep 5
if ! mount | grep -q /dev/sr0; then
mount /dev/sr0 /media/cdrom0
fi