slackware.ru
http://www.slackware.ru/forum/

Чудеса с флешкартами и картридерами
http://www.slackware.ru/forum/viewtopic.php?f=30&t=817
Страница 1 из 1

Автор:  anvpro [ 01 окт 2012 16:19 ]
Заголовок сообщения:  Чудеса с флешкартами и картридерами

Недавно понял как эффективно разрешить довольно древнюю проблему с Flesh Card ну, как минимум теми что я пользую Transcend и Qumo SD HC 32Gb.
Проблема заключается в следующем:
когда на карту записываешь большой (больше 4 Мб) файл - он прекрасно пишется - и прекрасно читается - никаких ошибок вообще, но его содержимое чудесным образом оказывается другим. Этот глюк свойственен как линуксу так и виндам и даже макос - везде примерно одинаково - пишем - читаем - ок, но содержимое файла разное...
но что еще более не приятно - когда записываешь несколько гигов мелких файлов - порой вообще слетает FAT32 на карте...
в линуксе все лечится, как оказалось тривиально, нужно лишь научиться читать книжки...

# echo 64 > /sys/block/sdc/device/max_sectors
где sdc - это наша карточка
и все - работает безупречно, взял с
http://www.linux-usb.org/FAQ.html#i5

но в этой связи возник вопрос:
а как это теперь автоматизировать? этож не годится: каждый раз заходить под админом в консоль и писать echo 64 > /sys/block/sdc/device/max_sectors, как только воткнешь карту в картридер...
видимо, как-то нужно подкрутить правила для udevа, вопрос лишь как...
мне, например, даже не понятно, как отличить картридер от обычной флешки находясь внутри этих правил,
если кто-то решал подобную задачу, то великая просьба, напишите - не обленитесь пожалуйста :-)
представьте что
с картами работать наш слак
станет лучше вындоуз или мак ;-) :-)

Автор:  bormant [ 01 окт 2012 16:26 ]
Заголовок сообщения:  Re: Чудеса с флешкартами и картридерами

Например, так: http://lmgtfy.com/?q=udev+max_sectors
http://serverfault.com/questions/21081/ ... s-on-linux

ps. И раз уж у вас есть где понаблюдать проблему, было бы неплохо отписаться в этой теме, что делали и помог ли рецепт. Спасибо.

Автор:  anvpro [ 02 окт 2012 23:30 ]
Заголовок сообщения:  Re: Чудеса с флешкартами и картридерами

Рецепт помог, еще побродил по страничкам
https://bugzilla.redhat.com/show_bug.cgi?id=517771
http://serverfault.com/questions/21081/ ... s-on-linux
и вот что в итоге:

делаем файл
/etc/udev/rules.d/70-persistent-sd.rules
со следующим содержимым:
Код:
# Rules for SD Cards
# Transcend
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="Flash Reader*", RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"
# Microsonic Mini Card Reader
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="Card  Reader*", RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"
# Realtek rts 5139
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="xD/SD/*",       RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"


и... перетыкиваем картридеры, если случай тяжелый..., то
. /etc/rc.d/rc.udev force-restart
но у меня все завелось и без рестарта udev

Казалось бы живи и радуйся..., но в коде сразу явствует недостаток и очень серьёзный - картридеры определяются по контексту ATTRS{model}, это значит, что не все картридыеры будут работать.
если у вашего картридера нет в этом списке - то создайте строчку по аналогии с тремя упомянутыми записав в сравнение с ATTRS{model} свой картридер.

Узнать параметр можно так:
udevadm info -a -p /sys/block/sdc | grep 'ATTRS{model}=='
где sdc - это каким девайсом он у вас монтируется в системе.

я был бы очень благодарен если бы пользователи форума использующие картридыеры записали в данную ветку параметры которые выдают их картридеры - это позволило бы дополнить и усовершенствовать список.

Конечно, очевидно, что нужно брать все идентификатры производителей и картридеров, обладающих подобной проблемой (а обладают ей, к сожалению, практически все, встреченные мной в практике картридеры) и составлять бесконечный список из файла 70-persistent-sd.rules.
Но, это не в моих силах... Так, что будем заполнять хотя бы по ATTRS{model} - кривовато, но зато, все, вскладчину у нас заработает правильно и стабильно :-)

Автор:  anvpro [ 19 ноя 2013 10:10 ]
Заголовок сообщения:  Re: Чудеса с флешкартами и картридерами

Напаролся на еще один глючный девайс (самое интересное, что подключал после выявления трех проблемных устройств разные ридеры они в принципе сносно работали и со значением 240)
но вот приобрел Автомобильный DVR Digma D-Vision DVR12 - и... проблема вновь обрела акктуальность уже, правда на Slackware 14.1 с новым ядром, но грабли классические оказались:

Для тех у кого подобная проблема - новое содержимое файла /etc/udev/rules.d/70-persistent-sd.rules
Код:
# Rules for SD Cards
# Transcend
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="Flash*Reader*",   RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"
# Microsonic Mini Card Reader
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="Card*Reader*",    RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"
# Realtek rts 5139
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="xD/SD/*",         RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"
# Digma DVR (Novatek Microelectronics Corp.)
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="Camera*Storage*", RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"

Автор:  yars [ 18 дек 2013 02:11 ]
Заголовок сообщения:  Re: Чудеса с флешкартами и картридерами

А чем плохо такое правило:
Код:
ACTION=="add", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", KERNEL=="sd*?", ATTR{removable}=="1", ATTR{device/max_sectors}=="*", ATTR{device/max_sectors}="64"

?
У меня есть некий картридер некоей CBR (Cyber Brand Retail), замеченный в намеренной порче файлов. Данная тема мне очень помогла, и даже была добавлена в закладки, но не понимаю, зачем писать правила для каждого устройства - ведь проблеме подвержено подавляющее число устройств.
Обнаруживается этот ридер как
Код:
# udevadm monitor --property
...
UDEV  [24109.321789] add      /devices/pci0000:00/0000:00:1d.7/usb1/1-6 (usb)
ACTION=add
BUSNUM=001
DEVNAME=/dev/bus/usb/001/031
DEVNUM=031
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-6
DEVTYPE=usb_device
ID_BUS=usb
ID_MODEL=Mass_Storage_Device
ID_MODEL_ENC=Mass\x20Storage\x20Device
ID_MODEL_ID=1336
ID_REVISION=0100
ID_SERIAL=Generic_Mass_Storage_Device_00000000000006
ID_SERIAL_SHORT=00000000000006
ID_USB_INTERFACES=:080650:
ID_VENDOR=Generic
ID_VENDOR_ENC=Generic\x20\x20\x20
ID_VENDOR_ID=048d
...

# lsusb -v -s 001:036

Bus 001 Device 036: ID 048d:1336 Integrated Technology Express, Inc. SD/MMC Cardreader
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x048d Integrated Technology Express, Inc.
  idProduct          0x1336 SD/MMC Cardreader
  bcdDevice            1.00
  iManufacturer           1 Generic   
  iProduct                2 Mass Storage Device
  iSerial                 3 00000000000006
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               1
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

Автор:  anvpro [ 03 мар 2014 13:10 ]
Заголовок сообщения:  Re: Чудеса с флешкартами и картридерами

Ура товарищи!!!
кажется стала понятна причина такого поведения некоторых устройств.
Все дело в несоответствующем разбиении записанном в загрузочный сектор носителя. В подробности я не вникал
Собственно, как я понял, система (любая) берет параметры по которым работает с устройством именно из первых 512 байт и что в них - так и работает. Но реально проблема в том что некоторые устройства сами уже с завода изготовителя "неправильно" передают эти данные - от сюда это "странные баги".
А теперь как это решить раз и на всегда (правда, только в Linux с udev):

Создадим файл:
/etc/udev/rules.d/70-persistent-sd.rules
Код:
# ATTRS{bMaxPacketSize0}=="64"
SUBSYSTEM=="block", KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{bMaxPacketSize0}=="64", RUN+="/bin/sh -c '/bin/echo 64 > /sys/block/%k/device/max_sectors'"


Очевидно, что мы просто жестко присваиваем максимальный размер сектора в 64 для usb-дисковых устройств не поддерживающих размер пакета больше 64.
Конечно этот размер может быть и не 64 а скажем, другой, но на практике я пока не встретил устройств у которых этот параметр был бы другим, если кто встретит - не обленитесь, пожалуйста, напишите :-)

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/