Журнал LinuxFormat - перейти на главную

LXF115:DrBrown2

Материал из Linuxformat
Перейти к: навигация, поиск

Файловая система-призрак

Sysfs Загадочные файлы в каталоге /sys и их роль в поддержке udev.


Файловая система sysfs (как и procfs) – одна из тех штук, которые я обычно называю плодом воображения ядра. Точкой монтирования для нее всегда служит каталог /sys, а ее основная задача – это предоставление доступа к структурам данных ядра, в частности, топологии оборудования (шинам и устройствам) компьютера. Sysfs лежит под уровнем виртуальной файловой системы VFS (Virtual File System), чья задача состоит в отображении файлов независимо от их физической реализации.

Иерархия файловой системы sysfs очень близка к внутренней иерархии объектов ядра (kobjects), которые населяют ее. Подкаталоги верхнего уровня в /sys, такие как block, bus, devices, fs, modules и power, представляют собой основные подсистемы, зарегистрированные в sysfs.

Забравшись вовнутрь этого запутанного лабиринта директорий, вы рано или поздно достигнете файлов, представляющих атрибуты объектов ядра. Многие из них содержат простые численные значения, например, в своей системе я могу просмотреть размеры разделов диска таким образом:

 $ cd /sys/block/sda
 $ for f in sda*/size; do echo -n $f : ; cat $f ; done
 sda1/size :240912
 sda2/size :20971520
 sda3/size :317241328
 sda4/size :2
 sda5/size :15647247
 sda6/size :271032552

Обратите внимание, что эти эксперименты проводились на Ubuntu 8.04 с ядром версии 2.6.24. В других дистрибутивах, особенно с другой версией ядра, вывод команды будет немного отличаться от приведенного выше.

Вот другой пример: покопавшись в каталоге modules, вы найдете подкаталог parameters для каждого загруженного модуля. Каждый файл в этом каталоге определяет параметр, переданный модулю во время его загрузки. Например, параметры моего драйвера беспроводной сетевой карты таковы:

 $ cd /sys/module/iwl4965/parameters
 $ ls
 antenna debug disable disable_hw_scan hwcrypto qos_enable queues_num

Чтобы узнать значение одного из этих параметров, просмотрите содержимое его файла:

 $ cat queues_num
 16

Узнать, что означают параметры, поможет команда modinfo:

 $ modinfo iwl4965 | grep parm:
 parm: antenna:select antenna (1=Main, 2=Aux, default 0  [both]) (int)
 parm: disable:manually disable the radio (default 0 [radio on]) (int)
 parm: hwcrypto:using hardware crypto engine (default 0 [software])
 parm: debug:debug output mask (int)
 parm: disable_hw_scan:disable hardware scanning (default 0) (int)
 parm: queues_num:number of hw queues. (int)
 parm: qos_enable:enable all QoS functionality (int)

Хорошо, и что с этим делать?

Одно из главных назначений /sys – предоставить информацию об оборудовании подсистеме udev, ответственной за добавление файлов устройств в каталог /dev, когда ядро находит новое оборудование. Например, если вставить USB-флэшку, ее параметры появятся в файле в каталоге /sys/bus/usb/devices. Они сравниваются с правилами, которые udev считывает из каталога /etc/udev/rules.d.

Командой udevinfo удобно «шерстить» содержимое каталога /sys в поисках параметров, пригодных для формирования правил udev. Вот фрагмент данных, относящихся к USB-флэшке:

$ udevinfo --attribute-walk--path /sys/bus/usb/devices/7-1/

Udevinfo начинает с устройства, определенного в --path, и затем прогуливается по цепочке родительских устройств. Для каждого найденного устройства выводится список всех возможных атрибутов в формате правил udev. Правило можно составить из атрибутов устройства и атрибутов одного родительского устройства.

looking at device ‘/devices/pci0000:00/0000:00:1d.7/usb7/7-1’:
ATTR{manufacturer}==”SanDisk Corporation”
ATTR{product}==”Cruzer Mini”
ATTR{serial}==”SNDKB770F40861406506”
looking at parent device ‘/devices/pci0000:00/0000:00:1d.7/usb7’:
KERNELS==”usb7”
SUBSYSTEMS==”usb”

На основе этой информации можно легко построить правило udev, определяющее, что должно произойти, когда ядро находит это устройство. Чисто ради эксперимента я добавил такую строку в файл /etc/udev/rules.d/60-symlinks.rules:

SUBSYSTEMS==”usb”, ATTRS{product}==”Cruzer Mini”,
SYMLINK+=”cruzer”

Теперь при подключении устройства udev автоматически смонтирует его (об этом позаботятся другие правила udev) и создаст символьную ссылку /dev/cruzer.

Персональные инструменты
купить
подписаться
Яндекс.Метрика