udev
Howto create a udev symlink for a DVD drive
I ran into this one on an Ubuntu 12.10 desktop. I have two DVD drives and one Blu-ray ROM drive. Devices /dev/sr0
and /dev/sr1
were showing up with /dev/dvd
and /dev/dvd1
respectively, but the Blu-ray was only registering /dev/sr2
.
I wanted to create two new symlinks for /dev/sr0
: /dev/dvd2
and /dev/bluray
.
First, I looked at my current udev rules for the DVD drives in /etc/udev/rules.d/70-persistent-cd.rules
:
# Memorex_16X-DDL-IN (pci-0000:00:0f.1-scsi-0:0:0:0) SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:0:0", SYMLINK+="cdrom", ENV{GENERATED}="1" SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:0:0", SYMLINK+="cdrw", ENV{GENERATED}="1" SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:0:0", SYMLINK+="dvd", ENV{GENERATED}="1" SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:0:0", SYMLINK+="dvdrw", ENV{GENERATED}="1" # ATAPI_DVD-ROM_16X_Maximum (pci-0000:00:0f.1-scsi-0:0:1:0) SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:1:0", SYMLINK+="cdrom1", ENV{GENERATED}="1" SUBSYSTEM=="block", ENV{ID_CDROM}=="?*", ENV{ID_PATH}=="pci-0000:00:0f.1-scsi-0:0:1:0", SYMLINK+="dvd1", ENV{GENERATED}="1"
Once I figured out how to query udev for it's variables it's displaying, it all clicked into place:
# udevadm info -n /dev/sr2 -q all P: /devices/pci0000:00/0000:00:0f.0/ata3/host2/target2:0:0/2:0:0:0/block/sr2 N: sr2 S: bluray S: disk/by-id/ata-ATAPI_iHOS104_3775504067_206017500 S: disk/by-path/pci-0000:00:0f.0-scsi-0:0:0:0 S: dvd2 E: DEVLINKS=/dev/bluray /dev/disk/by-id/ata-ATAPI_iHOS104_3775504067_206017500 /dev/disk/by-path/pci-0000:00:0f.0-scsi-0:0:0:0 /dev/dvd2 E: DEVNAME=/dev/sr2 E: DEVPATH=/devices/pci0000:00/0000:00:0f.0/ata3/host2/target2:0:0/2:0:0:0/block/sr2 E: DEVTYPE=disk E: GENERATED=1 E: ID_ATA=1 E: ID_ATA_SATA=1 E: ID_ATA_SATA_SIGNAL_RATE_GEN1=1 E: ID_BUS=ata E: ID_CDROM=1 E: ID_CDROM_BD=1 E: ID_CDROM_CD=1 E: ID_CDROM_DVD=1 E: ID_CDROM_MRW=1 E: ID_CDROM_MRW_W=1 E: ID_MODEL=ATAPI_iHOS104 E: ID_MODEL_ENC=ATAPI\x20\x20\x20iHOS104\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20 E: ID_PATH=pci-0000:00:0f.0-scsi-0:0:0:0 E: ID_PATH_TAG=pci-0000_00_0f_0-scsi-0_0_0_0 E: ID_REVISION=WL0D E: ID_SERIAL=ATAPI_iHOS104_3775504067_206017500 E: ID_SERIAL_SHORT=3775504067_206017500 E: ID_TYPE=cd E: MAJOR=11 E: MINOR=2 E: SUBSYSTEM=block E: TAGS=:udev-acl: E: UDEV_LOG=3 E: UDISKS_PRESENTATION_NOPOLICY=0 E: USEC_INITIALIZED=1520096
Watch the udev events as the device status changes (opens, closes and loading, closed) to see how the environment variables change:
udevadm monitor --environment --udev
I created a new rule using those variables and put it into the cd-rules file. I chose my own variables to use as identifiers: the model ID and the firmware version.
# Sony Blu-ray SUBSYSTEM=="block", ENV{ID_MODEL}=="ATAPI_iHOS104", ENV{ID_REVISION}=="WL0D", SYMLINK+="dvd2", ENV{GENERATED}="1" SUBSYSTEM=="block", ENV{ID_MODEL}=="ATAPI_iHOS104", ENV{ID_REVISION}=="WL0D", SYMLINK+="bluray", ENV{GENERATED}="1"
After that, refresh udev and it worked:
udevadm trigger
Now I have /dev/dvd2
and /dev/bluray
. Yay :)