Google

13 сент. 2011 г.

Lenovo G460e: Не работает Card Reader в Ubuntu 11.04

После установки Ubuntu 11.04 (ядро 2.6.38-11-generic) долгое время  не работал Card Reader от RealTek для флеш-карт SDHC на ноутбуке Lenovo G460e.
В интернете очень много советов для решения данной проблемы, но многие из них либо не работают, либо одно из двух. Многие советы мне не помогли (например, прописать определенные параметры в файлы конфигурации загрузчика Grub).
Тем не менее, не так давно на одном из форумов Ubuntu (ubuntuforrums.org) нашел решение данной проблемы. 
Для начала убедимся, действительно ли у нас Card Reader от  RealTek:
lsusb
Вывод данной команды будет выглядеть примерно таким образом:
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 09da:054f A4 Tech Co., Ltd 
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 004: ID 0bda:0139 Realtek Semiconductor Corp. 
Bus 002 Device 003: ID 04f2:b273 Chicony Electronics Co., Ltd 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Шестая строчка сверху и есть наш Card Reader.  Итак, решение проблемы (на английском языке, ответ №6) можно посмотреть здесь. Если в двух словах, то пользователю  freechelmi компания Realtek выслала драйвера для данного устройства. Скачать их можно по данной ссылке: http://ubuntuone.com/p/153B/ . 
Либо можно скачать по данной ссылке.
После того, как архив был скачан - распаковываем его, открываем консоль и в ней  переходим в распакованную папку. Далее от имени нашего пользователя в консоли запускаем команду:
make
Затем
sudo make install
И затем
sudo depmod
После установки драйвера перезагружаем нашу ОС.

upd: Как выяснилось в процессе работы, после данных манипуляций все флешки будут монтироваться с именем usb0 (в /media/usb0) без права доступа, да еще и в названиях файлов и папок будут знаки "?" вместо букв. Как вариант, можно, например, сделать umount /dev/usb0, а затем в Nautilus слева выбрать нашу флешку. В результате монтирование флешки должно произойти точно таким же образом, как это происходило до установки драйвера. Но этот вариант не очень удобен. Существует еще один вариант, как вернуть все на круги своя, но для начала немного теории.
В linux работу по подключению/отключение различных устройств выполняет ядро, которому, в свою очередь, помогает менеджер устройств udev. Все подключенные устройства в системе на текущий момент хранятся в папке /dev. Кроме того, для каждого устройства udev имеет свои справила, которые находятся в папке
/lib/udev/rules.d/* 
Причем, если внимательно присмотреться к названию правил, то можно увидеть, что все они начинаются с арабских цифр. Дело в том, что udev читает правила в алфавитном порядке. Исходя из этого вполне логично, что правило с меньшим числом будет прочитано раньше правила с бОльшим числом.  Но на данный момент нас интересует всего-лишь одно правило: usbmount.rules. 
Если не в даваться в подробности, то данное правило можно либо удалить, либо переместить в какое-нибудь надежное место (в качестве резерва или, если что-то пойдет не так). Лично я рекомендую не удалять данное правило, а переместить его куда-нибудь.  После перемещения данного правила все флешки должны монтироваться правильно.

Если флешки не монтируются по каким-то другим причинам (например, драйвер, описанный выше, не устанавливался вообще), то пробуем вариант, описанный ниже:
Открываем  файл usbmount.rules .Если данного файла нету-создаем его. У меня, например, на стационарном компьютере в системе данный файл отсутствует, а вот на ноутбуке, после установки драйверов для Card-reader-а, данный файл появился с таким содержимым:
KERNEL=="sd*", DRIVERS=="sbp2", ACTION=="add", RUN+="/usr/share/usbmount/usbmount add"
KERNEL=="sd*", SUBSYSTEMS=="usb",ACTION=="add",RUN+="/usr/share/usbmount/usbmount add"
KERNEL=="ub*", SUBSYSTEMS=="usb",ACTION=="add",RUN+="/usr/share/usbmount/usbmount add"
KERNEL=="sd*",ACTION=="remove", RUN+="/usr/share/usbmount/usbmount remove"
KERNEL=="ub*",ACTION=="remove",RUN+="/usr/share/usbmount/usbmount remove"

Что мы имеем и что это все означает. Если вкратце, то

KERNEL="sd*" - фильтрация устройств по имени;
ACTION=="add" - событие добавления устройства.
RUN+="/usr/share/usbmount/usbmount add" - описание команды (в данном случае usbmount)
REMOVE=="sd*" - удаление устройства.
Причем, стоит заметить, что в данном (да и в любом правиле) каждая отдельная строка - это новое правило для udev.
Итак, если файл usbmount.rules существует и его содержимое выглядит примерно также, как описано выше, то каждую строчку (каждое правило) нужно закомментировать (в начале строки поставить символ # ),  а ниже добавить следующие строки:
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mkdir -p /media/usb-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mount -O iocharset=utf8,codepage=866,uid=1000 /dev/%k /media/usb-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/umount /media/usb-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/rm -r /media/usb-%k"
(примечание: каждая новая строка в данном конкретном случае начинается со слов SUBSYSTEM)
В данном случае мы говорим udev, что бы при монтировании флешки создавалась папка с именем флешки (за это отвечает параметр %k), а при отключении флешки - папка с названием флешки удалялась.  

2 comments:

Отправить комментарий

Social