«Все есть файл» — это идея, согласно которой Unix и его производные обрабатывают ввод/вывод с таких ресурсов , как документы, жесткие диски, модемы, клавиатуры, принтеры и даже некоторые межпроцессные и сетевые коммуникации, как простые потоки байтов, предоставляемые через пространство имен файловой системы . [1] Исключения включают семафоры , процессы и потоки .
Преимущество этого подхода в том, что один и тот же набор инструментов, утилит и API может использоваться для широкого спектра ресурсов и ряда типов файлов . При открытии файла создается дескриптор файла , использующий путь к файлу в качестве системы адресации. Затем дескриптор файла представляет собой интерфейс ввода-вывода потока байтов, на котором выполняются файловые операции. Дескрипторы файлов также создаются для таких объектов, как анонимные каналы и сетевые сокеты , и поэтому более точное описание этой функции — Все является дескриптором файла . [2] [3]
Кроме того, существует ряд псевдо- и виртуальных файловых систем , которые предоставляют внутренние данные ядра, такие как информация о процессах, пользовательскому пространству в иерархической файловой структуре. [4] Они монтируются в единую файловую иерархию .
Примером этой чисто виртуальной файловой системы является /proc , которая раскрывает многие системные свойства как файлы. Все эти файлы, в более широком смысле этого слова, имеют стандартные атрибуты файлов Unix, такие как владелец и права доступа , и могут быть запрошены теми же классическими инструментами и фильтрами Unix . Однако это не всегда считается быстрым или переносимым подходом. Некоторые операционные системы не монтируют /proc по умолчанию из-за проблем безопасности или скорости, полагаясь вместо этого на системные вызовы . [5] Тем не менее, он активно используется утилитами оболочки Linux , [6] [7] такими как реализация procps ps и BusyBox , который широко устанавливается на встраиваемых системах . [8] Программа Android Toolbox также зависит от него. [9]
Другим примером является sysfs , который обычно монтируется в /sys , что открывает структуры данных ядра . [10] sysfs предоставляет функциональность, похожую на механизм sysctl, обнаруженный в операционных системах BSD , с той разницей, что sysfs реализован как виртуальная файловая система, а не как специально созданный механизм ядра. [11]
Философия sysfs заключается в представлении каждого значения выделенным файлом. Кроме того, каждый файл имеет максимальный размер в PAGE_SIZE
байтах.
Для модуля ядра есть три возможности использовать файл в каталоге /sys:
Стандартный API sysfs использует специальную терминологию: файл называется атрибутом, функция, выполняемая при чтении атрибута, называется , show
а функция, выполняемая при записи атрибута, называется store
. [12]
Sysfs был получен из procfs между версиями ядра Linux 2.5-2.6, изначально как выделенная файловая система для отладки новой модели драйвера . И sysfs, и procfs основаны на памяти. Sysfs содержит каталоги для блочных устройств , физических типов шин , классов устройств (например, используемых для графики , работы в сети , ввода или печати ), специфичных для прошивки объектов и атрибутов, модулей ядра и подсистемы питания. [13]
Например, запись mem
в /sys/power/state запустит процедуру приостановки в ОЗУ . [14]
Другим примером файлов с определенным поведением являются файлы устройств /dev/null и /dev/zero . Записи в них будут отброшены. [15] Это может, например, использоваться для перенаправления ненужных стандартных потоков .