Автор статьи: San АНДРЕЕВ Дата: 23.07.2003
название статьи: подключение флэш-диска к компьютеру с ОС 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 с
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' с сайта: с моими дополнениями.
Некоторые дистрибутивы (в особенности 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.
8. Авторы.
Logvinon
San АНДРЕЕВ
Обоснованные исправления и дополнения приветствуются.
|