61

В /proc есть много файлов, таких как /proc/cpuinfo , /proc/meminfo , /proc/devices и т.д. , Которые при открытии возвращают системную информацию.

Эти файлы, по-видимому, не существуют на самом деле, поскольку запуск file на них только говорит о том, что они пусты.

$ file /proc/cpuinfo
/proc/cpuinfo: empty

Как эти файлы работают точно?

4 ответа4

72

Это на самом деле довольно просто, по крайней мере, если вам не нужны детали реализации.

Во-первых, в 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 , хотя, как указано на странице руководства, это может иметь побочные эффекты. Приведенная ниже цитата взята из справочной страницы BSD file 5.11 от 17 октября 2011 года.

Обычно файл пытается только прочитать и определить тип файлов аргументов, отчеты stat(2) которых являются обычными файлами. Это предотвращает проблемы, потому что чтение специальных файлов может иметь особые последствия. Указание опции -s заставляет файл также читать файлы аргументов, которые являются блочными или символьными специальными файлами. Это полезно для определения типов файловой системы данных в разделах необработанного диска, которые являются блочными специальными файлами. Эта опция также заставляет файл игнорировать размер файла, как сообщает stat(2), так как в некоторых системах он сообщает нулевой размер для разделов необработанного диска.

15

В этом каталоге вы можете управлять тем, как ядро просматривает устройства, настраивать параметры ядра, добавлять устройства в ядро и снова удалять их. В этом каталоге вы можете напрямую просматривать статистику использования памяти и ввода / вывода .

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

Каталог /proc не является нормальным каталогом. Если бы вы загружались с загрузочного компакт-диска и смотрели на этот каталог на жестком диске, вы бы увидели, что он пуст. Когда вы смотрите на нее под вашей обычной работающей системой, она может быть довольно большой. Однако, похоже, он не использует пространство на жестком диске. Это потому, что это виртуальная файловая система.

Поскольку файловая система /proc является виртуальной файловой системой и находится в памяти, новая файловая система /proc создается каждый раз при перезагрузке компьютера Linux.

Другими словами, это всего лишь средство, позволяющее легко заглядывать в суть системы Linux через интерфейс типа файлов и каталогов. Когда вы смотрите на файл в каталоге /proc , вы смотрите непосредственно на диапазон памяти в ядре Linux и видите, что он может видеть.

Слои в файловой системе

Введите описание изображения здесь

Примеры:

  • Внутри /proc есть каталог для каждого запущенного процесса, названный по его идентификатору процесса. Эти каталоги содержат файлы с полезной информацией о процессах, такие как:
    • exe: символьная ссылка на файл на диске, с которого был запущен процесс.
    • cwd: это символическая ссылка на рабочий каталог процесса.
    • wchan: который при чтении возвращает ожидающий канал, на котором включен процесс.
    • maps: который при чтении возвращает карты памяти процесса.
  • /proc/uptime возвращает время работы в виде двух десятичных значений в секундах, разделенных пробелом:
    • количество времени с момента запуска ядра.
    • количество времени, в течение которого ядро не использовалось.
  • /proc/interrupts: для информации, связанной с прерываниями.
  • /proc/modules: список модулей.

Для более подробной информации смотрите man proc или kernel.org.

5

Вы правы, они не настоящие файлы.

Проще говоря, это способ общения с ядром с использованием обычных методов чтения и записи файлов вместо непосредственного вызова ядра. Это соответствует философии Unix «все - файл».

Файлы в /proc физически нигде не существуют, но ядро реагирует на файлы, которые вы там читаете и записываете, и вместо записи в хранилище сообщает информацию или что-то делает.

Точно так же файлы в /dev самом деле не являются файлами в традиционном смысле (хотя в некоторых системах файлы в /dev могут фактически существовать на диске, они не будут иметь для них ничего, кроме того, к какому устройству они относятся) - они Позволяет вам общаться с устройством с помощью обычного API ввода-вывода файлов Unix - или всего, что использует его, например оболочек

3

Внутри каталога /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».

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .