системное
8 коммент.
Зачем нужна /sys, когда есть /proc?
Основной лейтмотив создания /sys было навести некоторый порядок в том бардаке, который являет из себя /proc и выделить информацию о структурах ядра в отдельную директорию.
Sysfs это файловая система, находящаяся в памяти (in-memory), основана первоначально на Ramfs, которая в свою очередь была написана во время перехода на ядро 2.4.0. Как говорит один из авторов [1], ``это было упражнение в элегантности, имевшее целью показать, насколько легко написать простую файловую систему, если использовать новый на тот момент слой VFS''. Из-за простоты и использования VFS, это дало здоровую основу для создания других in-memory файловых систем.
При этом sysfs может быть смонтирована, как и любая другая файловая система из пространства пользователя. Большинство дистрибутивов делают это автоматически при старте системы, добавляя соотвутствующую строчку в /etc/fstab.
Что внутри /sys?
Sysfs является каналом распространения информации между ядром и пространством пользователя. Например, есть возможность смены планировщика ввода/вывода или изменения параметров Udev программы. В каталоге /sys находится несколько подкаталогов, представляющих ряд основных подсистем, которые зарегистрированы в Sysfs:
/sys/
|-- block
|-- bus
|-- class
|-- devices
|-- firmware
|-- module
‘-- power
Внутри /sys/block
Каталог /sys/block содержит подкаталоги для каждого блочного устройства, которое было обнаружено в системе. Там хранятся параметры, которые описывают такие свойства блочных устройств, как размер устройства, его партиции, планировщик ввода-вывода и другие.
Зайдя туда, мы обнаруживаем кучу блочных устройств, среди которых можно найти рабочий винчестер, подключённые флешки и внешние жёсткие диски. Вот что автор этих строк нашёл про свой жёсткий диск, на котором установлен евонный Дебиан:
notebeast:/sys/block/hda# ls -lОтсюда мы узнаём, например, что диск /dev/hda разбит на две партиции, hda1 и hda2, размеры которых хранятся в size, что можно достучаться до планировщика I/O в queue и собрать немножко статистики по работе жёсткого диска в stat. Заглянем туда в поисках приключений и чего-нибудь неизведанного.
итого 0
-r--r--r-- 1 root root 4096 2012-03-03 22:05 capability
-r--r--r-- 1 root root 4096 2012-03-03 22:05 dev
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 device -> ../../devices/pci0000:00/0000:00:1f.1/ide0/0.0
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda1
drwxr-xr-x 3 root root 0 2012-03-03 22:05 hda2
drwxr-xr-x 2 root root 0 2012-03-03 18:40 holders
drwxr-xr-x 3 root root 0 2012-03-03 22:05 queue
-r--r--r-- 1 root root 4096 2012-03-03 22:05 range
-r--r--r-- 1 root root 4096 2012-03-03 22:05 removable
-r--r--r-- 1 root root 4096 2012-03-03 22:05 size
drwxr-xr-x 2 root root 0 2012-03-03 18:40 slaves
-r--r--r-- 1 root root 4096 2012-03-03 22:05 stat
lrwxrwxrwx 1 root root 0 2012-03-03 22:05 subsystem -> ../../block
--w------- 1 root root 4096 2012-03-03 22:05 uevent
Статистика ввода-вывода
Интерфейс /sys/block/sdX/stat даёт некоторые статистические данные о производительности ввода-вывода ядра. Эти данные пользователь или администратор может использовать для оптимизации производительности, если знает, что они значат.
Например, если дать команду:
# cat /sys/block/sda/statМы увидим что-то типа:
186908 41568 6033917 2408504 91198 509600 4882200 9406764 0 1161304 11848624
Эти сакрально-литургические знаки означают следующее:
Поле 1 -- полное число запросов на чтение, выполненных успешно.
Поле 2 -- число объединённых запросов на чтение. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.
Поле 3 -- число считанных секторов, чтение которых прошло успешно.
Поле 4 -- миллисекунд, потраченных на чтение.
Поле 5 -- число запросов на запись, выполенных успешно.
Поле 6 -- число объединённых запросов на запись. Запросы на чтение и запись, примыкающие друг к другу, могут быть объединены для повышения эффективности. Таким образом, два 4K считывания может стать одним 8K считыванием перед тем, как в конечном итоге быть переданы диску. Поэтому запрос будет считаться одним, и это поле позволяет вам узнать, как часто это было сделано.
Поле 7 -- число секторов, записанных успешно.
Поле 8 -- миллисекунды, потраченные на запись.
Поле 9 -- число запросов ввода-вывода, активных в данный момент. Единственное поле, которое должно стремиться к нулю.
Поле 10 -- миллисекунд, потраченных на выполнение запросов ввода-вывода.
Поле 11 -- взвешенное количество миллисекунд, потраченных на ввод-вывод. Может использоваться как простая мера производительности ввода-вывода.
Смена планировщика ввода-вывода на лету
Как нам намекает документация, планировщик ввода-вывода может быть изменён в любое время на лету, хотя может быть небольшая задержка из-за того, что все запросы предыдущего планировщика должны быть обработаны прежде, чем запустится новый. Чтобы узнать, какой планировщик стоит сейчас, даём команду:
cat /sys/block/sdX/queue/scheduler
noop anticipatory deadline [cfq]То есть сейчас стоит cfq - Completely Fair Queuing, полностью честный планировщик. Планировщики для разных дисков могут быть:
noop
часто наилучший выбор для файловых систем в памяти (например ramdisk) и других устройств без механических частей (флешек), где попытки оптимизировать ввод-вывод приводят лишь к напрасной трате ресурсов.as
(anticipatory
) по воплощённым в нём идеях схож сdeadline
, но более навороченный и пытается оптимизировать ввод-вывод с упреждением. Удалён из ядер начиная с 2.6.33.deadline
лёгкий планировщик, который пытается установить жёсткий предел на задержки ввода-вывода.cfq
поддерживает честное распределение ввода-вывода между процессами, используя концепцию очередей (queue) для каждого процесса. CFQ разедляет синхронные и асинхронные операции ввода-вывода, отдавая предпочтение синхронным операциям. Грубо говоря, CFQ не допускает ситуации, когда один процесс начнёт создавать много операций ввода-вывода, другие процессы могут ``голодать''. Имеет несколько параметров настройки.
Сменить планировщик можно на лету:
# echo "deadline" > /sys/block/sda/queue/schedulerПосле этого планировщик для данного диска будет изменён.
И другие каталоги...
Содержимое других каталогов будет интереснее разработчикам, а не пользователям, и может сильно меняться от версии ядра Linux.
/sys/bus
Это структура шин данных в системе, которая показывает, какая шина куда подключена (например, контроллер USB может быть подключен к шине PCI), и какие устройства в каждой шине потенциально может поддерживать (наряду с соответствующими драйверами), и какие устройства существуют. Здесь есть символической ссылки, которые указывают на директории устройства в глобальном дереве устройств. Каждый тип шины данных представлен двумя подкаталогами: устройств и драйверов.
/sys/class
Хранит все классы устройств, зарегистрированные ядром. Используется для описания функционального типа устройств. Большинство подкаталогов содержат символические ссылки на каталоги device и driver. Например, физическое устройство типа мышь может ссылаться на объект ядра "мышь", на устройство input event и input debug. Классы могут включать в себя диски, разделы, последовательные порты, и т.д.
/sys/devices
Содержит глобальную иерархию устройств: каждое физическое устройство, которые было обнаружено и зарегистрировано ядром.
Например, автор этих строк нашёл:
/sys/devices/virtual/thermal/thermal_zone0/tempпоказания температуры на процессоре в ноутбуке. Исключений два - platform devices и system devices.
Platform devices это периферия (подключаемые устройства), присущие конкретной платформе (порты ввода-вывода, legacy-устройства типа последовательного контроллера или контроллера дискет [floppy controller]).
System devices это устройства, интергрированные в платформу, например аппаратные регистры для доступа к конфигурированию, которые не имеют возможностей обмениваться данными. Обычно для них нет драйверов (процессор, таймеры и другое).
/sys/firmware
Cодержит интерфейсы для просмотра и манипулирования firmware-специфичными объектами и их параметрами. Как правило, это платформо-зависимый код, который выполняется в системе при включении, например BIOS.
/sys/module
Cодержит подкаталоги для каждого загруженного модуля ядра. Имя каталога отражает имя модуля. Ядро имеет глобальное пространство имён для всех модулей. Подкаталоги содержат параметры, специфичные для каждого загруженного модуля. Эта информация используется для отладки и простым смертным не будет интересна.
/sys/power
Это скорее заделка на будущее. Может содержать название состояния, которое позволит процессу переходить в режим пониженного энергопотребления.
Ссылки
Есть любопытный документец [1] The sysfs Filesystem, OLS'05 на 14 страниц, написанная тем водянистым и пустозвонным стилем, коий так не переваривает автор этих строк. Документация к ядру тоже не особенно жаждет подробно рассказать о том, что означают все эти переменные и отгораживается вот этим:
TODO: Finish this section.Понятно, что это самое туду не входит в приоритетный список дел. Но кое-что выудить всё-таки можно. Надеюсь, что этот пост несколько приподымет завесу тайны с файловой системы /sys.