Инструменты пользователя

Инструменты сайта


procfs

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

procfs [2019/01/25 12:59]
procfs [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== /proc: Файловая система для процессов ProcFS ======
 +
 +{{htmlmetatags>
 +metatag-description=(procfs — специальная файловая система, используемая в UNIX-подобных операционных системах. Позволяет получить доступ к информации из ядра о системных процессах. Необходима для выполнения таких команд как ps, w, top.)
 +}}
 +
 +**ProcFS** — специальная файловая система, используемая в Linux, позволяет получить доступ к информации из ядра о системных процессах. Эта файловая система необходима для выполнения таких команд как [[ps]], w, [[top]].
 +
 +**Процессы**: В любое время в Linux'е одновременно запущено множество процессов. Некоторые из них, такие как оконные менеджеры, email-клиенты и Web-браузеры, видны конечному пользователю. Другие, вроде серверов и вспомогательных процессов, в глаза не бросаются, но запущены в фоновом режиме, выполняя задания, не требующие каких-либо действий со стороны пользователя. Запуск "ps -ef" в shell'е выведет список всех запущенных на данный момент процессов. А выглядеть будет примерно так:
 +<file>
 +$ ps -ef
 +UID        PID  PPID  C STIME TTY          TIME CMD
 +root              0 11:08 ?        00:00:04 init
 +root              0 11:08 ?        00:00:00 [keventd]
 +root              0 11:08 ?        00:00:00 [ksoftirqd_CPU0]
 +root              0 11:08 ?        00:00:00 [kswapd]
 +root              0 11:08 ?        00:00:00 [bdflush]
 +root              0 11:08 ?        00:00:00 [kupdated]
 +root              0 11:08 ?        00:00:00 [kjournald]
 +root        86      0 11:08 ?        00:00:00 /sbin/devfsd /dev
 +root       165      0 11:09 ?        00:00:00 [kjournald]
 +root       168      0 11:09 ?        00:00:00 [khubd]
 +root       294      0 11:09 ?        00:00:00 [kapmd]
 +root       515      0 11:09 ?        00:00:00 metalog [MASTER]
 +root       521   515  0 11:09 ?        00:00:00 metalog [KERNEL]
 +root       531      0 11:09 ?        00:00:00 /sbin/dhcpcd eth0 /etc/X11/fs/config -droppriv -user xfs
 +root       572      0 11:09 ?        00:00:00 /usr/kde/2/bin/kdm
 +root       593   572  2 11:09 ?        00:04:27 /usr/X11R6/bin/X -auth /var/lib/kdm/authfiles/A:0-25pIgI
 +root       644      0 11:09 vc/1     00:00:00 /sbin/agetty 38400 tty1 linux
 +root      1045   572  0 12:16 ?        00:00:00 -:0
 +mbutcher  1062  1045  0 12:16 ?        00:00:00 /bin/sh /etc/X11/Sessions/kde-2.2.2
 +mbutcher  1091  1062  0 12:16 ?        00:00:00 /bin/bash --login /usr/kde/2/bin/startkde
 +mbutcher  1132      0 12:16 ?        00:00:00 kdeinit: Running…
 +mbutcher  1157  1132  0 12:16 ?        00:00:01 kdeinit: kwin
 +mbutcher  1159      0 12:16 ?        00:00:07 kdeinit: kdesktop
 +mbutcher  1168      0 12:16 ?        00:00:00 kdeinit: kwrited
 +mbutcher  1171  1168  0 12:16 pty/s0   00:00:00 /bin/cat
 +mbutcher  1173      0 12:16 ?        00:00:00 alarmd
 +mbutcher  1207  1132  0 12:23 ?        00:00:08 kdeinit: konsole -icon konsole -miniicon konsole
 +mbutcher  1219  1207  0 12:23 pty/s2   00:00:00 /bin/bash
 +mbutcher  1309  1260  0 13:48 pty/s3   00:00:01 vi dev-and-proc.html
 +root      1314  1220  0 14:03 pty/s2   00:00:00 ps -ef
 +</file>
 +Многие из задач в выводе ps являются процессами, работающими в фоновом режиме. Те, что взяты в квадратные скобочки — процессы ядра. Только некоторые, вроде процессов kde и записей в конце списка, являются процессами, с которыми я взаимодействую напрямую.
 +
 +Для управления системой ядро должно хранить информацию о каждом запущенном процессе, включая само себя. Также должна быть возможность просмотра сведений о запущенных приложениях пользовательского уровня (хорошим примером служит "ps", а также "top"). В файловой системе /proc ядро и хранит информацию о процессах.
 +
 +Как и DevFS, /proc хранится в памяти, а не на диске. Если вы посмотрите в файл /proc/mounts (в котором приводится список всех примонтированных файловых систем), то увидите строку вроде этой:
 +
 +<file>
 +proc /proc proc rw 0 0
 +</file>
 +/proc контролируется ядром, у этой файловой системы нет «под собой» какого-либо устройства. Так как в ней в основном содержится информация, управляемая ядром, наиболее логичным место для хранения такой информации является память, также контролируемая ядром.
 +
 +Информация о запущенных процессах: Чтобы хранить информацию обо всех процессах, ядро присваивает каждому из них PID (Process ID — идентификатор процесса) в виде числа. Запуск команды "ps -ef" (см. выше) выведет список всех запущенных процессов в порядке их PID'ов (вторая колонка). Файловая система /proc хранит информацию о каждом PID.
 +
 +В /proc названиями многих каталогов являются числа. Эти директории ссылаются на номера PID. В таких каталогах находятся файлы, которые предоставляют подробную информацию о положении, окружении и прочих деталях процесса. В выводе ps (см. выше) была следующая строка:
 +
 +mbutcher  1219  1207  0 12:23 pty/s2   00:00:00 /bin/bash
 +Этот процесс — запущенный bash shell, имеющий PID 1219. Каталог /proc/1219 содержит информацию об этом процессе.
 +
 +$ ls /proc/1219
 +cmdline  cpu  cwd  environ  exe  fd  maps  mem  root  stat  statm  status
 +В файле «cmdline» располагается команда, которая вызвала процесс. В файле «environ» находятся данные о значениях окружения для процесса. «status» содержит информацию о статусе процесса, среди которой пользовательский (UID) и групповой (GID) идентификаторы для пользователя, запустившего процесс, идентификатор родительского процесса (parent process ID — PPID) и текущий статус процесса (например, «Sleep» или «Running»).
 +
 +<file>
 +$ cat status
 +Name:   bash
 +State:  S (sleeping)
 +Tgid:   1219
 +Pid:    1219
 +PPid:   1207
 +TracerPid:      0
 +Uid:    501     501     501     501
 +Gid:    501     501     501     501
 +FDSize: 256
 +Groups: 501 10 18
 +VmSize:     2400 kB
 +VmLck:         0 kB
 +VmRSS:      1272 kB
 +VmData:      124 kB
 +VmStk:        20 kB
 +VmExe:       544 kB
 +VmLib:      1604 kB
 +SigPnd: 0000000000000000
 +SigBlk: 0000000080010000
 +SigIgn: 8000000000384004
 +SigCgt: 000000004b813efb
 +CapInh: 0000000000000000
 +CapPrm: 0000000000000000
 +CapEff: 0000000000000000
 +</file>
 +У каждого каталога процесса есть несколько символических ссылок. «cwd» ссылается на текущий рабочий каталог для процесса. «exe» — ссылка на исполняемую программу процесса, а «root» ссылается на каталог, который процесс рассматривает как корневой (обычно «/»). В каталоге «fd» содержится список символических ссылок на дескрипторы файлов, используемых процессом.
 +
 +Существуют и другие файлы в каталоге процесса, предоставляющие исчерпывающую информацию: от занятности процессора и памяти до количества времени, которое запущен процесс. Большая часть этих файлов описана в документации исходников ядра («Documentation/file systems/proc.txt»), а также доступна в man — "man proc".
 +
 +Информация о ядре: Кроме хранения сведений о процессах, файловая система /proc содержит множество информации, самостоятельно созданной ядром для описания общего состояния системы.
 +
 +Ядро и модули могут создавать файлы в /proc для того, чтобы предоставить информацию о своем текущем состоянии. Например, /proc/fb показывает, какие сейчас доступны устройства типа frame buffer (буферы фреймов обычно используются для отображения загрузочного логотипа).
 +
 +$ cat fb
 +0 VESA VGA
 +Обратите внимание, что 0 ссылается на индекс frame buffer'а и устройство /dev/fb0. Если бы у меня был второй framebuffer, то появилась бы еще и строка с 1, соответствующая /dev/fb1. Часто данные proc ссылаются на устройства в /dev.
 +
 +В /proc хранится немало информации о железе. В файле /proc/pci написано про все обнаруженные в системе PCI устройства. Запуск команды "[[lspci]]" выводит идентичную информацию, так как использует /proc/pci для получения сведений об устройствах. В /proc/bus находятся каталоги для bus-архитектур (PCI, PCCard, USB), в которых содержится информация об устройствах, присоединенных таким образом (PCI, PCCard, USB). Информация о сети располагается в /proc/net. Информацию о жестких дисках можно найти в /proc/ide и /proc/scsi (в зависимости от типа устройства). В /procs/devices присутствует список всех устройств системы (они разделены на две категории: «block» — блочные, «character» — символьные).
 +
 +<file>
 +$ cat /proc/devices
 + Character devices:
 +   1 mem
 +   2 pty/m%d
 +   3 pty/s%d
 +   4 tts/%d
 +   5 cua/%d
 +   7 vcs
 +  10 misc
 +  14 sound
 +  29 fb
 + 116 alsa
 + 162 raw
 + 180 usb
 + 226 drm
 + 254 pcmcia
 +
 +Block devices:
 +  1 ramdisk
 +  2 fd
 +  3 ide0
 + 22 ide1
 +</file>
 +
 +В действительности, в /proc находится намного больше файлов, чем было описано здесь. У каждого ядра они могут несколько различаться, в зависимости от того, что было включено в ядро, какое железо и программное обеспечение используется и в каком состоянии в настоящий момент находится компьютер. К некоторым из этих файлов постоянно обращается машина, а другие предоставляют «интуитивную» информацию.
 +
 +Работа с процессами через /proc: Некоторые файлы /proc предназначены не только для чтения. Запись в них может влиять на состояние ядра. Просмотр содержимого файла в /proc обычно безопасно, но запись в них без точной уверенности в своих действиях может приводить к фатальным последствиям. Несмотря на это, иногда запись в /proc — единственный способ связи с ядром.
 +
 +Например, в некоторых версиях ядра присутствует опция включения Web-сервера (khttp), работающего на уровне ядра. Из-за того, что запуск Web-сервера по умолчанию является риском с точки зрения безопасности, khttp требует записи в /proc для запуска.
 +
 +<file>
 +echo 1 > /proc/sys/net/khttpd/start
 +</file>
 +Когда ядро видит, что содеримое /proc/sys/net/khttps/start меняется с 0 (по умолчанию) на 1, оно запускает сервер khttpd.
 +
 +Существуют десятки других настраиваемых параметров в /proc — некоторые для конфигурации железа, другие для управления ядром. Однако, многие из них являются низкоуровневыми и могут привести к печальным последствиям, если указать неправильные значения. Поэтому, если вы твердо не уверены в своих действиях, менять параметры в /proc строго не рекомендуется.
 +
 +  * **Вывод**
 +
 +/proc и /dev представляют интерфейсы к внутренностям Linux'а с помощью файлов. Они способствуют настройке и получению сведений об устройствах и процессах системы. Благодаря ним, можно с легкостью обновлять, изучать, запускать систему и устранять разнообразные неполадки. Понимание и применение знаний этих двух файловых систем являются ключом к созданию «более вашей» Linux-системы.
 +====== Описание файлов и директории из ProcFS ======
 +
 +  * /proc/PID/cmdline – аргументы командной строки (где PID – идентификатор процесса или self);
 +  * /proc/PID/environ – переменные окружения для данного процесса;
 +  * /proc/PID/status – статус процесса;
 +  * /proc/PID/fd – директория, содержащая символьные ссылки на каждый открытый файловый дескриптор;
 +  * /proc/cpuinfo – информация о процессоре (производитель, модель, поколение и т.п.);
 +  * /proc/cmdline – параметры, передаваемые ядру при загрузке;
 +  * /proc/uptime – количество секунд, прошедших с момента загрузки ядра и проведенных в режиме бездействия;
 +  * /proc/version – содержит информацию о версии ядра, компилятора и другую информацию, связанную с загруженным ядром.