- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
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.