Добавление драйвера устройства в Linux
Обычно в системах Unix и Linux установка драйверов для новых устройств не вызывает трудностей. Даже для неопытных пользователей этих систем. Но это в том случае, если производители устройства (и/или разработчики драйверов) позаботились об этом. И оснастили пакет драйвера специальными установочными и конфигурационными скриптами. А также протестировали всё это в нескольких системах. Однако бывают случаи, когда «удобной» возможности установить драйвер устройства нет, но есть исходные коды драйвера. В таком случае можно попытаться собрать драйвер самостоятельно. Конечно, это далеко не так просто, нужно поэкспериментировать. Но успешный результат возможен с высокой вероятностью. И главное, что для этого требуется — это знать и понимать общий порядок действий в случае ручной сборки драйвера. С такими задачами часто сталкиваются администраторы систем, обслуживающих технологические процессы на производствах, хостинг-площадки и т. д.
Способы установки драйверов
Для Linux-систем установка драйверов устройств происходит тремя основными способами:
- установка патча для определённых версий ядра;
- использование специальных сценариев для установки и конфигурации драйвера;
- с помощью загружаемого модуля ядра.
Надо признать, что для Linux ручная установка драйверов представляет собой довольно сложную и трудоёмкую работу. Поэтому разработчики стремятся всё чаще обеспечивать автоматическую установку и настройку для своих драйверов/устройств. Ведь они заинтересованы в максимально эффективном распространении своих разработок. По этой причине самым распространённым способом установки драйверов является использование сценариев установки. Для самых популярных типов устройств, например для видеокарт, аудиоустройств и даже для сетевого оборудования в настоящее время трудно найти драйверы без автоматической установки.Установка таких драйверов ничем не отличается от установки обычных пакетов. Вся инструкция описана в файле README, подробнее об установке из исходников читайте здесь.
Но есть оборудование (всевозможные адаптеры, преобразователи интерфейсов) и ситуации, для которых есть только исходные коды драйвера (часто не официальные) и необходимость интеграции его с ядром.
Если в качестве драйвера используются патчи ядра, то установить их (собственно и сам драйвер) можно выполнив следующие команды:
$ cd каталог_исходных_кодов_ядра $ patch -p1 < файл_патча
Расположение «каталог_исходных_кодов_ядра» зависит от системы, в CentOS это /usr/lib/modules//kernel, Например
/usr/lib/modules/3.10.0-862.el7.x86_64/kernel
В случае с ручной установкой, необходимо для начала интегрировать драйвер некоего устройства (исходные коды) в дерево каталогов исходных кодов ядра.
Ручная установка драйвера
Для примера, пусть требуется добавить в ядро драйвер некоего сетевого устройства netdevice. Драйвер этого устройства нужно (как уже известно) поместить в один из каталогов с исходными кодами ядра. А именно — в каталог drivers, внутри которого может быть следующее содержимое:
$ ls -F каталог_исходных_кодов_ядра/drivers
Драйверы чаще всего помещаются в подкаталоги scsi, char, block, net, а также sound и usb. Эти подкаталоги отражают схему размещения драйверов в зависимости от их типа: блочные — для дисков IDE, символьные — для последовательных портов например, для сетевых устройств, звуковых плат и USB-устройств — USB-адаптеры, USB-модемы и т. д. Другие подкаталоги служат для размещения драйверов других категорий, в частности для системных и разного рода шин (pci, pcie, nubus, zorro), а также для платформенно-зависимых драйверов — acorn, macintosh.
Таким образом, драйверы для сетевого устройства netdevice следует поместить в следующий каталог:
каталог_исходных_кодов_ядра/drivers/net/netdevice
Исходные коды драйвера представляют собой набор файлов *.c, *.cpp и *.h, которые могут быть объединены в дерево каталогов, в зависимости от того, как составлен проект «исходников» драйвера.
Теперь необходимо включить исходные коды драйвера netdevice в процесс компиляции ядра. Для этого нужно отредактировать следующие файлы:
- /drivers/net/Makefile – для сборки самого драйвера;
- /drivers/net/Kconfig – для того, чтобы имя нового устройства было доступно для конфигурирования.
Файлы Makefile и Kconfig содержатся в каждом каталоге дерева каталогов с исходными кодами ядра Linux. Это необходимо для организации универсальной разработки и расширения функционала и возможностей ядра при его сборке из исходных кодов путём независимого дополнения новым кодом. В данном случае кодом драйвера для устройства netdevice.
В файл Makefile следует добавить следующий код:
obj-$(CONFIG_NETDEVICE_DEV) += netdevice/
Таким образом, при сборке ядра в его составе будет собран и сам драйвер netdevice. После дополнения файла Kconfig следующим кодом:
config NETDEVICE_DEV tristate 'Netdevice support'
устройство netdevice будет доступно для использования конфигурационным макросом (необходимо на этапе конфигурирования сборки ядра). Здесь команда config использует ключевое слово NETDEVICE_DEV, которое обязательно должно совпадать с фразой, следующей после CONFIG, которое ранее было указано в файле Makefile.
Команда tristate указывает, что драйвер может быть собран как загружаемый модуль, если это поддерживается. Если нет, то вместо tristate следует указать bool – драйвер будет частью ядра. Фраза ‘Netdevice support’ будет отображаться в выводе конфигурационного скрипта на этапе конфигурирования сборки ядра. Это может быть любой текст, идентифицирующий устройство, для которого добавляется драйвер.
Использование нового драйвера
В современных версиях ядра Linux задействование новых драйверов существенно упрощено. В отличие версий, выпущенных раньше 2.6. Тогда это было настоящей головоломкой и требовало знаний в программировании. Но архитектурные изменения в модели драйверов и устройств, пришедшие в версии 2.6 позволяют теперь связывать драйверы с ядром на более высоком «общепользовательском» уровне. Для этого используется специальный конфигурационный макрос MODULE_DEVICE_TABLE. Он создаёт соответствия, которые позволяют утилите modprobe (и ей подобным) задействовать новые драйверы ядра.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Похожие записи:
Обновление драйверов Ubuntu
Пользователи Windows привыкли, что для того, чтобы оборудование хорошо работало и выдавало максимальную производительность, необходимо выполнять обновление драйверов.
Такая же ситуация характерна для Ubuntu, и даже больше, здесь еще многое оборудование не поддерживается или поддерживается не полностью. С новыми версиями драйверов могут приходить исправления, улучшения производительности или даже поддержка нового оборудования. В этой статье мы рассмотрим как обновить драйвера в Ubuntu.
Обновление драйверов в Ubuntu
Мы уже подробно рассматривали что из себя представляют драйвера в операционной системе Linux и как с ними работать в статье установка драйверов в Linux. Из той же статьи мы узнали, что большинство драйверов Linux, а именно драйвера с открытым исходным кодом входят в ядро системы, но также есть прошивки для драйверов и проприетарные драйвера.
Таким образом, чтобы обновить драйвера в Ubuntu достаточно просто обновить ядро до самой новой версии, а если ещё проще то просто регулярно обновлять систему с помощью команд:
sudo apt update
sudo apt upgrade
Но тут есть еще несколько нюансов. В о-первых в официальных репозиториях не содержится самая новая версия ядра Linux, там находится та версия, которая была самой новой на момент релиза вашего дистрибутива. Во-вторых проприетарные драйвера тоже в официальных репозиториях чаще всего не обновляются и нужно искать другие пути для их установки. Все это мы рассмотрим дальше.
Обновление драйверов, встроенных в ядро
Как я уже сказал, для обновления драйверов с открытым исходным кодом необходимо обновить версию ядра. Но не смотря на то, что новая версия ядра не будет автоматически устанавливаться в вашей системе, deb пакеты новых версий исправно пакуются и выгружаются в общий доступ для всех желающих обновить свою систему.
Посмотреть какая версия ядра используется сейчас вы можете командой:
Вы можете скачать нужный образ ядра по ссылке. Там хранится больше количество ядер для разных дистрибутивов, чтобы найти самое новое пролистайте вниз. Не стоит брать ядра с приставкой rc - это нестабильные версии. Здесь нас будут интересовать два файла linux-headers и linux-image.
Обратите внимание, что ядро нужно качать только для своей архитектуры, например, для x86 - i386, а для x64 - amd64. Узнать свою архитектуру вы можете просто выполнив команду:
Вам необходимо скачать два эти файлы, а затем перейти в папку с загрузками и выполнить
sudo dpkg -i linux-image*
sudo dpkg -i linux-headers*
Теперь осталось обновить параметры загрузчика Grub, чтобы теперь система загружалась с новым ядром:
После применения этой команды необходимо будет перезагрузить компьютер.
Если вы хотите уже самую-самую свежую версию ядра Linux, для которой еще не собраны пакеты на выше указанном сайте, то в можете собрать ядро Linux из исходников. Ещё есть и другие методы обновления ядра, все они описаны в этой статье.
Обновления на прошивки для драйверов выходят очень редко, но если вы не хотите обновлять всю систему, то можно проверить есть ли обновления для прошивок:
sudo apt-cache policy linux-firmware
И затем установить если есть:
sudo apt install linux-firmware
С обновлением обычных драйверов с открытым исходным кодом разобрались, теперь поговорим о проприетарных драйверах с ними ситуация немного сложнее.
Обновление проприетарных драйверов
Если обновление драйверов Ubuntu с открытым исходным кодом происходит, можно сказать, за раз, в пару команд, то с проприетарными драйверами не все так просто. В Ubuntu есть специальная утилита, для обновления и установки драйверов от сторонних разработчиков. Для ее запуска откройте главное меню и введите в строке поиска Программы и обновления.
Откройте программу, а затем перейдите на последнюю вкладку - Дополнительные драйвера. Здесь вы можете выбрать необходимые драйвера и их версии для установки, будут доступны не только драйвера для видеокарт, но и другие проприетарные драйвера, например, для сетевых адаптеров, звуковых карт и т д:
После завершения настройки нажмите Применить, и система запустит установку драйверов. Но все дело в том, что программа берет драйвера из официальных репозиториев, а там они не всегда первой свежести. Если вы хотите именно самую новую версию драйверов, то придется качать установщики из официальных сайтов.
Но тут уже кроется еще одна проблема, если вы устанавливаете драйвера не из репозиториев системы, а с помощью стороннего установщика, то есть большой риск, что они слетят при следующем обновлении системы. Так что тут придется выбирать или новизна или стабильность, ну в общем, как обычно.
Установка драйверов NVIDIA подробно описана в отдельной статье, поэтому я не буду подробно на этом останавливаться. Скажу только, что скачать установщик можно с официального сайта, но будьте осторожны и качайте драйвера только для вашей видеокарты.
С драйвером для видеокарт AMD все стало намного проще с выходом свободного драйвера, теперь он поставляется вместе с ядром и может быть обновлен без проблем, так, как описано в первом способе. О нём на сайте тоже есть подробная статья.
Если вы использовали установку драйверов с помощью системного менеджера драйверов, то вы будете получать обновления при каждом обновлении системы. Но если вы использовали установщик, здесь уже придется устанавливать их каждый раз вручную.
Что касается других проприетарных драйверов, то вам придется обновлять их подобным способом.
Выводы
Теперь вы знаете как обновить драйвера Ubuntu. Для новичков это может показаться сложным, но если ваше оборудование работает отлично, то вам и необязательно ничего обновлять. Если у вас остались вопросы, пишите комментарии!
- Новые видеокарты, обычно отлично работают с открытым драйвером Nouvau, но проприетарный драйвер NVIDIA может добавить улучшенную поддержку 3D и лучшее управление аппаратными средствами.
- Установка драйверов с помощью утилиты Дополнительные драйверы деактивирует предыдущий драйвер, так что будьте аккуратны и устанавливайте только драйвера с пометкой рекомендовано.
- Если система не запускается после того как была выполнена установка или обновление драйверов Ubuntu вам придется удалить установленный драйвер или добавить модуль в черный список.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.