Файловая система в Unix-подобных операционных системах
Файловая система proc ( procfs ) — это специальная файловая система в Unix-подобных операционных системах, которая представляет информацию о процессах и другую системную информацию в иерархической файловой структуре, обеспечивая более удобный и стандартизированный метод динамического доступа к данным процесса, хранящимся в ядре, чем традиционные методы трассировки или прямой доступ к памяти ядра . Обычно во время загрузки он сопоставляется с точкой монтирования с именем /proc . Файловая система proc действует как интерфейс для внутренних структур данных о запущенных процессах в ядре. В Linux его также можно использовать для получения информации о ядре и изменения определенных параметров ядра во время выполнения ( sysctl ).
Многие Unix-подобные операционные системы поддерживают файловую систему proc, включая System V , Solaris , IRIX , Tru64 UNIX , BSD , Linux , IBM AIX , [1] QNX и Plan 9 от Bell Labs . Поддержка OpenBSD прекращена в версии 5.7, выпущенной в мае 2015 года. Она отсутствует в HP-UX [1] и macOS . [2]
Ядро Linux расширяет его до данных, не связанных с процессом.
Файловая система proc обеспечивает метод связи между пространством ядра и пространством пользователя . Например, версия GNU утилиты отчетов о процессах ps использует файловую систему proc для получения своих данных без использования каких-либо специализированных системных вызовов .
История
UNIX 8-е издание
Том Дж. Киллиан реализовал версию /proc для UNIX 8-го издания (V8) : он представил документ под названием «Процессы как файлы» на USENIX в июне 1984 года. Целью разработки procfs была замена системного вызова ptrace , используемого для трассировки процессов. Подробную документацию можно найти на странице руководства proc(4).
СВР3
Исходная операционная система AT&T System V Release 3 (SVR3) (доступная внутри AT&T в 1986 году и вообще в 1987 году) не имела файловой системы /proc , но ее последующая инкрементная версия имела. Он содержал только файлы, представляющие процессы, а не теперь общие подкаталоги.
СВР4
Роджер Фолкнер и Рон Гомес портировали V8 /proc на SVR4 и опубликовали статью под названием «Файловая система процесса и модель процесса в UNIX System V» на сайте USENIX в январе 1991 года. Этот тип procfs поддерживал создание ps , но файлы могли Доступ к ним возможен только с помощью функций read() , write() и ioctl () . Между 1995 и 1996 годами Роджер Фолкнер создал интерфейс procfs-2 для Solaris-2.6, который предлагает структурированную файловую систему /proc с подкаталогами.
План 9
Plan 9 реализовал файловую систему процессов, но пошел дальше, чем V8. Файловая система процессов V8 реализовала один файл для каждого процесса. Plan 9 создал иерархию отдельных файлов для обеспечения этих функций и сделал /proc реальной частью файловой системы.
4.4BSD и производные
4.4BSD клонировала свою реализацию /proc из Plan 9. [ необходима ссылка ] По состоянию на февраль 2011 года [обновлять]procfs постепенно прекращается во FreeBSD, [3] и вместо этого используется интерфейс sysctl для информации, связанной с процессом. Для обеспечения двоичной совместимости с программами пользовательского пространства Linux ядро FreeBSD также предоставляет linprocfs , аналогичный procfs Linux. [4]
Он был удален из OpenBSD в версии 5.7, выпущенной в мае 2015 года, поскольку «всегда страдал от гонок и теперь не используется». [5] В macOS не реализована procfs, и программы пользовательского пространства должны использовать интерфейс sysctl для получения данных процесса. [2]
Солярис
/proc в Solaris был доступен с самого начала (июнь 1992 г.). В Solaris 2.6 в 1996 году появился procfs2 от Роджера Фолкнера.
Линукс
Linux впервые добавил файловую систему /proc в версии 0.97.3, сентябрь 1992 года, и впервые начал расширять ее для данных, не связанных с процессом, в версии 0.98.6, декабрь 1992 года.
Начиная с 2020 года реализация Linux включает каталог для каждого запущенного процесса, включая процессы ядра , в каталогах с именем /proc/PID , где PID — это номер процесса. Каждый каталог содержит информацию об одном процессе, в том числе:
- /proc/PID/cmdline — команда, которая изначально запустила процесс.
- /proc/PID/cwd — символическая ссылка на текущий рабочий каталог процесса.
- /proc/PID/environ содержит имена и значения переменных среды, влияющих на процесс.
- /proc/PID/exe — символическая ссылка на исходный исполняемый файл, если он все еще существует (процесс может продолжать работу после того, как его исходный исполняемый файл был удален или заменен).
- /proc/PID/fd — каталог, содержащий символическую ссылку для каждого дескриптора открытого файла .
- /proc/PID/fdinfo — каталог, содержащий записи, описывающие позицию и флаги для каждого дескриптора открытого файла.
- /proc/PID/maps — текстовый файл, содержащий информацию о сопоставленных файлах и блоках (например, куче и стеке).
- /proc/PID/mem , двоичный образ, представляющий виртуальную память процесса , доступен только процессу ptrace .
- /proc/PID/root — символическая ссылка на корневой путь, видимый процессом. Для большинства процессов это будет ссылка на /, если только процесс не запущен в chroot- тюрьме.
- /proc/PID/status содержит основную информацию о процессе, включая состояние его выполнения и использование памяти.
- /proc/PID/task — каталог, содержащий жесткие ссылки на любые задачи, запущенные этим (т. е. родительским) процессом.
(Пользователи могут получить PID с помощью такой утилиты, как pgrep , pidof или ps :
$ ls -l /proc/ $( pgrep -n python3 ) /fd # Перечислить все файловые дескрипторы последнего запущенного процесса `python3', всего 0 lrwx------ 1 baldur baldur 64 18.03.2020 12: 31 0 -> /dev/pts/3 lrwx------ 1 балдур балдур 64 2020-03-18 12:31 1 -> /dev/pts/3 lrwx------ 1 балдур балдур 64 2020 -03-18 12:31 2 -> /dev/pts/3 $ readlink /proc/ $( pgrep -n python3 ) /exe # Список исполняемых файлов, используемых для запуска последнего запущенного процесса `python3' /usr/bin/python3 .8
)
/proc также включает в себя системную информацию, не связанную с процессом, хотя в ядре 2.6 большая часть этой информации перенесена в отдельную псевдофайловую систему sysfs , смонтированную в /sys :
- в зависимости от режима управления питанием (если он вообще есть), либо каталог /proc/acpi , либо /proc/apm , который предшествует sysfs и содержит различную информацию о состоянии управления питанием.
- /proc/buddyinfo — информация об алгоритме приятеля , который обрабатывает фрагментацию памяти. [6]
- /proc/bus , содержащий каталоги, представляющие различные шины на компьютере, например PCI / USB . Его в значительной степени заменила sysfs в /sys/bus, которая гораздо более информативна.
- /proc/fb — список доступных фреймбуферов.
- /proc/cmdline , предоставляющий параметры загрузки, передаваемые ядру.
- /proc/cpuinfo , содержащий информацию о процессоре , такую как его поставщик (и семейство процессоров, модель и названия моделей, которые должны позволять пользователям идентифицировать процессор) и его скорость ( тактовая частота процессора ), размер кэша, количество однородных элементов, ядер, и флаги ЦП . Формат и доступная информация во многом зависят от архитектуры. В некоторых архитектурах /proc/cpuinfo включает значение « bogomips », которое часто ошибочно воспринимают как меру скорости процессора, например, эталон, но на самом деле оно вообще не измеряет никакого разумного (для конечных пользователей) значения. Это происходит как побочный эффект калибровки таймера ядра и дает сильно различающиеся значения в зависимости от типа процессора даже при одинаковых тактовых частотах.
$ cat /proc/cpuinfo процессор: 0vendor_id : AuthenticAMD семейство процессоров: 16 модель: 6 название модели: AMD Athlon(tm) II X2 270 Степпинг процессора: 3 микрокод: 0x10000c8 CPU МГц: 2000.000 Размер кэша: 1024 КБ ... процессор : 1vendor_id : Аутентичное семейство процессоров AMD : 16 модель : 6 название модели : AMD Athlon(tm) II X2 270 Степпинг процессора : 3 микрокод : 0x10000c8 CPU МГц : 800.000 Размер кэша : 1024 КБ ...
В многоядерных процессорах /proc/cpuinfo содержит поля для «братьев» и «ядер процессора», которые представляют собой следующие вычисления: [7]
«братья» = (HT на пакет ЦП) * (количество ядер на пакет ЦП)«ядра процессора» = (количество ядер на пакет ЦП)
Пакет ЦП означает физический ЦП, который может иметь несколько ядер ( одноядерное для одного, двухъядерное для двух, четырехъядерное для четырех). Это позволяет различать гиперпоточность и двухъядерность, т. е. количество гиперпотоков на пакет ЦП можно рассчитать по братьям и сестрам / ядрам ЦП . Если оба значения для пакета ЦП одинаковы, гиперпоточность не поддерживается. [8] Например, пакет ЦП с братьями и сестрами = 2 и «ядрами процессора» = 2 является двухъядерным ЦП, но не поддерживает гиперпоточность.
- /proc/crypto — список доступных криптографических модулей.
- /proc/devices — список символьных и блочных устройств, отсортированный по идентификатору устройства, но также содержащий большую часть имени /dev.
- /proc/diskstats , предоставляющий некоторую информацию (включая номера устройств) для каждого из устройств логического диска.
- /proc/filesystems — список файловых систем, поддерживаемых ядром на момент листинга.
- /proc/interrupts , /proc/iomem , /proc/ioports и каталог /proc/irq , предоставляющий некоторые сведения об устройствах (физических или логических), использующих различные системные ресурсы.
- /proc/kmsg , содержащий сообщения, выводимые ядром [9]
- /proc/loadavg , содержащий статистику о текущей средней загрузке за последние минуты.
- /proc/meminfo , содержащий сводную информацию о том, как ядро управляет своей памятью.
- /proc/modules , один из самых важных файлов в /proc , содержащий список загруженных в данный момент модулей ядра. Это дает некоторое представление (не всегда правильное) о зависимостях.
- /proc/mounts , символическая ссылка на self/mounts, содержащая список смонтированных в данный момент устройств и их точек монтирования (а также какая файловая система используется и какие параметры монтирования используются).
- /proc/net/ — каталог, содержащий полезную информацию о сетевом стеке, в частности /proc/net/nf_conntrack , в котором перечислены существующие сетевые подключения (особенно полезно для отслеживания маршрутизации, когда iptables FORWARD используется для перенаправления сетевых подключений)
- /proc/partitions — список номеров устройств, их размеров и имен /dev , которые ядро определило как существующие разделы.
- /proc/scsi , предоставляющий информацию о любых устройствах, подключенных через SCSI или RAID- контроллер .
- символическая ссылка на текущий (проходящий) процесс в /proc/self (т.е. /proc/PID/ , где PID — это идентификатор текущего процесса).
- /proc/slabinfo , список статистики кэшей для часто используемых объектов в ядре Linux.
- /proc/swaps — список активных разделов подкачки, их различные размеры и приоритеты.
- Доступ к динамически настраиваемым параметрам ядра в /proc/sys . В /proc/sys появляются каталоги, представляющие области ядра, содержащие виртуальные файлы, доступные для чтения и записи . Например, часто упоминаемый виртуальный файл — /proc/sys/net/ipv4/ip_forward , поскольку он необходим для маршрутизации межсетевых экранов или туннелей. Файл содержит либо «1», либо «0»: если он равен 1, стек IPv4 пересылает пакеты, не предназначенные для локального хоста, если он равен 0, то нет.
- /proc/sysvipc , содержащий информацию о совместном использовании памяти и межпроцессном взаимодействии (IPC).
- /proc/tty , содержащий информацию о текущих терминалах; /proc/tty/driver выглядит как [ оригинальное исследование? ] список различных доступных типов tty , каждый из которых представляет собой список устройств каждого типа.
- /proc/uptime — время, в течение которого ядро работало с момента загрузки и находилось в режиме ожидания (оба в секундах)
- /proc/version , содержащий версию ядра Linux, номер дистрибутива, номер версии gcc (используемый для сборки ядра) и любую другую соответствующую информацию, относящуюся к версии ядра, работающей в данный момент.
- другие файлы в зависимости от различного оборудования, конфигураций модулей и изменений в ядре.
Основные утилиты, использующие /proc в Linux, входят в пакет procps ( процессы /proc ) и работают только в сочетании с смонтированным /proc .
СИГВИН
Cygwin реализовал procfs, который по сути такой же, как procfs в Linux.
Рекомендации
- ^ аб Немет, Эви; Снайдер, Гарт; Хейн, Трент Р.; Уэйли, Бен (14 июля 2010 г.). Руководство по системному администрированию UNIX и Linux. Пирсон Образование. п. 136. ИСБН 978-0-13-211736-4.
- ^ аб Амит Сингх (2003). «/proc в Mac OS X». Внутреннее устройство Mac OS X: Книга . Архивировано из оригинала 4 мая 2012 года . Проверено 10 июля 2021 г.
- ^ «Почему procfs устарел в пользу procstat?». freebsd.org . 22 февраля 2011 г.
- ^ "linprocfs(5)". Страницы руководства FreeBSD . Проект FreeBSD. 13 ноября 2019 года . Проверено 12 июня 2021 г.
- ^ «Подробные изменения между OpenBSD 5.6 и 5.7». openbsd.org .
- ^ "3.2.2./proc/buddyinfo". centos.org . Архивировано из оригинала 2 сентября 2013 года . Проверено 23 мая 2011 г.
- ^ Барон, Джейсон. «HT против двухъядерности». Архивировано из оригинала 13 мая 2016 года . Проверено 28 июня 2011 г.
- ^ «Понимание Linux /proc/cpuinfo» . richweb.com . Архивировано из оригинала 3 апреля 2012 года . Проверено 21 апреля 2015 г.
- ↑ Нгуен, Бинь (30 июля 2004 г.). «Иерархия файловой системы Linux». Бинь Нгуен. п. 63 . Проверено 18 июля 2016 г.
/proc/kmsg[:] Сообщения, выводимые ядром. Они также направляются в системный журнал.
Источники
- Страница руководства proc(2) Unix 8th Edition — описание оригинального procfs.
- Страница руководства по procfs Plan 9. Plan 9 значительно расширил концепцию procfs, предоставив значительно расширенный интерфейс для управления процессами и управления ими.
- Страницы руководства Linux Proc(5) Документация по Linux для procfs
- Documentation/filesystems/proc.txt Документация по ядру Linux для procfs
Внешние ссылки
- Краткая история /proc Блог Эрика Шрока
- Доступ к ядру Linux с помощью Procfs. Статья М. Тима Джонса на IBM DeveloperWorks.
- Проект документации Linux-файловая система-иерархия Linux
- Откройте для себя возможности каталога /proc Федерико Кереки.