Missing Memory Card Icons on Ubuntu
Depending on your type of memory card reader, you may have noticed the following on Ubuntu (and possibly other distributions too). When you connect a USB flashdrive to your system an icon pops up informing you the drive has been mounted. When you insert (for example) an SD card into your cardreader, it may happen that another icon pops up using the same icon as the flashdrive.
While this isn’t the biggest problem in the world, it’s certainly a nuisance, as you’d need to hover over each icon to see the tooltip which explains to you which icon represents what. Ideally you’d want the SD card to show up with an appropriate SD card icon.
Which icon is displayed ultimately depends on disk management done by udisks and more importantly udev. In /lib/udev/rules.d/80-udisks.rules (do NOT modify this file) we find the following rules:
SUBSYSTEMS=="usb", ENV{ID_MODEL}=="*SD_Reader*", ENV{ID_DRIVE_FLASH_SD}="1" SUBSYSTEMS=="usb", ENV{ID_MODEL}=="*Reader*SD*", ENV{ID_DRIVE_FLASH_SD}="1" SUBSYSTEMS=="usb", ENV{ID_MODEL}=="*CF_Reader*", ENV{ID_DRIVE_FLASH_CF}="1" SUBSYSTEMS=="usb", ENV{ID_MODEL}=="*SM_Reader*", ENV{ID_DRIVE_FLASH_SM}="1" SUBSYSTEMS=="usb", ENV{ID_MODEL}=="*MS_Reader*", ENV{ID_DRIVE_FLASH_MS}="1"
The above rules are matched against the device names which are passed to the kernel. With one of my cardreaders, this sadly doesn’t match:
$ dmesg | grep -i Direct-Access scsi 12:0:0:0: Direct-Access Generic Compact Flash 0.00 PQ: 0 ANSI: 2 scsi 12:0:0:1: Direct-Access Generic SM/xD-Picture 0.00 PQ: 0 ANSI: 2 scsi 12:0:0:2: Direct-Access Generic SDXC/MMC 0.00 PQ: 0 ANSI: 2 scsi 12:0:0:3: Direct-Access Generic MS/MS-Pro/HG 0.00 PQ: 0 ANSI: 2
To create new rules, we first need to figure out what USB vendor/product IDs belong to the cardreader, you can just identify USB devices attached to your computer like so:
$ lsusb Bus 002 Device 012: ID 048d:1345 Integrated Technology Express, Inc. Multi Cardreader
Just run the command once before attaching the device and once after attaching the device and look for the differences, typically it’ll be the last device in the list. Once we have this information create a new file (replace pmjdebruijn with your own nickname, use exclusively alphanumeric characters):
$ sudo nano -w /etc/udev/rules.d/80-udisks-pmjdebruijn.rules
In this file we put the following lines:
# ITE, Hama 00055348 V4 Cardreader 35 in 1 USB SUBSYSTEMS=="usb", ATTRS{idVendor}=="048d", ATTRS{idProduct}=="1345", ENV{ID_INSTANCE}=="0:0", ENV{ID_DRIVE_FLASH_CF}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="048d", ATTRS{idProduct}=="1345", ENV{ID_INSTANCE}=="0:1", ENV{ID_DRIVE_FLASH_SM}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="048d", ATTRS{idProduct}=="1345", ENV{ID_INSTANCE}=="0:2", ENV{ID_DRIVE_FLASH_SD}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="048d", ATTRS{idProduct}=="1345", ENV{ID_INSTANCE}=="0:3", ENV{ID_DRIVE_FLASH_MS}="1"
You’ll notice the idVendor and idProduct coming from the lsusb line above, also the ID_INSTANCE needs to have matching LUNs with the dmesg lines above. Once you’re done, doublecheck and save the file, and then you can reload the udev rules:
$ sudo udevadm control --reload-rules
Any newly mounted memory cards should get a proper icon now.
Not all cardreaders may be as easy as illustrated as above, for example I have a wonderful cardreader that provides no useful information at all:
$ lsusb Bus 002 Device 009: ID 05e3:0716 Genesys Logic, Inc. USB 2.0 Multislot Card Reader/Writer $ dmesg | grep -i Direct-Access scsi 6:0:0:0: Direct-Access Generic STORAGE DEVICE 9744 PQ: 0 ANSI: 0 scsi 6:0:0:1: Direct-Access Generic STORAGE DEVICE 9744 PQ: 0 ANSI: 0 scsi 6:0:0:2: Direct-Access Generic STORAGE DEVICE 9744 PQ: 0 ANSI: 0 scsi 6:0:0:3: Direct-Access Generic STORAGE DEVICE 9744 PQ: 0 ANSI: 0 scsi 6:0:0:4: Direct-Access Generic STORAGE DEVICE 9744 PQ: 0 ANSI: 0
In such a particular case, you’ll need to experiment by actually inserting various types of memory cards, and checking what device got mounted, and what LUN is it, in the following example I inserted an SD card, which got mounted as sdk, which turns out to be LUN 0:2, which we need for the ID_INSTANCE entries:
$ mount | grep media /dev/sdk1 on /media/FC30-3DA9 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks) $ dmesg | grep sdk sd 12:0:0:2: [sdk] Attached SCSI removable disk sd 12:0:0:2: [sdk] 248320 512-byte logical blocks: (127 MB/121 MiB) sd 12:0:0:2: [sdk] No Caching mode page present sd 12:0:0:2: [sdk] Assuming drive cache: write through sd 12:0:0:2: [sdk] No Caching mode page present sd 12:0:0:2: [sdk] Assuming drive cache: write through sdk: sdk1
Another peculiarity (or feature) of this drive is that it has 5 LUNs instead of 4, this is because it actually has two SD card slots, one for full size SD cards and one for microSD cards. In the end, after some fiddling, I ended up with:
# Genesys Logic, Conrad SuperReader Ultimate SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0716", ENV{ID_INSTANCE}=="0:0", ENV{ID_DRIVE_FLASH_CF}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0716", ENV{ID_INSTANCE}=="0:1", ENV{ID_DRIVE_FLASH_SM}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0716", ENV{ID_INSTANCE}=="0:2", ENV{ID_DRIVE_FLASH_SD}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0716", ENV{ID_INSTANCE}=="0:3", ENV{ID_DRIVE_FLASH_MS}="1" SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0716", ENV{ID_INSTANCE}=="0:4", ENV{ID_DRIVE_FLASH_SD}="1"