Подключение флэш-диска к компьютеру с ОС Linux
|
|
|
название статьи: подключение флэш-диска к компьютеру с ОС Linux версия: 0.1 ключевые слова для поиска: подключение настройка flash-drive флэш-диск linux линукс usb 1. Введение. Для переноса небольших количеств информации (единицы-десятки мегабайт) очень удобны устройства флэш-памяти или, как их еще называют флэш-диски (flash-drive). Они небольшого размера, энергонезависимы, очень просты в использовании и не требуют выключения или перезагрузки компьютера при подключении. В Linux есть все возможности для использования этих устройств в качестве сменных носителей небольшой емкости. Все нижеследующее вы соглашаетесь использовать на свой страх и риск. Мы опубликовали это без каких-либо гарантий, но с надеждой на то, что это может оказаться полезным. 2. Общие соображения. Одной из приятных особенностей USB является то, что подключенные к ней устройства являются hot-pluggable по умолчанию, то есть их можно подключать и отключать без выключения питания системного блока. Дополнительным плюсом к этому является еще и то, что устройства распознаются сразу при подключении и в частном случае флэш-диска его остается только подмонтировать (либо вообще ничего не остается при использовании automount). Аналогично можно использовать и USB-фотоаппараты. Доступ к USB-устройствам в Linux осуществляется через эмуляцию шины SCSI, поэтому необходимо осуществить соответствующую поддержку в ядре. 3. Исходные данные. Ядро из ветки 2.4 или последние версии ядер из ветки 2.2 с http://www.kernel.org 4. Конфигурирование ядра. Весьма возможно, что в вашем ядре (особенно это характерно для последних версий дистрибутивов) все необходимое уже включено и собрано, поэтому для вас имеет смысл сразу попробовать рекомендации, приведенные в следующем пункте. Если же вы в этом не уверены или в вашем дистрибутиве такой поддержки нет, или еще что-нибудь, то вам придется переконфигурировать и пересобрать ваше рабочее ядро. Для использования флэш-дисков в ядре должны быть включены следующие опции (пример из конфига ядра 2.4.20): CONFIG_HOTPLUG = y CONFIG_PNP = y CONFIG_SCSI = m CONFIG_BLK_DEV_SD = y CONFIG_SCSI_MULTI_LUN = y # необязательно CONFIG_SCSI_CONSTANTS = y # необязательно CONFIG_SCSI_LOGGING = y # необязательно CONFIG_USB = m CONFIG_USB_DEBUG = y # необязательно CONFIG_USB_DEVICEFS = y CONFIG_USB_EHCI_HCD = m # USB 2.0 CONFIG_USB_UHCI_ALT = m # на всякий случай, если чипсетом не поддерживается предыдущая опция CONFIG_USB_STORAGE = m CONFIG_USB_STORAGE_DEBUG = y # необязательно (это часть вывода команды make config) При сборке ядра не забываем про make modules и make modules_install. 5. Настройка системы. После сборки и инсталляции ядра в /lib/modules/`uname -r`/kernel/drivers (здесь апострофы обратные) должны появиться каталоги scsi и usb. В них (кроме всего остального) должны быть следующие файлы: # ls scsi scsi_mod.o sd_mod.o # ls usb hcd storage uhci.o usbcore.o # ls usb/hcd ehci-hcd.o # ls usb/storage usb-storage.o Теперь надо загрузиться с новым ядром и попробовать следующее (либо сразу скомандовать lsmod) в указанной последовательности: # modprobe scsi_mod # modprobe usbcore # modprobe usb-storage # modprobe uhci Все четыре модуля должны присутствовать в выводе команды lsmod. Если вы получаете сообщения вроде 'Unresolved symbols …', то возможно вы работаете не с тем ядром или перед make modules_install не удалили каталог /lib/modules/`uname -r` (это актуально только для тех, кто пересобирал ядро) и присутствовавшие там модули от старой сборки конфликтуют с модулями от новой. Если ваш чипсет поддерживает USB 2.0, то вместо # modprobe uhci можно попробовать скомандовать # modprobe ehci_hcd log2_irq_thresh=0xnn где nn — номер прерывания, на котором 'висит' ваш USB хост-контроллер. Если в выводе этой команды встретится фраза 'init_module: No such device', то это означает, что USB 2.0 вашим чипсетом все-таки не поддерживается. Теперь можно попробовать подключить флэш-диск к компьютеру. В /proc/scsi должен появиться каталог usb-storage-N, а вывод # cat /proc/scsi/scsi должен дать информацию о диске среди прочих Attached devices (если у вас есть еще scsi-устройства) — Host, Channel, Id, Lun, Vendor, Model, Type, Rev. Если всего этого не произошло, но модули загрузились в память успешно (команды modprobe … чуть выше по тексту), то скорее всего у вас просто выключена поддержка USB в BIOS. Если других SCSI-устройств в системе нет, то этот диск обозначается через /dev/sda1. Т.к. они поставляются чаще всего отформатированными в ФС VFAT, то теперь для работы с диском достаточно отдать такую команду: # mount -t vfat /dev/sda1 /mnt/flash (при условии, что каталог /mnt/flash уже существует к этому моменту) — и каталог /mnt/flash доступен для чтения/записи (будьте внимательны — запись во флэш может блокироваться ключом на корпусе диска). Чтобы не писать такую длинную команду каждый раз, достаточно добавить в /etc/fstab такую строку: /dev/sda1 /mnt/flash vfat noauto,iocharset=koi8-r,codepage=866 0 0 # это в случае локали koi8-r и монтировать его потом при помощи команды # mount /mnt/flash САМОЕ ГЛАВНОЕ. Перед отключением диска не забудьте его отмонтировать, иначе записанных на него в процессе работы файлов физически может там не оказаться. 6. Замечания. Конечно, флэш-диск можно переформатировать в нужную файловую систему как и обычный диск. В reiser его форматить не рекомендую — почти треть емкости уходит под журнал.:) Скорость чтения/записи большого файла при VFAT-форматировании по показаниям MC — 600–800 КБ/сек. На каждый день четыре команды загрузки модулей (modprobe … выше по тексту) можно поместить в какой-нибудь из rc-файлов (например в rc.local) для того, чтобы они загружались при каждой загрузке системы. Весьма возможно, что все останется работоспособным и при сборке монолитного ядра (в контексте поддержки SCSI и USB) — просто я не пробовал. Еще у SCSI-устройств есть одна неприятность — стоит добавить еще один диск и для доступа к флэш-диску надо будет использовать /dev/sdb. Чтобы не заморачиваться именованием, воспользуемся devlabel (в случае ReHat, для Slackware или CRUX и им подобных поддержку devlabel придется добавлять самостоятельно), которая к тому же прекрасно интегрируется с hotplug. Сначала опросим идентификатор: # devlabel printid -d /dev/sda S:GENERICUSBDisk2.0 После добавим его под управление devlabel: # devlabel add -s /dev/smartcardreader -u S:GENERICUSBDisk2.0 --partnum 1 --automount чтобы флэш-диск всегда был доступен через /dev/smartcardreader и пусть монтирование выполняется автоматически. Осталось только определить соответствующую файловую систему в /etc/fstab: /dev/smartcardreader /mnt/flash vfat noauto,user,codepage=866,iocharset=utf8 0 0 # в случае локали utf8 Небольшое замечание — после имени устройства /dev/smartcardreader используйте хотя бы один пробел. Не нажимайте табуляцию! И, конечно, поставьте свою кодировку в iocharset. 7. Еще одно замечание. Если к Вам попал многоформатный считыватель флеш-карт, например '6 in 1 USB2.0 Flash Drive', то Вы можете наткнуться на отсутствие реакции системы на вставляемую карту. Поэтому ниже приводится пересказ кусочка документации 'Linux USB Frequently Asked Questions' с сайта: http://linux-usb.org, с моими дополнениями. Некоторые дистрибутивы (в особенности RedHat) выключают в конфигурации ядра опцию CONFIG_SCSI_MULTI_LUN. Из-за этого usb-storage не может автоматически определить все вставляемые карточки. Вы можете либо перекомпилировать ядро, включив указанную опцию, либо попробывать следующее действие: echo >/proc/scsi/scsi «scsi add-single-device 1 0 0 1» Первая 1 — это host id. Если выполнить «cat /proc/scsi/scsi», то можно увидеть, что-то типа: … Host: scsi1 Channel: 00 Id: 00 Lun: 00 Vendor: SMSC Model: USB 2 HS-CF Rev: 0.@9 Type: Direct-Access … Т.е. в данном случае, scsi1 и указывает на host id, равный 1. Заметьте также, что на данном LUN (логическом модуле) обслуживается формат CompactFlash (HS-CF). Обычно, SCSI устройство не использует логические модули, т. е. он всегда один. Но в данном случае, мы как раз и сталкиваемся со SCSI устройством с несколькими логическими модулями. Второй 0 — канал, который для usb-storage, вроде бы, должен быть равен 0. Третий 0 — для usb-storage всегда должен быть равен 0. А четвертый параметер и есть искомый LUN. Обратите внимание, что в данной команде нумерация LUN'ов идет с 1, а в файле /proc/scsi/scsi с нуля. Данная команда должна быть повторена по всем LUN'ам, которые поддерживаются многоформатным устройством. После выполнения каждой из команд, появляются все новые поддерживаемые устройством форматы, например: … Host: scsi1 Channel: 00 Id: 00 Lun: 03 Vendor: SMSC Model: USB 2 HS-SD/MMC Rev: 0.@9 Type: Direct-Access ANSI SCSI revision: 02 … т. е. SecureDigital/MultiMediaCard. |