Это на самом деле довольно просто, по крайней мере, если вам не нужны детали реализации.
Во-первых, в Linux все файловые системы (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) реализованы в ядре. Некоторые могут перенести работу в пользовательский код через FUSE, а некоторые приходят только в форме модуля ядра ( родной ZFS является ярким примером последнего из-за лицензионных ограничений), но в любом случае остается компонент ядра. Это важная основа.
Когда программа хочет читать из файла, он будет выдавать различные вызовы библиотек системы , которая в конечном счете , в конечном итоге в ядре в виде open()
, read()
, close()
последовательность (возможно , с seek()
добавленными для хорошей мерой). Ядро берет указанный путь и имя файла и через уровень файловой системы и устройства ввода / вывода преобразует их в физические запросы чтения (а во многих случаях также запросы записи - например, обновления времени) в некоторое хранилище.
Однако нет необходимости переводить эти запросы специально в физическое постоянное хранилище . Контракт ядра заключается в том, что при выдаче этого конкретного набора системных вызовов будет предоставлено содержимое рассматриваемого файла . Где именно в нашем физическом мире «файл» существует, это вторично.
На /proc
обычно устанавливается то, что известно как procfs
. Это особый тип файловой системы, но поскольку это файловая система, она на самом деле не отличается от, например, ext3
файловой системы, смонтированной где-то. Таким образом, запрос передается в код драйвера файловой системы procfs, который знает обо всех этих файлах и каталогах и возвращает определенные фрагменты информации из структур данных ядра .
«Уровень хранения» в данном случае представляет собой структуры данных ядра и procfs
обеспечивает чистый, удобный интерфейс для доступа к ним. Имейте в виду, что монтирование procfs в /proc
это просто соглашение; Вы могли бы так же легко установить его в другом месте. Фактически, это иногда делается, например, в chroot-тюрьмах, когда выполняющемуся там процессу по какой-то причине требуется доступ к / proc.
Это работает так же, если вы записываете значение в некоторый файл; на уровне ядра, что приводит к ряду open()
, seek()
, write()
, close()
вызовы , которые снова получить передаются драйверу файловой системы; опять же, в данном конкретном случае, код procfs.
Конкретная причина, по которой вы видите file
возвращение, empty
заключается в том, что многие файлы, представленные procfs, имеют размер 0 байт. Размер 0 байт, вероятно, является оптимизацией на стороне ядра (многие файлы в / proc являются динамическими и могут легко варьироваться по длине, возможно, даже от одного чтения к другому, и вычисление длины каждого файла в каждом прочитанном каталоге будет потенциально очень дорого). Переходя к комментариям к этому ответу, который вы можете проверить в своей системе, запустив strace или аналогичный инструмент, file
сначала выдает stat()
вызов для обнаружения любых специальных файлов, а затем использует возможность, если размер файла указан как 0 , прервите и сообщите файл как пустой.
Это поведение на самом деле задокументировано и может быть отменено путем указания -s
или --special-files
при file
вызове, хотя, как указано на странице руководства, это может иметь побочные эффекты. Приведенная ниже цитата взята из справочной страницы 5.11 файла BSD от 17 октября 2011 года.
Как правило, file пытается только прочитать и определить тип файлов аргументов, отчеты stat (2) которых являются обычными файлами. Это предотвращает проблемы, потому что чтение специальных файлов может иметь особые последствия. Задание этой -s
опции заставляет файл также читать файлы аргументов, которые являются блочными или символьными специальными файлами. Это полезно для определения типов файловой системы данных в разделах необработанного диска, которые являются блочными специальными файлами. Эта опция также заставляет файл игнорировать размер файла, как сообщает stat (2), поскольку в некоторых системах он сообщает нулевой размер для разделов необработанного диска.
strace file /proc/version
илиltrace -S /proc/version
, оптимизация довольно мала.stat()
Сначала он выполняет вызов и обнаруживает, что размер равен 0, пропуская, таким образом,open()
- но перед этим он загружает несколько магических файлов.file
. Таким образом, файл предварительно загружает магические файлы, а затем обрабатывает параметр командной строки по параметру; вместо того, чтобы перемещать загрузку магического файла в «сделайте это непосредственно перед попыткой определить, к какому типу файла относится именно этот файл», это часть кода, что увеличило бы сложность. Вызовstat()
и действие по возвращаемому значению по сути безвредны; сложность в отслеживании дополнительных внутренних состояний рискует привнести ошибки.file
отчеты «файл пуст», заключается в том, что он вызываетstat
обнаружение специальных файлов (именованных каналов, устройств и т. д.) и использует эту возможность, чтобы остановить обработку пустых файлов.file -s /proc/version
сообщает «ASCII текст».-s
Предполагается для блочных / char специальных устройств. Наконец, я посмотрел наfile
источник, и в конце fsmagic.c я увидел это объяснение, почему он возвращаетсяASCII text
вместоempty
:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
В этом каталоге вы можете контролировать, как ядро просматривает устройства, настраивать параметры ядра, добавлять устройства в ядро и снова удалять их. В этом каталоге вы можете просматривать статистику использования памяти и ввода-вывода .
Вы можете увидеть, какие диски смонтированы и какие файловые системы используются. Короче говоря, каждый отдельный аспект вашей системы Linux можно изучить из этого каталога, если вы знаете, что искать.
/proc
Каталог не обычный каталог. Если вы загрузитесь с загрузочного компакт-диска и посмотрите на этот каталог на жестком диске, вы увидите, что он пуст. Когда вы смотрите на нее под вашей обычной работающей системой, она может быть довольно большой. Однако, похоже, он не использует пространство на жестком диске. Это потому, что это виртуальная файловая система.Поскольку
/proc
файловая система является виртуальной файловой системой и находится в памяти, новая/proc
файловая система создается каждый раз, когда ваша машина Linux перезагружается.Другими словами, это всего лишь средство, позволяющее легко заглядывать в кишки системы Linux через интерфейс типа файлов и каталогов. Когда вы смотрите на файл в
/proc
каталоге, вы смотрите непосредственно на диапазон памяти в ядре Linux и видите, что он может видеть.Слои в файловой системе
Примеры:
/proc
есть каталог для каждого запущенного процесса, названный по его идентификатору процесса. Эти каталоги содержат файлы, которые содержат полезную информацию о процессах, например:exe
: символическая ссылка на файл на диске, с которого был запущен процесс.cwd
: это символическая ссылка на рабочий каталог процесса.wchan
: который при чтении возвращает ожидающий канал, на котором включен процесс.maps
: который при чтении возвращает карты памяти процесса./proc/uptime
возвращает время работы в виде двух десятичных значений в секундах, разделенных пробелом:/proc/interrupts
: Для информации, связанной с прерываниями./proc/modules
: Для списка модулей.Для более подробной информации смотрите man proc или kernel.org .
источник
mount -t procfs procfs /mnt/proc
, вы увидите работающее в настоящее время ядро / proc.Вы правы, они не настоящие файлы.
Проще говоря, это способ общения с ядром с использованием обычных методов чтения и записи файлов вместо непосредственного вызова ядра. Это соответствует философии Unix «все - файл».
Файлы
/proc
нигде физически не существуют, но ядро реагирует на файлы, которые вы там читаете и записываете, и вместо записи в хранилище сообщает информацию или что-то делает.Точно так же файлы в
/dev
действительности не являются файлами в традиционном смысле (хотя в некоторых системах файлы в/dev
действительности могут существовать на диске, они не будут иметь к ним никакого отношения, кроме того, к какому устройству они относятся) - они позволяют вам говорить к устройству, использующему обычный API-интерфейс ввода-вывода файлов Unix, или все, что его использует, например оболочкиисточник
Внутри
/proc
каталога есть два типа контента: первый нумерованный каталог, а второй - файл системной информации./proc
виртуальная файловая система Например, если вы это сделаетеls -l /proc/stat
, вы заметите, что он имеет размер 0 байт, но если вы сделаете «cat / proc / stat», вы увидите некоторый контент внутри файла.Сделайте
ls -l /proc
, и вы увидите много каталогов только с номерами. Эти числа представляют идентификаторы процесса (PID). Файлы внутри этого пронумерованного каталога соответствуют процессу с этим конкретным PID.Некоторые файлы, доступные в разделе
/proc
, содержат системную информацию, такую как cpuinfo, meminfo и loadavg.Некоторые команды Linux считывают информацию из этих
/proc
файлов и отображают ее. Например, команда free считывает информацию о памяти из/proc/meminfo
файла, форматирует ее и отображает.Чтобы узнать больше об отдельных
/proc
файлах, выполните «man 5 FILENAME».источник
Минимальный исполняемый пример
На мой взгляд, лучший способ понять эти вещи - поэкспериментировать с ними, поэтому вот модуль ядра, который создает запись в procfs:
myprocfs.c
и тогда мы взаимодействуем с ним как:
и это производит вывод:
Из этого примера мы ясно видим, что
proc
файлы позволяют нам реализовывать произвольные «системные вызовы, связанные с файлами», такие какopen
,read
иllseek
.Эти системные вызовы могут затем использоваться для произвольной связи с ядром.
Следовательно, эти файлы не должны иметь ничего общего с реальными файлами в файловых системах, и это относится почти ко всем из них.
Например, в нашем небольшом примере мы просто создаем бесполезный файл, который
read
всегда возвращаетсяabcd\n
.Вот моя полностью автоматизированная установка QEMU + Buildroot, чтобы легко и безопасно создавать и играть с этим модулем ядра:
Некоторые другие подобные интерфейсы включают в себя:
debugfs предлагает в основном точно такой же интерфейс, но указывает на менее стабильный API, вот пример .
Символьные устройства также очень похожи, но файлы создаются с помощью
mknod
, например: https://unix.stackexchange.com/questions/37829/how-do-character-device-or-character-special-files-work/371758# 371758sysfs - еще один более ограниченный вариант, см. этот ответ для более подробной информации: https://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs/382315#382315
источник