- Как установить драйвера на Linux
- Как обстоит дело в Linux с ПО
- Инсталляция проприетарных и свободных драйверов
- Nvidia
- Intel
- Старые комплектующие
- Драйверы устройств в Linux
- Часть 2: Пишем в классе наш первый драйвер для Linux
- Динамическая загрузка драйверов
- Наш первый драйвер для Linux
- Сборка нашего первого драйвера
- Подведем итог
- Добавление драйвера устройства в Linux
- Способы установки драйверов
- Ручная установка драйвера
- Использование нового драйвера
Как установить драйвера на Linux
Для того чтобы установленная операционная система могла корректно работать и взаимодействовать с комплектующими компьютера или другими внешними устройствами, подключенными к нему, должны быть установлены драйвера. В Windows с ними бывает много проблем, в особенности у людей слабо владеющими ПК, на деле в этом нет ничего трудного: достаточно узнать точное название модели и найти нужные файлы на официальном сайте производителя в разделе «Помощь». Но что насчёт дистрибутивов на базе GNU/Linux?
Как обстоит дело в Linux с ПО
Debian, Ubuntu их форки и другие дистрибутивы в большинстве случаев работают с открытыми драйверами, которые встроены в ядро Linux. Таким образом пользователь сможет в полной мере пользоваться как Live USB & CD, так и только что установленной системой. Ничего, кроме обновлений, устанавливать не приходится.
Конкретных производителей у свободного ПО обычно нет, разрабатывается оно или сообществом или командой некоммерческих программистов. К сожалению, оно почти всегда уступает проприетарному программному обеспечению в производительности, поэтому при работе с некоторыми программами или во время игр могут наблюдаться ощутимые неудобства.
Инсталляция проприетарных и свободных драйверов
Установка драйверов на Linux способна снизить нагрузку на компьютер и сделать работу систему плавнее и более оптимизированной. В особенности это подойдёт для игр и редакторов трёхмерной графики. Далеко не всегда на отдельно взятую машину можно установить проприетарный драйвер. Иногда таковых нет или оборудование в силу своей неактуальности прекращает поддерживаться. Тут два выхода: продолжать пользоваться открытым ПО или думать о переходе на более старый LTS дистрибутив, для которого производители ещё выпустили программное обеспечение.
Нередко на старых машинах с ОС Debian бывает так, что даже открытые драйвера не устанавливаются. Это обычно связано с устареванием железа или с отсутствием нужных компонентов репозитории.
Добавление несвободных компонентов в систему:
$ deb http://httpredir.debian.org/debian/ «Кодовое имя дистрибутива» main contrib non-free
$ sudo apt update
$ sudo apt upgrade
Установка несвободной прошивки, OpenGL и пакета поддержки графики:
$ sudo apt install firmware-linux-nonfree libgl1-mesa-dri xserver-xorg-video-ati
После этого нужно перезагрузить систему.
Также есть и свободный графический драйвер для AMD Radeon «AMDGPU». Его можно скачать с сайта производителя, выбрав нужный пакет.
Или установить из терминала. Сначала необходимо проверить систему на наличие данного пакета:
$ dpkg -l amdgpu-pro
Команды для обновления или чистой инсталляции:
$ wget -c —referer=’http://support.amd.com/ru-ru/download/desktop?os=Linux+x86′ https://www2.ati.com/drivers/linux/ubuntu/amdgpu-pro-16.60-379184.tar.xz
$ tar -Jxvf amdgpu-pro-16.60-379184.tar.xz
$ sudo usermod -a -G video $LOGNAME
Далее необходима перезагрузка.
Используя старое оборудование, следует поставить драйвера Linux, которые последними были выпущены. Скорее всего, это будет Ubuntu 14.04 или ещё более старая версия.
Nvidia
Установить драйвера в Linux для Nvidia легче. На официальном сайте есть целый запрос для компьютеров с различными архитектурами и моделями видеокарт.
Также можно провести инсталляцию из официального репозитория. Проверка на наличие версий драйверов:
$ sudo apt update && clear && apt-cache search nvidia-8 | grep ‘binary driver’
$ sudo apt install nvidia-«Версия пакета» nvidia-«Настройки»
Создание конфига xorg.conf:
Перезагрузка компьютера, после которого всё должно работать правильно.
Intel
У Intel нет проприетарного ПО, все драйверы имеют открытый исходный код и находятся внутри ядра Linux. То есть для пользователей ноутбуков и настольных ПК с процессором Intel и встроенным графическим ядром вообще не придётся думать о дополнительных настройках ОС.Также написано и на официальной странице: «Большинство Linux-дистрибутивов включают в себя графические драйверы Intel. Обратитесь к поставщику операционной системы и используйте их дистрибутив для доступа и поддержки драйверов». Другими словами производительность операционной системы на базе процессора Intel не зависит от несвободного ПО.
Старые комплектующие
К сожалению, производители рано или поздно прекращают поддержку старого оборудования. В таком случае остаётся или использовать поддерживаемую версию Windows, или оставаться на более поздних дистрибутивах Ubuntu или Debian, для которых также были выпущены пакеты поддержки.
Источник
Драйверы устройств в Linux
Часть 2: Пишем в классе наш первый драйвер для Linux
Оригинал: «Device Drivers, Part 2: Writing Your First Linux Driver in the Classroom»
Автор: Anil Kumar Pugalia
Дата публикации: December 1, 2010
Перевод: Н.Ромоданов
Дата перевода: июнь 2012 г.
В этой статье, которая является частью серии статей о драйверах устройств в Linux, речь идет о концепции динамической загрузки драйверов — сначала мы перед тем, как собирать драйвер, напишем драйвер для Linux, а затем, после сборки, загрузим его.
Светлана и Пагс добрались в свой класс с опозданием и увидели, что их профессор уже начал читать лекцию. Светлана робко попросила разрешения войти. Раздраженный профессор Гопи ответил: «Входите! Вы, друзья, опять сегодня опоздали, и по какой причине»?
Пагс поспешно ответил, что они обсуждали именно ту тему, которую сегодня изучают в классе — драйверы устройств в Linux. Пагс был более, чем счастлив, когда профессор сказал: «Хорошо! Тогда что-нибудь скажите о динамической загрузке в Linux. Если вы справитесь, то я прощу вас обоих!». Пагс знал, что один из способов сделать профессора счастливым, это — покритиковать Windows.
Он объяснил: «Как известно, при обычной установке драйверов в Windows для того, чтобы их активировать, необходимо перезагрузить систему. А если это, предположим, действительно неприемлемо в случае, если это нужно делать на сервере? Вот где выигрывает Linux. В Linux можно загружать и выгружать драйверы на лету, и это активно используется сразу после загрузки системы. Кроме того, драйвер мгновенно отключается после его выгрузки. Это называется динамической загрузкой и выгрузкой драйверов в Linux «.
Это впечатлило профессора. «Хорошо! Идите на свои места, но больше не опаздывайте». Профессор продолжил лекцию: «Теперь, когда вы уже знаете, что такое динамическая загрузка и выгрузка драйверов, я, прежде, чем мы перейдем к написанию нашего первого драйверов, покажу вам, как загружать и выгружать драйвера».
Динамическая загрузка драйверов
Эти динамически загружаемые драйвера чаще всего называют модулями, которые собираются в виде отдельных модулей с расширением .ko (объект ядра). В каждой системе Linux в корне файловой системы (/) есть стандартное место для всех предварительно собранных модулей. Они организованы аналогично древовидной структуре исходных кодов ядра и находятся в директории /lib/modules/ /kernel , где результат вывода системной команды uname -r (см.рис.1).
Рис.1: Предварительно собранные модули Linux
Чтобы динамически загружать и выгружать драйверы, воспользуйтесь следующими командами, которые находятся в директории /sbin и должны выполняться с привилегиями пользователя root:
- lsmod — список модулей, загруженных в текущий момент
- insmod — добавление / загрузка указанного файла модуля
- modprobe — добавление / загрузка модуля вместе со всеми его зависимостями
- rmmod — удаление / выгрузка модуля
Давайте в качестве примера рассмотрим соответствующие драйвера файловой системы FAT. На рис.2 показан весь процесс нашего эксперимента. Файлы с модулями будут fat.ko , vfat.ko и т.д., находящиеся в директории fat (в vfat для старых версий ядра) в /lib/modules/`uname -r`/kernel/fs . Если они представлены в сжатом формате .gz , вам нужно будет распаковать их с помощью команды gunzip , прежде чем вы сможете выполнить операцию insmod .
Рис.2: Операции с модулями Linux
Модуль vfat зависит от модуля fat , так что первым должен быть загружен модуль fat.ko . Чтобы автоматически выполнить распаковку и загрузку зависимостей, воспользуйтесь командой modprobe . Обратите внимание, что когда вы пользуетесь командой modprobe , вы не должны в имени модуля указывать расширение .ko . Команда rmmod используется для выгрузки модулей.
Наш первый драйвер для Linux
Перед тем, как написать наш первый драйвер, давайте рассмотрим некоторые понятия. Драйвер никогда не работает сам по себе. Он похож на библиотеку, загружаемую из-за функций, которые будут вызваны из работающего приложения. Он написан на языке C, но в нем отсутствует функция main() . Кроме того, он будет загружаться / компоноваться с ядром, поэтому он должен компилироваться аналогично тому, как было откомпилировано ядро, и вы можете в качестве заголовочных файлов использовать только те, что есть в исходном коде ядра, а не из стандартного директория /usr/include .
Интересный факт, касающийся ядра, это то, что оно, как мы видим даже на примере нашего первого драйвера, представляет собой объектно-ориентированную реализацию на языке C. В любом драйвере есть конструктор и деструктор. Когда модуль успешно загружается в ядро, то вызывается конструктор модуля, а дескруктор модуля вызывается, когда команде rmmod удается успешно выгрузить модуль. Это в драйвере две обычные функции, разве что они называются init и exit, соответственно, и вызываются с помощью макросов module_init() и module_exit() , которые определены в заголовков ядра module.h .
С учетом вышесказанного это полный код нашего первого драйвера; назовем его ofd.c. Обратите внимание, что отсутствует заголовок stdio.h (заголовок пользовательского пространства), вместо него мы используем аналог kernel.h (заголовок пространства ядра). Функция printk() эквивалентна функции printf() . Кроме того, для обеспечения совместимости версии модуля с ядром, в которое будет загружен модуль, добавлен заголовок version.h . С помощью макроса MODULE_* заполняется информация, относящаяся к модулю, которая будет использована как «подпись» модуля.
Сборка нашего первого драйвера
Т.к. у нас есть код на языке C, настало время его скомпилировать и создать файл модуля ofd.ko . Для этого мы используем систему сборки ядра. В приведенном ниже файле Makefile происходит обращение к системе сборки ядра из исходных кодов, а файл Makefile ядра, в свою очередь, обращается к файлу Makefile нашего нового драйвера с тем, чтобы собрать драйвер.
Чтобы собрать драйвер для Linux, у вас в системе должен быть исходный код ядра (или, по крайней мере, заголовки ядра). Предполагается, что исходный код ядра будет находиться в директории /usr/src/linux . Если в вашей системе он находится в каком-нибудь другом месте, то укажите это место в переменной KERNEL_SOURCE в файле Makefile .
Когда есть код на языке C ( ofd.c ) и готов файл Makefile , то все, что нам нужно сделать для сборки нашего первого драйвера ( ofd.ko ), это вызвать команду make .
Подведем итог
Как только у нас будет файл ofd.ko , мы в роли пользователя root или с помощью команды sudo выполним обычные действия.
Команда lsmod должна вам сообщить о том, что драйвер ofd загружен.
Пока студенты экспериментировали со своим первым модулем, прозвенел звонок, сообщивший об окончании урока. Профессор Гопи подвел итог: «В настоящий момент мы не увидели ничего, кроме того, что модуль lsmod сообщил о загрузке драйвера. Куда выводит информацию команда printk ? Найдите это самостоятельно на лабораторных занятиях и познакомьте меня с своими выводами. Также учтите, что наш первый драйвер будет шаблоном для любого драйвера, который можно написать для Linux. Написание специализированных драйверов это всего лишь вопрос о том, чем будет заполнен конструктор и деструктор драйвера. Поэтому дальнейшее изучение будет представлять собой расширение данного драйвера с целью получить драйвер с конкретными функциональными возможностями».
Источник
Добавление драйвера устройства в Linux
Обычно в системах Unix и Linux установка драйверов для новых устройств не вызывает трудностей. Даже для неопытных пользователей этих систем. Но это в том случае, если производители устройства (и/или разработчики драйверов) позаботились об этом. И оснастили пакет драйвера специальными установочными и конфигурационными скриптами. А также протестировали всё это в нескольких системах. Однако бывают случаи, когда «удобной» возможности установить драйвер устройства нет, но есть исходные коды драйвера. В таком случае можно попытаться собрать драйвер самостоятельно. Конечно, это далеко не так просто, нужно поэкспериментировать. Но успешный результат возможен с высокой вероятностью. И главное, что для этого требуется — это знать и понимать общий порядок действий в случае ручной сборки драйвера. С такими задачами часто сталкиваются администраторы систем, обслуживающих технологические процессы на производствах, хостинг-площадки и т. д.
Способы установки драйверов
Для Linux-систем установка драйверов устройств происходит тремя основными способами:
- установка патча для определённых версий ядра;
- использование специальных сценариев для установки и конфигурации драйвера;
- с помощью загружаемого модуля ядра.
Надо признать, что для Linux ручная установка драйверов представляет собой довольно сложную и трудоёмкую работу. Поэтому разработчики стремятся всё чаще обеспечивать автоматическую установку и настройку для своих драйверов/устройств. Ведь они заинтересованы в максимально эффективном распространении своих разработок. По этой причине самым распространённым способом установки драйверов является использование сценариев установки. Для самых популярных типов устройств, например для видеокарт, аудиоустройств и даже для сетевого оборудования в настоящее время трудно найти драйверы без автоматической установки.Установка таких драйверов ничем не отличается от установки обычных пакетов. Вся инструкция описана в файле README, подробнее об установке из исходников читайте здесь.
Но есть оборудование (всевозможные адаптеры, преобразователи интерфейсов) и ситуации, для которых есть только исходные коды драйвера (часто не официальные) и необходимость интеграции его с ядром.
Если в качестве драйвера используются патчи ядра, то установить их (собственно и сам драйвер) можно выполнив следующие команды:
Расположение «каталог_исходных_кодов_ядра» зависит от системы, в CentOS это /usr/lib/modules/ /kernel, Например
В случае с ручной установкой, необходимо для начала интегрировать драйвер некоего устройства (исходные коды) в дерево каталогов исходных кодов ядра.
Ручная установка драйвера
Для примера, пусть требуется добавить в ядро драйвер некоего сетевого устройства 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.
Команда tristate указывает, что драйвер может быть собран как загружаемый модуль, если это поддерживается. Если нет, то вместо tristate следует указать bool – драйвер будет частью ядра. Фраза ‘Netdevice support’ будет отображаться в выводе конфигурационного скрипта на этапе конфигурирования сборки ядра. Это может быть любой текст, идентифицирующий устройство, для которого добавляется драйвер.
Использование нового драйвера
В современных версиях ядра Linux задействование новых драйверов существенно упрощено. В отличие версий, выпущенных раньше 2.6. Тогда это было настоящей головоломкой и требовало знаний в программировании. Но архитектурные изменения в модели драйверов и устройств, пришедшие в версии 2.6 позволяют теперь связывать драйверы с ядром на более высоком «общепользовательском» уровне. Для этого используется специальный конфигурационный макрос MODULE_DEVICE_TABLE. Он создаёт соответствия, которые позволяют утилите modprobe (и ей подобным) задействовать новые драйверы ядра.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник