Внутреннее устройство Linux - Уорд Брайан. Страница 17

Числа перед датами в первых двух строках примера 3.1 являются старшим и младшим номерами устройств, помогая ядру при идентификации устройств. Сходные устройства, как правило, снабжены одинаковым старшим номером, например sda3 и sdb1 (оба являются разделами жесткого диска).

примечание

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

3.2. Путь устройств sysfs

Традиционный каталог /dev в системе Unix является удобным способом, с помощью которого пользовательские процессы могут обращаться к устройствам, поддерживаемым ядром, а также предоставлять интерфейс для них. Однако такая схема также и слишком упрощена. Название устройства в каталоге /dev даст вам некоторую информацию об устройстве, но далеко не всю. Кроме того, ядро назначает устройства в порядке их обнаружения, поэтому они могут получать различные имена после перезагрузки.

Чтобы обеспечить унифицированный обзор присоединенных устройств, взяв за основу их действительные аппаратные характеристики, ядро системы Linux предлагает интерфейс sysfs для обозначения файлов и каталогов. Основным путем для устройств является /sys/devices. Например, жесткий диск SATA в файле /dev/sda мог бы получить следующий путь в интерфейсе sysfs:

/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda

Как видите, такой путь достаточно длинный по сравнению с именем файла /dev/sda, который является также каталогом. Однако в действительности нельзя сравнивать эти пути, поскольку у них разное назначение. Файл /dev расположен здесь для того, чтобы пользовательский процесс мог применять устройство, в то время как путь /sys/devices использован для просмотра информации об устрой­стве и для управления им. Если вы составите список содержимого пути устройств, подобного приведенному выше, вы увидите что-либо подобное.

alignment_offset

discard_alignment

holders

removable

size

uevent

bdi

events

inflight

ro

slaves

capability

events_async

power

sda1

stat

dev

events_poll_msecs

queue

sda2

subsystem

device

ext_range

range

sda5

trace

Названия файлов и подкаталогов предназначены в первую очередь для чтения программами, а не людьми, однако вы сможете понять, что они содержат и представляют, посмотрев какой-либо пример, скажем файл /dev. После запуска в этом каталоге команды cat dev отобразятся числа 8:0, которые являются старшим и младшим номерами устройств в файле /dev/sda.

В каталоге /sys есть несколько ярлыков. Например, ярлык /sys/block должен содержать все доступные в системе блочные устройства. Однако это всего лишь символические ссылки. Запустите команду ls -l /sys/block, чтобы выяснить их настоящие sysfs-пути.

Могут возникнуть затруднения при отыскании sysfs-пути устройства в каталоге /dev. Используйте команду udevadm, чтобы показать путь и другие атрибуты:

$ udevadm info —query=all —name=/dev/sda

примечание

Команда udevadm расположена в каталоге /sbin; можно указать этот каталог в самом конце командного пути, если его там еще нет.

Подробности о команде udevadm и описание системы udev вы найдете в разделе 3.5.

3.3. Команда dd и устройства

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

Команда dd копирует данные в блоках фиксированного размера. Пример использования команды dd с некоторыми распространенными параметрами для символического устройства:

$ dd if=/dev/zero of=new_file bs=1024 count=1

Как видите, формат параметров команды dd отличается от формата большин­ства других команд системы Unix. Он основан на старом стиле JCL (Job Control Language, язык управления заданиями), применявшемся в компании IBM. Вместо использования дефиса (-) перед параметром вы указываете название параметра, а затем после символа равенства (=) задаете его значение. В приведенном выше примере происходит копирование одного блока размером 1024 байта из потока /dev/zero (непрерывный поток нулевых байтов) в файл new_file.

Приведем важные параметры команды dd.

• if=file. Входной файл. По умолчанию применяется стандартный ввод.

• of=file. Выходной файл. По умолчанию применяется стандартный вывод.

• bs=size. Размер блока. Команда dd будет считывать и записывать указанное количество байтов за один прием. Чтобы сокращенно указать большие объемы данных, можно использовать символы b и k, которые соответствуют значениям 512 и 1024 байт. Так, в приведенном выше примере можно записать bs=1k вместо bs=1024.

• ibs=size, obs=size. Размеры блоков на вводе и выводе. Если вы можете использовать одинаковые размеры блоков для ввода и вывода, примените параметр bs. Если нет, используйте параметры ibs и obs для ввода и вывода соответственно.

• count=num. Общее количество блоков, подлежащих копированию. При работе с большим файлом (или с устройством, которое поддерживает бесконечный поток данных, такой как /dev/zero) следует остановить команду dd в определенной точке, чтобы не израсходовать впустую большое количество дискового пространства, времени центрального процессора или того и другого сразу. Используйте команду count с параметром skip, чтобы скопировать небольшой фрагмент из большого файла или устройства.

• skip=num. Пропускает указанное количество блоков num во входном файле или потоке и не копирует их на вывод.

внимание

Команда dd является очень мощной, при ее запуске вы должны понимать, что делаете. Очень легко повредить файлы или данные устройств, совершив по небрежности ошибку. Часто может помочь запись вывода в новый файл, если вы не вполне уверены в результатах.

3.4. Сводка имен устройств

Иногда бывает сложно отыскать название устройства (например, при создании разделов диска). Вот несколько способов выяснить это.

• Выполните запрос udevd с помощью команды udevadm (см. раздел 3.5).

• Поищите устройство в каталоге /sys.

• Попробуйте угадать название на основе результатов вывода команды dmesg (которая выдает несколько последних сообщений ядра) или из файла системного журнала ядра (см. раздел 7.2). Эти результаты могут содержать описание устройств в вашей системе.

• Для дискового устройства, которое уже видно в системе, можно посмотреть результаты работы команды mount.

• Запустите команду cat /proc/devices, чтобы увидеть блочные и символьные устройства, для которых ваша система уже имеет драйверы. Каждая строка состоит из номера и имени. Номер является старшим номером устройства, как рассказано в разделе 3.1. Если вы сможете определить устройство по его имени, поищите в каталоге /dev символьное или блочное устройство с соответству­ющим старшим номером. Таким образом вы найдете файлы устройства.

Среди перечисленных методов только первый является надежным, но для него необходим менеджер устройств udev. Если вы окажетесь в ситуации, когда этот менеджер недоступен, попробуйте остальные методы, памятуя о том, что в ядре может не оказаться файла устройства для вашего аппаратного средства.

В следующих разделах перечислены наиболее распространенные устройства Linux и соглашения об их именовании.