Вы находитесь тут

Файлы устройств, модули ядра, конфигурирование программы modprobe и hdparm

Тэги: 
Категории: 

 

Введение

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

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

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

При этом создаются специальные файлы устройств, хранящиеся в каталоге /dev, а ядро при этом преобразует операции над этими файлами в вызовы функций ядра. Файлы устройств позволяют программам получать доступ к оборудованию компьютера. Для работы с файлами устройств могут использоваться стандартные функции работы с системой – open, read, write, close.

Существует большая разница между файлами устройств и модулями ядра. Первые представляют собой интерфейс доступа к драйверу устройства, а вторые – драйверы устройств.

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

Существует категория так называемых фантомных устройств (псевдоустройства) – в этом случае используется драйвер, даже если связанного с ним устройства не существует. Примером могут служить псевдотерминалы (PTY), передаваемые пользователям в системе при их регистрации по сети. Официальный список номеров устройств Linux может быть получен на сайте http://www.lanana.org

Файлы устройств и модули ядра.

Команда modprobe

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

Файлы жестких дисков IDE имеют обозначение /dev/hdxn, где х – идентификатор устройства, n – номер раздела диска. Файлы жестких дисков с интерфейсом SCSI называются так же, только имеют префикс sd. SCSI-дисководы имеют файлы с именами /dev/scdn, где n – идентификатор дисковода, а IDE CD-ROM обозначаются так же, как и жесткие диски – /dev/hdn.

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

Например: brw-rw---- 1 root disk 3, 0 oct 22 2009 /dev/hda brw-rw---- 1 root disk 3, 1 oct 22 2009 /dev/hda1 brw-rw---- 1 root disk 3, 10 oct 22 2009 /dev/hda10

Дело в том, что любой файл устройства определяется тремя аргументами:

  • * тип устройства – блочное или символьное;
  • * старший (major) номер определяет тип драйвера;
  • * младший (minor) номер определяет конкретный тип физического устройства.

В примере показаны три файла – hda, hda1, hda10. Они представляют собой блочные устройства, о чем свидетельствует буква «b» в начале строки. Старший номер всех устройств одинаков – цифра 3, а младший номер у каждого индивидуальный.

Для создания файлов устройств используется программа mknod. В общем виде синтаксис ее использования имеет вид: mknod file_name <b | c> major minor

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

После получения ядром этих данных оно просматривает список имеющихся драйверов устройств, загруженных в данный момент времени. При обнаружении подходящего драйвера ядро начинает с ним взаимодействовать. Если драйвер нужного устройства не обнаруживается, то вызывается программа на исполнение, прописанная в файле /proc/sys/kernel/modprobe.

Изначально в файле прописан путь к утилите modprobe (/sbin/modprobe). При ее вызове передаются те параметры, которые получило ядро, а не имя модуля, которое необходимо загрузить. Имея эти данные, программа modprobe подгружает необходимый модуль, и в числе активных драйверов появляется необходимый, который и взаимодействует в дальнейшем с программой. В общем случае данные, передаваемые ядром программе modprobe, имеют следующий вид: «тип_устройства_старший номер_младший номер», например: char-major-11-147

Для некоторых типов устройств не существует специальных типов файлов. К ним относятся звуковые и сетевые платы. Коммерческий UNIX не имеет такой широкой поддержки оборудования в отличие от линукс, поэтому в линукс нет заранее определенных файлов для указанных типов устройств.

Рассмотрим пример конфигурирования сетевой карты в линукс.

Если для ее настройки вызывается программа ifconfig, то ей в качестве параметра передается имя устройства – eth0. Но в каталоге /dev файла с именем eth0 нет. Поэтому программа ifconfig при обращении к ядру пересылает имя устройства – eth0, и точно такое имя передается уже от ядра на вход программе modprobe.

Для обоих случаев, будь то передача имени устройства или его параметров, программе modprobe нужно сообщить соответствие типа устройства и модуля ядра, поддерживающего с ним работу. У программы modprobe есть некоторая конфигурация по умолчанию. Ее можно вызвать на просмотр, исполнив в консоли modprobe -c.

Например, в RedHat-подобных дистрибутивах, найдя строку в выводе, описывающую соответствие с устройством eth0, можно увидеть, что для него не определен требуемый модуль: alias eth0 off. Последующее определение или модификация поведения программы modprobe должно проходить через правку ее конфигурационного файла (для ядер 2.6 – /etc/modprobe.conf или /etc/modprobe.d/, а для ядер 2.4 – /etc/modules.conf ). Более точную информацию о расположении конфигурационных файлов и их типа в конкретном дистрибутиве может дать изучение вывода команды man 5 modprobe.

Если предположить, что в компьютере установлены три сетевые карточки – две NE2000 на шине ISA и NE2000 на шине PCI, то им будут соответствовать модули ne и ne2k-pci. Для определения этих устройств в файл /etc/modules.conf нужно будет дописать следующее: alias eth0 ne alias eth1 3c59x alias etg2 ne2k-pci Таким образом, с помощью команды alias и ее параметров можно однозначно определить соответствие между устройством и модулем, требуемым для загрузки. А для сетевых карточек NE2000 на шине ISA, с учетом их особенностей на указание портов ввода/вывода, нужно будет указать еще и порты. Тогда, при вызове команды modprobe, все эти параметры нужно будет указать в командной строке следующим образом: modprobe ne io = 0x280, 0x320 а в случае использования файла /etc/modules.conf, дописать строку: options ne io = 0x280,0x320 Таким образом, при помощи параметра options определяются переменные, передаваемые модулю при его загрузке.

Существует и ряд других параметров, которые можно использовать в файле /etc/modules.conf. Некоторые из них имеют следующий вид: * pre-install – имя_модуля имя_команды – вызывает на исполнение команду до загрузки указанного модуля; * post-install – имя_модуля имя_команды – вызывает на исполнение команду после загрузки указанного модуля; * pre-remove – имя_модуля имя_команды – вызывает команду на исполнение перед удалением указанного модуля; * post-remove – имя_модуля имя_команды – вызывает команду на исполнение после удаления указанного модуля.

 

 Конфигурирование команды hdparm

Команда hdparm используется в линукс-системах для детальной настройки интерфейсов IDE-контроллеров.

Эта программа позволяет:

  1.  выяснить текущие параметры контроллера и подключенного к нему устройства;
  2.  внести изменения в текущие параметры IDE-контроллера;
  3.  изменить и проконтролировать быстродействие подключенного к IDE-контроллеру устройства. Наиболее важные параметры hdparm имеют следующий вид: 1. –d N – при N=0 поддержка DMA выключена, при 1 – поддержка DMA включена. 2. -c N – при N=0 включается 16-битный режим ввода/вывода. При N=1 включается 32-битный режим ввода/вывода. При N=3 включается 32-битный режим ввода/вывода с поддержкой специальной sync-последовательности. 3. –m N – при N=0 выключается возможность чтения нескольких секторов за один проход шпинделя HDD. При N !=0 такая возможность включается.
  4. –E N – аргумент определяет скорость cd-привода.
  5.  -f – параметр сбрасывает данные буферы на HDD и очищает буфер.
  6.  -g – параметр дает возможность просмотреть геометрию жесткого диска.
  7.  –i – показывает информацию об устройстве, полученную при загрузке системы.
  8.  –I – запрашивает информацию об устройстве и выводит более полную информацию, чем параметр i.
  9.  –T – проверяет быстродействие устройства. Показывает скорость чтения информации из буфера.
  10.  –t – предназначен для проверки быстродействия и показывает скорость чтения из устройства.
  11. –X – включает режим DMA. Режим DMA значительно увеличивает быстродействие системы при обработке файлов большого размера и должен быть, по возможности, всегда включен.

В начале конфигурирования необходимо получить информацию о контроллере. Сделать это можно с помощью следующей команды: hdparm /dev/hda Для получения более полной информации об устройстве используют опцию I: hdparm –I /dev/had Проверка быстродействия осуществляется при использовании опций –t и –T: hdparm –tT /dev/had Поскольку проверяемое устройство взаимодействует со многими процессами, при проведении проверок и получении статистических данных команду рекомендуется вводить многократно, а результат усреднять. После получения информации о поддерживаемых режимах работы нужно установить возможные максимальные значения для обеспечения наибольшего быстродействия устройства. Приоритетными являются режимы DMA, ввод/вывод и максимально поддерживаемое чтение секторов HDD (MaxMultSect). Если предположить, что IDE-интерфейс поддерживает 32-битный режим с поддержкой sync-последовательности, UDMA5 и максимальное число одновременно читаемых секторов порядка 16, то включению этих свойств послужит команда: hdparm –d1 –s3 –m16 –X udma5 /dev/hda или: hdparm –d1 –s3 –m16 –X69 /dev/hda Указанные строки отличаются друг от друга способом задания параметра –X. Этот параметр определяет режим DMA, и указать его можно двумя способами: -X udma5 и –X69, причем пробел в первом случае обязателен. Во втором случае число пишется слитно с параметром. Число получается путем прибавления к 64 номера режима UDMA. В начало Передача параметров hdparm при старте системы Запуск программы hdparm с требуемыми параметрами для оптимизации быстродействия IDE-контроллера может быть определен при старте системы.

Этого можно добиться двумя способами:

1. описать вызов программы, используя файл /etc/rc.d/rc.local

2. воспользоваться стандартной системой инициализации SystemV. Для вызова программы hdparm средствами системы инициализации SystemV необходимо использовать файл /etc/rc.d/rc.sysinit, в котором можно задать такой вызов для любого уровня исполнения при старте системы. Для передачи параметров программе hdparm в скрипт /etc/rc.d/rc.sysinit можно воспользоваться файлами: * /etc/sysconfig/harddisks – для передачи параметров, общих для всех котроллеров; * /etc/sysconfig/harddiskhd(a-h) – для передачи параметров определенному устройству.

Список возможных параметров для передачи в указанных файлах имеет вид:

1. USE_DMA – значение будет подставлено в опции –d.

Варианты:

  1.   включает поддержку DMA и 0 – выключает поддержку DMA.
  2. MULTIPLE_IO – значение будет подставлено в опцию m. Причем 0 – выключает поддержку чтения нескольких секторов за один проход шпинделя HDD, число N определяет количество секторов, которые могут быть прочитаны за один проход шпинделя.
  3.  EIDE_32BIT – значение будет подставлено в параметр –c. Причем 0 – включает 16-битный режим ввода/вывода, 1 – 32-битный режим, 3 – 32-битный режим с поддержкой специальной sync-последовательности.
  4.  LOOKAHEAD – значение будет подставлено в параметр –A, причем если оно равно 0, то упреждающее чтение информации будет выключено, если 1 – упреждающее чтение будет включено.
  5. EXTRA_PARAMS – данная переменная предназначена для задания дополнительных параметров программе hdparm, причем для тех из них, которым не были ранее назначены специальные переменные. Тогда для IDE-интерфейса, поддерживающего 32-битный режим с включением sync-последовательности, UDMA5 и максимальное число одновременно читаемых секторов, равное 16, задать эти свойства можно включением в файл /etc/sysconfig/harddiskhda следующих переменных: USE_DMA = 1 MULTIPLE_IO = 16 EIDE_32BIT = 3 EXTRA_PARAMS = “-X udma5”

  Выводы

В статье рассмотрены вопросы, связанные с функционированием ядра и его модулей. Описан процесс получения ядром информации об имеющемся оборудовании, участие в работе с оборудованием модулей ядра, взаимосвязь между драйверами и файлами устройств. Кроме того, изложен порядок работы с программой modprobe, возможности ее конфигурирования и настройки параметров. На реальных примерах показана работа программы с модулями ядра. Также приведено описание программы hdparm, ее конфигурации и основных параметров. На конкретных примерах показана работа программы в динамике оптимизации интерфейса IDE. Рассмотрены конфигурационные файлы программы и способы передачи им параметров в процессе управления работой hdparm.

Об авторе

В сфере IT работает с 1990 года. Занимал должности от инженера 1 категории до начальника отдела IT. В настоящий момент работает ведущим консультантом-экспертом отдела инженерного и технического сопровождения Администрации Краснодарского края.