Debian установка драйверов usb

Обновлено: 06.07.2024

Обычно в системах Unix и Linux установка драйверов для новых устройств не вызывает трудностей. Даже для неопытных пользователей этих систем. Но это в том случае, если производители устройства (и/или разработчики драйверов) позаботились об этом. И оснастили пакет драйвера специальными установочными и конфигурационными скриптами. А также протестировали всё это в нескольких системах. Однако бывают случаи, когда «удобной» возможности установить драйвер устройства нет, но есть исходные коды драйвера. В таком случае можно попытаться собрать драйвер самостоятельно. Конечно, это далеко не так просто, нужно поэкспериментировать. Но успешный результат возможен с высокой вероятностью. И главное, что для этого требуется — это знать и понимать общий порядок действий в случае ручной сборки драйвера. С такими задачами часто сталкиваются администраторы систем, обслуживающих технологические процессы на производствах, хостинг-площадки и т. д.

Способы установки драйверов

Для Linux-систем установка драйверов устройств происходит тремя основными способами:

  • установка патча для определённых версий ядра;
  • использование специальных сценариев для установки и конфигурации драйвера;
  • с помощью загружаемого модуля ядра.

Надо признать, что для Linux ручная установка драйверов представляет собой довольно сложную и трудоёмкую работу. Поэтому разработчики стремятся всё чаще обеспечивать автоматическую установку и настройку для своих драйверов/устройств. Ведь они заинтересованы в максимально эффективном распространении своих разработок. По этой причине самым распространённым способом установки драйверов является использование сценариев установки. Для самых популярных типов устройств, например для видеокарт, аудиоустройств и даже для сетевого оборудования в настоящее время трудно найти драйверы без автоматической установки.Установка таких драйверов ничем не отличается от установки обычных пакетов. Вся инструкция описана в файле README, подробнее об установке из исходников читайте здесь.

Но есть оборудование (всевозможные адаптеры, преобразователи интерфейсов) и ситуации, для которых есть только исходные коды драйвера (часто не официальные) и необходимость интеграции его с ядром.

Если в качестве драйвера используются патчи ядра, то установить их (собственно и сам драйвер) можно выполнив следующие команды:

В случае с ручной установкой, необходимо для начала интегрировать драйвер некоего устройства (исходные коды) в дерево каталогов исходных кодов ядра.

Ручная установка драйвера

Для примера, пусть требуется добавить в ядро драйвер некоего сетевого устройства netdevice. Драйвер этого устройства нужно (как уже известно) поместить в один из каталогов с исходными кодами ядра. А именно — в каталог drivers, внутри которого может быть следующее содержимое:


Драйверы чаще всего помещаются в подкаталоги scsi, char, block, net, а также sound и usb. Эти подкаталоги отражают схему размещения драйверов в зависимости от их типа: блочные — для дисков IDE, символьные — для последовательных портов например, для сетевых устройств, звуковых плат и USB-устройств — USB-адаптеры, USB-модемы и т. д. Другие подкаталоги служат для размещения драйверов других категорий, в частности для системных и разного рода шин (pci, pcie, nubus, zorro), а также для платформенно-зависимых драйверов — acorn, macintosh.

Таким образом, драйверы для сетевого устройства netdevice следует поместить в следующий каталог:

Исходные коды драйвера представляют собой набор файлов *.c, *.cpp и *.h, которые могут быть объединены в дерево каталогов, в зависимости от того, как составлен проект «исходников» драйвера.

Теперь необходимо включить исходные коды драйвера netdevice в процесс компиляции ядра. Для этого нужно отредактировать следующие файлы:

  • /drivers/net/Makefile – для сборки самого драйвера;
  • /drivers/net/Kconfig – для того, чтобы имя нового устройства было доступно для конфигурирования.

Файлы Makefile и Kconfig содержатся в каждом каталоге дерева каталогов с исходными кодами ядра Linux. Это необходимо для организации универсальной разработки и расширения функционала и возможностей ядра при его сборке из исходных кодов путём независимого дополнения новым кодом. В данном случае кодом драйвера для устройства netdevice.

В файл Makefile следует добавить следующий код:

Таким образом, при сборке ядра в его составе будет собран и сам драйвер netdevice. После дополнения файла Kconfig следующим кодом:

устройство netdevice будет доступно для использования конфигурационным макросом (необходимо на этапе конфигурирования сборки ядра). Здесь команда config использует ключевое слово NETDEVICE_DEV, которое обязательно должно совпадать с фразой, следующей после CONFIG, которое ранее было указано в файле Makefile.

Использование нового драйвера

В современных версиях ядра Linux задействование новых драйверов существенно упрощено. В отличие версий, выпущенных раньше 2.6. Тогда это было настоящей головоломкой и требовало знаний в программировании. Но архитектурные изменения в модели драйверов и устройств, пришедшие в версии 2.6 позволяют теперь связывать драйверы с ядром на более высоком «общепользовательском» уровне. Для этого используется специальный конфигурационный макрос MODULE_DEVICE_TABLE. Он создаёт соответствия, которые позволяют утилите modprobe (и ей подобным) задействовать новые драйверы ядра.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Оригинал: "Device Drivers, Part 11: USB Drivers in Linux"
Автор: Anil Kumar Pugalia
Дата публикации: October 1, 2011
Перевод: Н.Ромоданов
Дата перевода: июнь 2012 г.

Эта статья, которая является частью серии статей о драйверах устройств в Linux, поможет вам начать писать ваш первый драйвер USB в системе Linux.

Флеш устройство Пагса было именно тем устройством, которым Светлана воспользовалась, когда они сели вдвоем за изучение мира драйверов USB в Linux. Самым быстрым способом с ним разобраться был обычный способ Пагса - выбрать устройство USB и написать для него драйвер для того, чтобы с ним поэкспериментировать. Поэтому они выбрали флэш устройство (т.е. USB флешку), которое было под рукой - JetFlash от Transcend, с ID поставщика 0x058f и ID продукта 0x6387 .

Обнаружение устройства USB в Linux

Независимо от того, есть ли драйвер для устройств USB в Linux системе или его нет, допустимое устройство USB всегда будет обнаруживаться в системе Linux в пространстве аппаратных средств и в пространстве ядра, поскольку система создана (и выполняет обнаружение) в соответствии со спецификациями протокола USB. Обнаружение в аппаратном пространстве осуществляется хост контроллером USB - как правило, соответствующем шинным устройством, аналогичным устройству PCI в системах x86. Соответствующий драйвер хост-контроллера обнаруживает устройство и транслирует информацию низкоуровнего физического слоя в конкретную информацию более высокого уровня протокола USB. Затем информация протокола USB, касающаяся устройства и, имеющая специальный формат, заносится в общий слой ядра USB (драйвер usbcore) в пространстве ядра, что позволяет обнаруживать устройства USB в пространстве ядра даже в том случае, когда отсутствует драйвер конкретного устройства.

Дальше — дело различных драйверов, интерфейсов и приложений (которые различны в различных дистрибутивах Linux) отображать обнаруженные устройства в пользовательском пространстве. На рис.1 показана иерархия подсистемы USB в Linux.


Рис.1: Подсистема USB в Linux

Краткий список всех обнаруженных устройств USB можно получить с помощью команды lsusb , которую следует запустить в роли пользователя root. На рис.2 приведен такой список как для случая с флэш устройством, так и без него. Параметр -v в команде lsusb позволяет получить более подробную информацию.


Рис.2: Информация, выдаваемая командой lsusb

Во многих дистрибутивах Linux, таких как Mandriva, Fedora, . , драйвер usbfs сконфигурирован так, что он загружается по умолчанию. В результате можно с помощью команды cat /proc/bus/usb/devices из директория /proc извлечь конкретную информации об обнаруженном USB-устройстве, представленную в удобном виде. На рис.3 показан типичный пример такой информации, которая находится в специальной секции, описывающей флэш-устройство. В списке обычно присутствует по одному такому разделу для каждого допустимого устройства USB, обнаруженного в системе.


Рис.3: Фрагмент информации из proc, касающейся USB

Разбираемся в секции, описывающей устройство USB

Чтобы дальше разбираться с этими секциями, нужно в первую очередь понять, что такое допустимое устройство USB. Для всех допустимых устройств USB есть одна или несколько конфигураций. Конфигурация устройства USB похожа на профиль, причем в качестве конфигурации, используемой по умолчанию, обычно используется первая конфигурация. Таким образом, в Linux для каждого устройства по умолчанию поддерживается только одна конфигурация. Для каждой конфигурации в устройстве может быть один или несколько интерфейсов. Интерфейс соответствует функции, предоставляемой устройством.

Интерфейсов может быть столько, сколько есть функций, предоставляемых устройством. Так, скажем, устройство МФУ USB-принтер (многофункциональное устройство) может выполнять печать, сканирование и отправку факсов, и, скорее всего, для него будет, по крайней мере, три интерфейса, по одному для каждой из функций. Таким образом, в отличие от других драйверов устройств, драйвер USB устройства, как правило, связывается / пишется отдельно для каждого интерфейса, а не для устройства в целом - это значит, что для устройства USB может быть несколько драйверов устройств, причем для интерфейсов различных устройств может использоваться один и тот же драйвер, - хотя, конечно, для одного интерфейса не может быть более одного драйвера.

Вполне нормальной и достаточно обычной является ситуация, когда для всех интерфейсов устройства USB используется один и тот же драйвер USB. В записи Driver=. для директория proc (рис. 3) показано, что в драйвер отсутствует отображение интерфейса ( none ).

Для каждого интерфейса есть один или несколько источников / приемников данных. Источник / приемник данных (endpoint) похож на конвейер (pipe), используемый для передачи информации в зависимости от функции либо в интерфейс, либо из интерфейса устройства. В зависимости от типа информации, источники / приемники данных могут быть четырех типов: Control, Interrupt, Bulk и Isochronous.

Прим.пер.: Подробное описание указанных четырех типов источников / приемников данных будет приведено в следующей статье данной серии статей.

Согласно спецификациям протокола USB во всех допустимых устройствах USB должен быть неявно используемый источник / приемник данных с номером 0 (end-point zero) — единственный двунаправленный источник / приемник данных. На рис.4 приведена полная наглядная схема допустимого устройства USB, соответствующее приведенному выше объяснению.


Рис.4: Общий взгляд на устройство USB

Вернемся обратно к секциям устройств USB (рис. 3) - первая буква в каждой строке соответствует различным частям спецификации устройства USB. Например, D - устройству, C - конфигурации, I - интерфейсу, E — источнику / приемнику данных (endpoint) и т.д. Подробнее об этом и о многом другом смотрите в исходном коде ядра в файле Documentation/usb/proc_usb_info.txt .

"Да, но ты не беспокойся — со всем этим можно будет разобраться подробнее позже. Давай со всем этим разбираться последовательно — возьмем интерфейс флеш устройства, связанного с драйвером нашего USB-устройства ( pen_register.ko )" — утешил Пагс.

Как и в любом другом Linux-драйвере, здесь также требуется конструктор и деструктор — используется тот же самый шаблон драйвера, который использовался для всех драйверов. Но содержимое будет другим, поскольку это драйвер слоя аппаратного протокола, т.е. горизонтальный драйвер в отличие от символьного драйвера, который был одним из вертикальных драйверов, рассмотренных ранее. Разница лишь в том, что вместо регистрации и отмены регистрации в VFS, здесь это должно выполняться на уровне соответствующего протокола — в данном случае — в ядре USB; вместо того, чтобы предоставлять интерфейс пользовательского пространства, например, файл устройства, он должен подключиться к реальному устройству в пространстве аппаратных средств.

Интерфейсы API для ядра USB выглядят следующим образом (прототип в <linux/usb.h> ):

В структуре usb_driver в соответствующих полях должны быть указаны имя устройства, идентификационная таблица, используемая для автообнаружения конкретного устройства, и две функции обратного вызова, которые вызываются ядром USB при горячем подключении и отключении устройства, соответственно.

Собираем все вместе в файл pen_register.c , который будет выглядеть следующим образом:

Затем можно повторить обычные шаги, выполняемые для любого Linux драйвера:

  • Собираем драйвер (файл .ko ) с помощью запуска команды make .
  • Загружаем драйвер с помощью команды insmod .
  • Выдаем список загруженных модулей с помощью команды lsmod .
  • Выгружаем драйвер с помощью команды rmmod .

Но, что удивительно, результат не будет таким, как ожидалось. Используйте команду dmesg и загляните в директорий proc для просмотра различных журналов и прочих подробностей. Это связано не с тем, что драйвер USB отличается от символьного драйвера, - здесь есть одна проблема. На рис.3 показано, что у флэш-устройства есть один интерфейс (с номером 0), который уже связан с обычным драйвером usb-storage.

Теперь, для того, чтобы связать наш драйвер с этим интерфейсом, нам нужно выгрузить драйвер usb-storage (т. е. выполнить команду rmmod usb-storage ) и переподключить флэш-накопитель. Как только это будет сделано, результаты станут такими, как ожидалось. На рис.5 показан фрагмент информации из журналов и из директория proc . Снова подключите и отключите (в горячем режиме) флеш устройство и пронаблюдайте, как действуют вызовы probe и disconnect.


Рис.5: Флеш устройство в действии

Подведем итог

"Наконец-то! Что-то действует!" - облегченно сказала Светлана. "Но мне кажется, что для того, чтобы собрать полный драйвер устройства USB, здесь есть еще много того, с чем следует разбираться (например, с идентификационной таблицей, обратными вызовами probe и disconnect и т. д.)".

"Да, ты права. Давай разбираться со всем по порядку и с перерывами " - ответил Пагс, прервав самого себя.

В настоящее время при работе с операционными системами подразумевается, что она всегда подключена к Интернету. Поэтому диски с драйверами сетевых карт больше не входят в комплект при продаже. И может возникнуть ситуация, что невозможно установить драйвер устройства, поскольку нет сетевого соединения, а сетевого соединения нет, потому что невозможно установить драйвер устройства. Рассмотрим несколько способов, как вырваться из этого замкнутого круга.

1. Использование проводного соединения

Если вы не можете настроить Wi-Fi подключение, то соедините компьютер с роутером проводом. Обычно Ethernet кабели уже входят в комплект роутеров. Есть высокий шанс, что ваш Linux поддерживает чипсет Ethernet гнезда и он работает без дополнительных пакетов. Обычно проводные соединения не требуют особой настройки.

2.Подключить USB адаптер для которого драйвера присутствуют в ядре Linux

Подойдёт практически любой USB адаптер кроме самых экзотических — в ядре Linux есть драйвера практически для всего. То есть вы получите Интернет и сможете сделать обычную установку.

3. Офлайн установка пакетов

На Linux с Интернетом вы можете скачать пакеты вручную:

А затем установить их на компьютере без Интернета:

В теории это всего две команды, но на практике возможны следующие проблемы:

Чтобы пакеты подошли, дистрибутив, на котором вы скачиваете должен быть таким же и такой же версии, где вы затем будете устанавливать пакеты. Иначе вам нужно искать ссылки для каждого пакета для вашего дистрибутива и скачивать вручную

У каждого из этих пакетов могут быть зависимости, а у тех зависимостей могут быть другие зависимости…

В общем, посмотреть зависимости можно командой:

Или вариант попроще, запустите команду (делать установку необязательно):

и посмотрите, какие пакеты будут предложены для установки. Скопируйте названия этих пакетов и загрузите с помощью «apt download».

4. Установка пакетов с Live или установочного диска

В репозиториях в качестве источника пакетов нужно прописать CD диск.

Для этого выполните команду:

Если, например, вы добавляете образ Wheezy, будет сгенерирован следующий результат:

To prepare the USB stick, we recommend to use a system where GNU/Linux is already running and where USB is supported. With current GNU/Linux systems the USB stick should be automatically recognized when you insert it. If it is not you should check that the usb-storage kernel module is loaded. When the USB stick is inserted, it will be mapped to a device named /dev/sdX , where the « X » is a letter in the range a-z. You should be able to see to which device the USB stick was mapped by running the command dmesg after inserting it. To write to your stick, you may have to turn off its write protection switch.

Процедура, описанная в этом разделе, уничтожит все данные на устройстве! Не ошибитесь в названии устройства карты памяти USB. Если вы укажите не то устройство, это может привести к полной потере информации где-то ещё, например, на жёстком диске.

4.3.1. Preparing a USB stick using a hybrid CD/DVD image

Debian installation images can now be written directly to a USB stick, which is a very easy way to make a bootable USB stick. Simply choose an image (such as the netinst, CD, DVD-1, or netboot) that will fit on your USB stick. See Раздел 4.1, «Official Debian GNU/Linux installation images» to get an installation image.

Также, для очень маленьких карт памяти USB, с размером в несколько мегабайт, вы можете скачать образ mini.iso из каталога netboot (по ссылке, упомянутой в Раздел 4.2.1, «Where to Find Installation Files»).

The installation image you choose should be written directly to the USB stick, overwriting its current contents. For example, when using an existing GNU/Linux system, the image file can be written to a USB stick as follows, after having made sure that the stick is unmounted:

Information about how to do this on other operating systems can be found in the Debian CD FAQ.

Образ должен быть записан на устройство, представляющее весь диск, а не отдельный раздел, например /dev/sdb, а не /dev/sdb1. Не используйте программы типа unetbootin , которые изменяют образ.

Simply writing the installation image to USB like this should work fine for most users. The other options below are more complex, mainly for people with specialised needs.

Гибридный образ занимает не всё место на карте, поэтому свободное пространство можно использовать для хранения файлов микропрограмм, пакетов или любых других ваших файлов. Это полезно, когда у вас есть только одна карта, или вы хотите сохранить всё необходимое на одном устройстве.

Создайте второй раздел FAT на карте, смонтируйте раздел и скопируйте или распакуйте на него микропрограмму. Пример:

Вы можете записать mini.iso на карту памяти USB. В этом случае второй раздел создавать не нужно, он появится самостоятельно. После вытаскивания и повторной вставки карты памяти USB должно появиться два раздела.

4.3.2. Копирование файлов на карту памяти USB вручную

An alternative way to set up your USB stick is to manually copy the installer files, and also an installation image to it. Note that the USB stick should be at least 1 GB in size (smaller setups are possible if you follow Раздел 4.3.3, «Копирование файлов на карту памяти USB вручную — гибкий путь»).

Существует файл "всё-в-одном" — hd-media/boot.img.gz, который содержит все файлы программы установки (включая ядро) , а также syslinux и его файл настройки .

Заметим, что хотя этот метод удобен, он имеет большой недостаток: логический размер устройства ограничен 1 ГБ, даже если ёмкость карты памяти USB гораздо больше. Вам нужно переразметить карту USB и создать новые файловые системы, чтобы снова получить всё пространство, если вы хотите использовать его для другой цели.

Чтобы использовать образ, просто распакуйте его прямо на карту памяти USB:

After that, mount the USB memory stick ( mount /dev/ sdX /mnt ), which will now have a FAT filesystem on it, and copy a Debian ISO image (netinst or full CD/DVD) to it. Unmount the stick ( umount /mnt ) and you are done.

4.3.3. Копирование файлов на карту памяти USB вручную — гибкий путь

Если вам хочется большей гибкости или вы просто хотите знать, что на самом деле происходит, то можете воспользоваться следующим методом записи файлов на карту памяти. Преимущество использования этого метода в том, что если ёмкость карты USB достаточно велика, то вы можете скопировать любой образ ISO, даже DVD.

4.3.3.1. Разметка карты памяти USB

Мы покажем как использовать на карте памяти только первый раздел, а не всё устройство.

Так как большинство карт памяти USB продаются с единственным разделом FAT16, то вам, вероятно, не хочется переразмечать или переформатировать устройство. Если вам всё равно это нужно сделать, воспользуйтесь cfdisk или любой другой утилитой разметки для создания раздела FAT16 [3] , настройте MBR с помощью

Команда install-mbr содержится в пакете Debian mbr . Затем создайте файловую систему:

Обязательно вводите правильное имя устройства карты памяти USB. Команда mkdosfs содержится в пакете Debian dosfstools .

In order to start the kernel after booting from the USB stick, we will put a boot loader on the stick. Although any boot loader should work, it's convenient to use syslinux , since it uses a FAT16 partition and can be reconfigured by just editing a text file. Any operating system which supports the FAT file system can be used to make changes to the configuration of the boot loader.

Чтобы поместить syslinux на раздел FAT16 карты памяти USB, установите в систему пакеты syslinux и mtools и введите

Ещё раз отметим: не ошибитесь в имени устройства. Раздел не должен быть смонтирован при запуске syslinux . Эта процедура записывает загрузочный сектор раздела и создаёт файл ldlinux.sys , который содержит код системного загрузчика.

4.3.3.2. Добавление образа программы установки

Смонтировав раздел ( mount /dev/ sdX1 /mnt ), скопируйте следующие файлы образа программы установки на карту памяти:

vmlinuz или linux (файл ядра)

initrd.gz (образ ramdisk)

Вы можете выбрать текстовую версию программы установки или версию с графическим интерфейсом. Последнюю можно найти в подкаталоге gtk . Если вы хотите переименовать файлы, учтите, что syslinux работает только с файловыми именами DOS (8.3).

Затем, вам нужно создать файл настройки syslinux.cfg , который, как минимум, должен содержать следующую строку (измените имя файла с ядром на « linux » , если используется образ netboot ):

Для графической версии программы установки нужно добавить в строку vga=788 . По желанию, можно добавлять и другие параметры.

Чтобы включить выдачу приглашения при загрузке для добавления дополнительных параметров, добавьте строку prompt 1 .

If you used an hd-media image, you should now copy the ISO file of a Debian ISO image [4] onto the stick. When you are done, unmount the USB memory stick ( umount /mnt ).

Читайте также: