Работа с оборудованием в Linux («Сага о Драйверах»)
Когда компьютеры назывались «электронно-вычислительными машинами», они были размерами в среднем с кухонный гарнитур и занимались почти исключительно вычислениями. Ввод и вывод данных воспринимался пользователями ЭВМ — учёными-математиками — как нечто необходимое, но к работе ЭВМ имеющее лишь косвенное отношение. Учёного было довольно просто обучить, чтобы он составлял программы и оформлял входные данные для расчётов одним каким-нибудь способом, например, при помощи перфокарт. Подключение к компьютеру какого-нибудь другого устройства было делом трудоёмким, так как требовало усилий и электронщика, и программиста. Да и нужно это было нечасто.
Нынешний компьютер — игрушка не учёного, а любого рядового обывателя. Это бытовой прибор. Мало того, компьютер — это «самый умный» бытовой прибор: если имеется какой-нибудь другой бытовой прибор (скажем, кофеварка), прогрессивный обыватель тут же задумывается, нельзя ли обучить компьютер управлять этим прибором (скажем, варить кофе за минуту до приезда хозяина). В идеале получается «электронный дом», в котором работу любого оборудования можно контролировать, не вставая из-за рабочего места, или даже не садясь за него — посредством сети Интернет.
Самое поверхностное суждение об оборудовании и компьютере — что для подключения прибора нужна волшебная субстанция по имени «драйвер». Есть драйвер — компьютер оборудование «видит», нет драйвера — «не видит».
Это суждение во многом неверно.
Что такое «оборудование»?
Что и как можно подключить к компьютеру? Во-первых, на поверхности его корпуса обычно наблюдается множество разнообразных отверстий и разъёмов, очевидно предназначенных для того, чтобы туда что-то подключали. Уже подключены: клавиатура, мышь, монитор, возможно — принтер, наушники или колонки. Много отверстий остаётся неиспользованными, но и аппаратуры в «электронном доме» ещё много — от КПК до той же кофеварки (если на ней есть соответствующий разъём).
Во-вторых, внутри компьютера имеются специальные разъёмы для подключения к ним плат расширения: устройств, выглядящих не как бытовой прибор, а скорее как деталь самого компьютера. Таковы видеоадаптеры, сетевые адаптеры, «внутренние» модемы и т. п. Эти устройства — главный источник «Саги о Драйверах», потому что их много, и создатели каждого такого устройства желают сохранить его устройство втайне от конкурентов, прилагая к ним вместо документации ту самую волшебную субстанцию с пометкой «нажмите кнопку « Пуск » и попытайтесь расслабиться: от вас уже ничего не зависит».
В-третьих, ещё более внутри компьютера есть какие-то устройства, которые нельзя ни отключить, ни подключить, однако они используются при работе, имеют какое-то название и на разных компьютерах могут весьма отличаться. Например, звуковые подсистемы могут быть интегрированными, а могут быть выполненными в виде платы расширения, отличаясь редкостным разнообразием моделей и однообразием функций (разъём для микрофона, разъём (ы) для колонок, линейный вход. что-то ещё?). Или устройство, к которому подключаются жёсткие диски: оно может быть рассчитано на 1 диск, 2, 4, иногда — более, иметь разные дополнительные свойства. и тоже требовать «драйвера» — по крайней мере, поддержки со стороны системы.
Что точно отличает один прибор от другого — это внешний вид разъёма, с помощью которого они подключаются к компьютеру. Очевидно, приборами, подключаемыми к разъёмам разного типа, машина управляет существенно по-разному. Более того, разъёмы настолько различны, что соединительный кабель одного типа просто не влезет в разъём другого 1 . Но всё равно, это не решает проблемы идентификации: например, мышь, подключённая к разъёму (порту) USB, отлично работает, а с цифровой фотокамерой как-то спроста не получается. Опять «драйвер» нужен?
Можно добавить, что некоторое оборудование вообще не нуждается в том, чтобы машине объявляли о его существовании: так, что бы ни подключалось к аналоговому звуковому входу, работать оно будет одинаково, компьютер не отличит колонки от наушников, да и отсутствия их не заметит. Словом, наружное наблюдение не даёт достаточно информации о том, как работать с оборудованием. На помощь должна прийти документация, но если в ней опять встретится слово «драйвер», оно может означать что угодно: слишком оно неопределённое.
Как распознаётся оборудование?
Попробуем внести определённость. Какую информацию относительно подключаемого прибора получает компьютер, и как он её получает?
Очевидно, «с той стороны», каждого разъёма, (допустим, USB, в который мы воткнули flash-диск), имеется какое-то оборудование, которое позволяет им пользоваться (как и USB-мышкой, USB-принтером и т. п). Это оборудование:
- определяет тип подключённого устройства
- управляет им (может, например, выключить или включить)
- передаёт на это устройство данные и/или принимает их оттуда
Такое оборудование называется шиной (bus). Этимология этого слова — что русского, что английского — загадочна и восходит к доисторическим временам, когда компьютеры назывались «ЭВМ».
Шин в компьютере несколько (грубо говоря — по количеству различных типов разъёмов). Есть совсем «глупые» шины — например, порт последовательного ввода-вывода (к нему подключаются мыши и прочая аппаратура «старого образца»). Глупость их в том, что информацию о типе подключённого оборудования приходится задавать вручную — либо заранее, либо с помощью наводящих вопросов пользователю.
Есть шины весьма умные, способные опросить и понять множество характеристик подключённого устройства. Такова, например, шина PCI — наиболее распространённое на сегодня оборудование для подключения плат расширения. Любопытный пользователь может посмотреть список устройств, подключённых к шине PCI с помощью команды lspci (от «list PCI», команда из пакета pciutils ):
К шине PCI в качестве устройства подключена другая шина — USB, служащая для подсоединения внешних устройств. Она тоже довольно умная, а ещё отличается тем, что устройства подключаются к ней и отключаются от неё довольно часто. Существует команда lsusb (из пакета, естественно, usbutils ), но ей, как и lspci приходится пользоваться нечасто (она даже убрана в каталог /usr/sbin , с глаз пользовательских долой):
Специальный каталог /sys отражает представление системы о присоединённых к ней устройствах. В частности, все найденные на шинах устройства перечислены в виде подкаталогов /sys/bus/шина/devices . Если устройство установлено, а умная шина, наподобие PCI или USB, его не заметила — скорее всего неполадка аппаратная (несовместимое или неисправное устройство, таракан в разъёме и т. п.).
Увы. Бывает и так: устройство (видеокарта, модем, кофеварка) на шине появилось, а воспользоваться им не удаётся. Видимо, чего-то не хватает. драйвера?
Что такое «драйвер» и где он находится?
А в самом деле, чего может не хватать, если устройство распозналось, марка устройства — известна и как передавать данные по шине — тоже известно? Не хватает главного: сведений о том, какие данные надо передавать, чтобы добиться от устройства желаемого эффекта. Что передать по шине USB, чтобы кофеварка выключилась? Какие байты записать в последовательный порт модема, чтобы он повесил трубку? Что сделать с видеокартой, чтобы. всё было быстро и непременно 3d!?
Это вот «какие данные» — и есть «драйвер». Драйвер может быть где угодно, на любом уровне системы: от модуля ядра до куска пользовательской программы и даже её конфигурационного файла. Типичные варианты:
- Драйвер — модуль ядра, подсказывающий шине, как правильно обращаться с устройством. Это, как правило, относится к PCI-устройствам и стандартным USB-устройствам. Подключается к ядру командой modprobe имя_модуля (или insmod ). Распознанные и классифицированные устройства (те, для которых есть драйвер-модуль ядра) отображаются в виде подкаталогов /sys/class/класс_устройства/ .
- Драйвер видеокарты — модуль графической подсистемы X11 (X.Org). Подгружается при старте графической оболочки, достаточно лишь указать его в настройках X.Org (с помощью конфигуратора или вручную, в файле /etc/X11/xorg.conf ). Часто требуется и специальный модуль ядра (возможно, несколько), организующий доступ к видеопамяти.
- Драйверы принтера и модема — описание характеристик для, соответственно, подсистемы печати и программы-«звонилки». Что с ними делать дальше, расскажет документация.
- Драйвер — прикладная программа или дополнение (plug-in) к ней (например, драйвер сканера — дополнение утилиты sane , а с некоторыми цифровыми проигрывателями звука «iRiver» можно взаимодействовать с помощью утилиты ifp из пакета ifp-line ). Здесь главное — название программы, а драйвер, скорее всего, уже включён в дистрибутив.
В последнем случае нет никакой зримой информации о том, что устройством действительно можно пользоваться — до тех пор, пока не запущена соответствующая прикладная программа с соответствующими настройками (особенно это касается «глупых» шин наподобие последовательного порта). И в любом случае самостоятельная установка «драйвера» должна сопровождаться вдумчивым чтением документации к нему.
Опять «устройство»?
В документации Linux термин «устройство» (device) часто используется не в значении «прибор», а в значении «элемент каталога /dev ». Что это такое?
Прибор подключается к машине, как правило, для того, чтобы передавать на него какие-то данные и/или получать их оттуда. Если задача компьютера — управлять внешним устройством, это всё равно можно рассматривать как передачу управляющих данных и приём диагностических. Во многих случаях передачу данных проще всего вести в синхронном (поточном) режиме, точно так же, как это делается при работе с файлом: открыть файл — записать данные — закрыть файл или открыть — прочитать — закрыть. Если бы можно было представить внутренность прибора в виде файла, работа с ним пошла бы легче: это означало бы, что система знает, как и куда передавать данные, а дело пользовательской программы — эти данные понимать 4 .
В большинстве случаев именно так и устроено в Linux. После того, как система распознала внешнее устройство, а служба hotplug , при необходимости, загрузила соответствующий модуль ядра, в каталоге /dev заводится новый «файл», содержимое которого отражает содержимое подключённого устройства, не занимая при этом места на жёстком диске. Такой файл называется файлом-дыркой, его можно представить как отверстие в файловой системе, через которое видно не содержимое жёсткого диска, а данные, попадающие туда с «другой стороны» — со стороны подключённого внешнего устройства. Например, гибкий диск в дисководе представляется в виде файла-дырки /dev/fd0 , (от floppy disk 0), а мышь — в виде /dev/mouse (строго говоря /dev/mouse — этот обычно символьная ссылка на актуальный файл-дырку — скажем /dev/psaux , порт PS/2).
В документации вместо «файл-дырка» чаще всего пишут просто «устройство» (device), а устройство-прибор — «внешним устройством». Если соответствующего устройства в каталоге /dev/ нет — значит, в цепочке его распознавания есть слабое звено.
Стоит напомнить, что файл-дырка, однако, не обязан существовать и непременно соответствовать одному внешнему устройству. Устройства, подключаемые ко второму последовательному порту, например, всегда видны как /dev/ttyS1 (а к первому — как ttyS0 ). Фактически, ttyS — это файл-дырка шины, настолько простой, что дальнейшее выяснение типа устройства перекладывается на программу пользователя.
Другой пример — это работа с аппаратурой по шине USB. USB-шин в системе зарегистрировано несколько, и к каждому можно подключить одно или несколько устройств. Для них независимо от типа устройства заводятся файлы-дырки вида usbdev.шина.номер , где каждому новому подключённому устройству просто выдаётся очередной номер . Некоторые звуковые проигрыватели и цифровые фотокамеры распознаются как flash-диски; тогда в дополнение к нетипизированному файлу-дырке создаётся одна или даже несколько дисковых (допустим, само дисковое устройство /dev/sda и единственный раздел с файловой системой на нём /dev/sda1 , который и монтируется в /media/usbdisk ). Другие фотокамеры умеют больше, чем обычный диск: например, транслировать изображение и/или звук, и для них существуют специальные утилиты, например, gphoto2 . В этом случае никакого дополнительного файла-дырки, за исключением /dev/usbdev.шина.номер , не создаётся, и о типе подключённого аппарата догадывается сама gphoto2 .
Кто виноват и что делать?
Итак, свежеподключённый к компьютеру прибор не распознался «сам собой», и программы, которые должны были с ним работать, не работают.
- Для начала стоит посмотреть на системную консоль (клавиши Ctrl + Alt + F12 ) и в файл /var/log/messages , возможно, системная диагностика подскажет, в чём дело
- Неполадки могут быть аппаратными (проверяется в /sys/bus или с помощью lspci , как сказано выше).
- Hotplug или другая программа автораспознавания может не знать про конкретный подключённый прибор (придётся в режиме суперпользователя вручную загрузить модуль с помощью modprobe , а чтобы не делать этого каждый раз — отредактировать /etc/modules.conf ).
- Возможно, внешнее устройство распозналось и модуль для него есть, но служба udevd , которая заводит файлы-дырки в /dev , выбрала другое название или вовсе не завела нужного устройства (надо проанализировать содержимое /dev и, возможно, настроить udev или саму прикладную программу).
- Ваше устройство может быть слишком новым, а дистрибутив Linux — оказаться слишком старым. В этом случае рекомендуется обновить части системы, содержащие «драйвер» (в зависимости от ситуации — модуль ядра, само ядро, графическую оболочку или её библиотеку, прикладную программу, и т. п.).
- Стоит проверить, что сказано о вашем устройстве в сетевых информационных ресурсах (здесь поможет lspci или подобные ей утилиты, а также http://www.google.com ). Вполне вероятно, там посоветуют загрузить некий заранее собранный модуль ядра (назовут его, конечно, «драйвером») либо подскажут, какую именно программу следует использовать.
- Наконец, ваше устройство может просто не поддерживаться. Печально, но факт: некоторые производители аппаратуры настолько дорожат своими мелкими секретами, что не только не документируют устройство своих устройств, но тщательно скрывают его. Как следствие, Linux-сообщество не в состоянии быстро обеспечить поддержку таинственного прибора. Производители предпочитают писать «драйверы» — хорошие ли, плохие — за свои деньги, а особо жадные ограничиваются только одной, самой распространённой на сегодня пользовательской программной платформой. И это пока, к сожалению, не Linux.
Сказанное выше означает, что после каждого обновления системы устройство, ранее распознававшееся с трудом или вовсе не распознававшееся, может преспокойно заработать, особенно если это устройство относительно новое. Кроме того, стоит со всем вниманием относиться к ситуации, когда производитель прибора не просто анонсирует совместимость с Linux, а предлагает «драйверы» собственного изготовления. И последнее: если вы не в силах справиться с «драйвером» в одиночку — обращайтесь к Linux-сообществу! Вы или получите решение задачи, или в очередной раз подтвердите, что её стоит решать — и тем самым приблизите решение.
1Однако можно, например, подключить наушники вместо микрофона, причём они, скорее всего, будут работать микрофоном. правда, очень тихо.
2Она подключена к шине AGP, которая архитектурно похожа на PCI, поэтому система различия не делает.
3Некоторая путаница может возникнуть из-за того, что строгого соответствия между разъёмами на корпусе и номерами шин нет: «кто первый встал, того и тапки».
Источник