====== udev ======
* [[cdrom_id]]
* [[udevadm]]
==== 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 :)