How to use a flash card reader with Linux - How to scan the SCSI bus

Posted in Linux/Unix/BSD -

While I was attempting to work out how to mount a flash card reader on Linux I discovered a couple of useful utilities which can be used to scan the SCSI bus on a Linux computer and show a list of SCSI and USB type devices, such as CD-ROMs, flash card readers etc. While trying to mount the flash card reader I at first thought I needed to manually add an entry to the /etc/fstab table and needed to get the device name and number but this didn't turn out to be the case. Refer to mount a flash card reader of this article to see how easy it is to mount a card reader on modern Linux distributions.

Note that SuSE Professional 9.0 was used to write this article. It is assumed that these utilties will work similarly well on other modern Linux distributions. If you have experience making this work on other distributions and it's a little diferent I'd love to hear your solution and will update this article accordingly.

sg_scan

The first utility is sg_scan. To get the necessary information you should use the -i flag otherwise the results are a little meaningless like so:

sg_scan -i

You will most likely have to be logged in as root when you do this otherwise you will probably see a somewhat self-explanatory error like so:

sg_scan: Error opening /dev/sg0 : Permission denied
sg_scan: Error opening /dev/sg1 : Permission denied
sg_scan: Error opening /dev/sg2 : Permission denied
sg_scan: Error opening /dev/sg3 : Permission denied
Stopping because there are too many error
    root access may be required

After logging in as root (or using sudo, su -c "sg_scan -i" etc), you'll see something like so:

/dev/sg0: scsi0 channel=0 id=0 lun=0 [em]   type=5
    HL-DT-ST   RW/DVD GCC-4240N   0110 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg1: scsi1 channel=0 id=0 lun=0 [em]   type=0
        [wide=0 sync=0 cmdq=0 sftre=0 pq=0x1]
/dev/sg2: scsi1 channel=0 id=0 lun=1 [em]   type=0
        [wide=0 sync=0 cmdq=0 sftre=0 pq=0x1]
/dev/sg3: scsi1 channel=0 id=0 lun=2 [em]   type=0
        [wide=0 sync=0 cmdq=0 sftre=0 pq=0x1]
/dev/sg4: scsi1 channel=0 id=0 lun=3 [em]   type=0
        [wide=0 sync=0 cmdq=0 sftre=0 pq=0x1]

This particular example shows us that there is a DVD player at /dev/sg0. After plugging in my flash card reader and running the command again, I got the following result:

/dev/sg0: scsi0 channel=0 id=0 lun=0 [em]   type=5
    HL-DT-ST   RW/DVD GCC-4240N   0110 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg1: scsi1 channel=0 id=0 lun=0 [em]   type=0
    Generic   STORAGE DEVICE     9138 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg2: scsi1 channel=0 id=0 lun=1 [em]   type=0
    Generic   STORAGE DEVICE     9138 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg3: scsi1 channel=0 id=0 lun=2 [em]   type=0
    Generic   STORAGE DEVICE     9138 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]
/dev/sg4: scsi1 channel=0 id=0 lun=3 [em]   type=0
    Generic   STORAGE DEVICE     9138 [wide=0 sync=0 cmdq=0 sftre=0 pq=0x0]

From this we can see there is some sort of storage device on /dev/sg1 through /dev/sg4. It is not possible to mount these devices directly so you need to use the sg_map utility.

sg_map

Entering sg_map when logged in as root will display something similar to:

/dev/sg0   /dev/scd0
/dev/sg1   /dev/sda
/dev/sg2   /dev/sdb
/dev/sg3   /dev/sdc
/dev/sg4   /dev/sdd

From this we can see that the device at /dev/sg1 can be mounted using the mapped device /dev/sda. However, if you try to mount the flash card (assuming that's what you've connected) after plugging the flash card into the reader like so:

mount -t msdos /dev/sda /path/to/mount/point

you'll get an error like so:

mount: wrong fs type, bad option, bad superblock on /dev/sda,
      or too many mounted file systems

Instead try mounting it like so:

mount -t msdos /dev/sda1/path/to/mount/point

and it will probably work. If you are using a multi card reader 1 may not be the appropriate number so try using 2 then 3 and so on. If the number is not correct you'll get an error message like so:

mount: /dev/sda2 is not a valid block device

Because I only have an a CF Card to test my multi card reader, and it's in the first slot, I'm assuming the second slot would be /dev/sda2.

If you mount your flash cards this way always remember to unmount the flash card before pulling it out of the reader otherwise you may damage the data on the card.




Comments