8/29/2006

Установка многослотового картридера в Linux: card reader in Linux HOWTO

Когда мне потребовалось читать и писать на многие виды флеш-карт, я пошёл на рынок и купил кардридер Transcend. Меня покорила его цена и гордая надпись на упаковке: Supported OSes - Windows, MacOS and Linux. Ну, думаю, дожил - производитель железа вспомнил о Пингвинах. И возрадовался. Преждевременно, как выяснилось потом...

Маленькие грабельки, которые могут больно ударить
Вонзаем USB-штепсель карт ридера в порт, втыкаем в карт ридер карточку и, затаив дыхание, ждём радостных сообщений dmesg. Если нам очень повезло и они появились - не спешите. Очень может быть, что обнаружен только первый слот card reader. На моём кардридере Transend это был MemoryStick, которого у меня не было никогда. На втыкание остальных карт он не реагировал. Почему?

Немного теории
Дело в том, что в Linux USB рассматривается как протокол "поверх SCSI" со всеми вытекающими последствиями. А именно: на одном шлейфе SCSI может висеть несколько устройств, которые общаются с системой независимо. Поддержка этой возможности (LUN - Logical Unit Numbers) в ядре есть, но она может быть выключена. Таким образом, для успешной работы многослотовых карт ридеров нужно, чтобы в ядре было включено:
---SCSI Support (CONFIG_SCSI, scsi.o)
---SCSI disk support (CONFIG_BLK_DEV_SD, sd_mod.o)
---SCSI generic support (CONFIG_CHR_DEV_SG, sg.o)
---Probe all LUNs on each SCSI device (CONFIG_SCSI_MULTI_LUN)
---Support for USB (CONFIG_USB, usb.o)
---Preliminary USB device file system (CONFIG_USB_DEVICEFS)
---USB ECHI HCD (CONFIG_USB_EHCI_HCD, usb-ehci-hcd.o), UHCI (CONFIG_USB_UHCI, usb-uhci.o), OHCI (CONFIG_USB_OHCI, usb-ohci.o)
---USB Mass Storage support (CONFIG_USB_STORAGE, usb-storage.o)
Выделенное красным полужирным шрифтом - обязательно включить, иначе будете видеть только первый слот. Эту одну маленькую опцию я искал неделю, но вам теперь будет легче.

Что делать?
1. Если ядро пересобирать не хочется/не можется/ не умеется, то делаем, как сказано здесь:

Дайте команду:
echo "scsi scsi-add-single-device    ">/proc/scsi/scsi

Например, для шестипортового кардридера:

root@localhost# echo "scsi add-single-device 1 0 0 5" > /proc/scsi/scsi
root@localhost# echo "scsi add-single-device 1 0 0 4" > /proc/scsi/scsi
root@localhost# echo "scsi add-single-device 1 0 0 3" > /proc/scsi/scsi
root@localhost# echo "scsi add-single-device 1 0 0 2" > /proc/scsi/scsi
root@localhost# echo "scsi add-single-device 1 0 0 1" > /proc/scsi/scsi
root@localhost# echo "scsi add-single-device 1 0 0 0" > /proc/scsi/scsi

2. Если ядро пересобрать - не проблема, то включаем там поддержку SCSI (как написано выше) с обязательной опцией Probe All SCSI LUNs. После этого картридер будет читать ваши флеш-карты во всех портах, а флешки будут видны как SCSI-диски, т.е. sda и партиции sda1 sda2 и так далее. Если руками монтировать лениво (и это правильно), пишем в /etc/fstab новую строчку:

/dev/sdc1 /mnt/sd vfat user,noauto,sync,noexec,nosuid,nodev,iocharset=koi8-r,codepage=866 0 0
Всё. После этого флеш-карты карт ридером воспринимаются и читаются/пишутся нормально. Не забываем отмонтировать флешки перед вытыканием :-)

Ссылки:
Кроме личных страданий, были использованы источники:
http://www.linux-sxs.org/hardware/flashreaders.html
http://www.cs.sfu.ca/%7Eggbaker/personal/cf-linux
http://hot-orange.narod.ru/chtivo/card-reader.htm
http://ru.wikibooks.org/wiki/LOR-FAQ-Hardware
http://www.ladoshki.com/?articles&id=139

2 комментария:

  1. Купил 4-х слотовый USB-кардридер, так что для меня написанное оказалось чрезвычайно полезным. Теперь rfhlhblth работает. Очередное спасибо, уважаемый virens. :)

    chitatel

    ОтветитьУдалить
  2. 2 chitatel
    Купил 4-х слотовый USB-кардридер, так что для меня написанное оказалось чрезвычайно полезным.
    Рад. В современных дистрибутивных ядрах это должно быть включено по умолчанию, а если ядро Linux самосборное, то очень просто это забыть. И долго удивляться, отчего кардридер ничего не видит.

    Теперь rfhlhblth работает.
    Ага, понял :-) Я за ваш rfhlhblth очень рад :-)))

    Очередное спасибо, уважаемый virens. :)
    Пожалуйста. Я эту опцию нашёл только после пятой попытки собрать ядро :-)
    Запомнилось надолго...

    ОтветитьУдалить