Специализированная файловая система proc

Файловая система proc является важным источником информации о вашей Linux-системе, который попросту нельзя игнорировать. Вообще, proc является псевдо- или виртуальной файловой системой, которая предоставляет пользователям доступ к внутренним структурам ядра Linux. Другими словами, proc не является реальной файловой системой в обычном смысле; она располагается исключительно в оперативной памяти, а не на диске. При этом она автоматически монтируется системой.

Данная файловая система содержит по большей части обычные файлы и директории, поэтому вы можете использовать стандартные инструменты Linux для работы с ней. Все примеры из данной статьи были протестированы в Ubuntu, но, ввиду того, что файловая система proc реализована на уровне ядра Linux, она будет функционировать аналогичным образом в любом дистрибутиве Linux. На всякий случай приведу параметры данной системы:

$ cat /etc/issue.net
Ubuntu 19.10
$ uname -a
Linux layla 5.3.0-45-generic #37-Ubuntu SMP Thu Mar 26 20:41:27 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Базовые приемы работы с файловой системой proc

Для того, чтобы узнать точку монтирования файловой системы proc, достаточно использовать утилиту mount и найти в ее выводе строку, относящуюся к искомой точке монтирования. В большинстве случаев файловая система proc монтируется в директорию /proc:

$ mount | grep proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
...

Получив данную информацию, следует перейти в директорию /proc и исследовать ее содержимое. Вы наверняка обнаружите множество директорий с числовыми именами; эти числа являются идентификаторами (PID) исполняющихся в текущее время процессов. Остальные файлы и директории относятся не к отдельным процессам, а к системе в целом:

$ cd /proc
$ ls
1 131 1627 19788 2190 25870 421 857 loadavg
10 1319 163 19798 2191 25882 423 858 locks
1032 133 164 198 2193 259 425 9 mdstat
1033 1334 165 19913 2195 26 427 957 meminfo
1034 134 16543 1993 2196 2662 429 958 misc
1037 1341 16544 19981 2197 2663 431 acpi modules
1040 1343 16557 19985 2198 27 433 asound mounts
1042 135 16558 2 2199 2792 435 buddyinfo mtrr
1046 138 16559 2004 22 28 437 bus net
1048 139 16560 2019 2200 2803 439 cgroups pagetypeinfo
1051 14 166 2021 2208 2808 441 cmdline partitions
1053 140 17 2026 2210 2826 443 consoles pressure
1054 141 179 2036 2216 2832 445 cpuinfo sched_debug
1055 142 17907 2041 2219 29 447 crypto schedstat
1062 143 18 2042 2222 2935 449 devices scsi
1064 144 1850 2078 2229 2946 451 diskstats self
1065 145 18520 2083 2244 2984 453 dma slabinfo
11 147 1888 2084 2282 2999 455 driver softirqs
12 148 1889 2089 2291 3 457 execdomains stat
1207 149 18967 2094 23 30 459 fb swaps
1218 15 1936 2098 2315 3001 463 filesystems sys
122 150 1937 21 2349 3045 465 fs sysrq-trigger
1223 1503 19382 2102 2354 3064 467 interrupts sysvipc
123 151 19483 2107 24 330 469 iomem thread-self
124 154 19484 2111 2431 331 471 ioports timer_list
1248 155 1954 2125 2449 383 604 irq tty
125 156 1957 2152 2455 3852 605 kallsyms uptime
1252 157 19600 2157 25 4 606 kcore version
126 158 1961 2158 251 405 613 keys version_signature
1264 159 1962 2160 25140 411 615 key-users vmallocinfo
127 16 1965 2164 252 414 7481 kmsg vmstat
128 160 19656 2176 258 415 7588 kpagecgroup zoneinfo
129 161 19673 2182 25822 417 7593 kpagecount
130 1613 19732 2189 25847 419 8 kpageflags

Начнем с исследования относящихся к системе файлов. Например, файл /proc/cpuinfo содержит информацию о центральном процессоре системы, а именно, его производителе, модели, количестве ядер, тактовой частоте, флагах и так далее:

$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Xeon(R) CPU 3060 @ 2.40GHz
stepping : 6
microcode : 0xd0
cpu MHz : 1875.772
cache size : 4096 KB
...

Аналогично, файл /proc/meminfo содержит информацию об оперативной памяти. Кроме того, он содержит статистику ее использования:

$ cat /proc/meminfo
MemTotal: 4029884 kB
MemFree: 154800 kB
MemAvailable: 1490440 kB
Buffers: 93856 kB
Cached: 1568120 kB
SwapCached: 1748 kB
Active: 2288724 kB
Inactive: 1126348 kB
...

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

$ cat /proc/modules
ufs 81920 0 - Live 0x0000000000000000
qnx4 16384 0 - Live 0x0000000000000000
hfsplus 110592 0 - Live 0x0000000000000000
hfs 61440 0 - Live 0x0000000000000000
minix 36864 0 - Live 0x0000000000000000
ntfs 106496 0 - Live 0x0000000000000000
msdos 20480 0 - Live 0x0000000000000000
jfs 188416 0 - Live 0x0000000000000000
xfs 1273856 0 - Live 0x0000000000000000
cpuid 16384 0 - Live 0x0000000000000000
...

Для получения списка поддерживаемых файловых систем следует исследовать содержимое файла /proc/filesystems:

$ cat /proc/filesystems
nodev sysfs
nodev tmpfs
nodev bdev
nodev proc
nodev cgroup
nodev cgroup2
nodev cpuset
nodev devtmpfs
nodev configfs
nodev debugfs
nodev tracefs
nodev securityfs
nodev sockfs
nodev bpf
nodev pipefs
nodev ramfs
nodev hugetlbfs
nodev devpts
ext3
ext2
ext4
...

Теперь обратимся к директориям с информацией о процессах; к примеру, рассмотрим процесс init, который имеет идентификатор 1:

$ ps aux | grep -i init | head -1
root 1 0.0 0.3 170696 12296 ? Ss 17:42 0:07 /sbin/init splash

После этого перейдем в поддиректорию с именем 1 директории /proc и рассмотрим находящиеся в ней файлы. В директории находится большое количество файлов, имена большинства из которых говорят сами за себя:

$ cd /proc/1
$ ls
arch_status environ mountinfo personality statm
attr exe mounts projid_map status
autogroup fd mountstats root syscall
auxv fdinfo net sched task
cgroup gid_map ns schedstat timers
clear_refs io numa_maps sessionid timerslack_ns
cmdline limits oom_adj setgroups uid_map
comm loginuid oom_score smaps wchan
coredump_filter map_files oom_score_adj smaps_rollup
cpuset maps pagemap stack
cwd mem patch_state stat

Для того, чтобы убедиться в наличии всех этих файлов в директориях других процессов, можно использовать идентификатор используемой командной оболочки. Вы можете получить этот идентификатор, выполнив команду echo $$. $$ является специальной переменной, содержащей идентификатор процесса текущей командной оболочки. Если перейти в директорию соответствующего процесса в рамках файловой системы proc, можно обнаружить файлы с теми же именами:

$ echo $$
7593
$ cd /proc/7593
$ ls
arch_status environ mountinfo personality statm
attr exe mounts projid_map status
autogroup fd mountstats root syscall
auxv fdinfo net sched task
cgroup gid_map ns schedstat timers
clear_refs io numa_maps sessionid timerslack_ns
cmdline limits oom_adj setgroups uid_map
comm loginuid oom_score smaps wchan
coredump_filter map_files oom_score_adj smaps_rollup
cpuset maps pagemap stack
cwd mem patch_state stat

Для исследования содержимого этих файлов следует запустить длительно работающий процесс. Вы можете открыть окно терминала и выполнить с помощью него команду tty для получения имени файла устройства терминала. После этого следует ввести команду cat и нажать клавишу Enter. Теперь данная команда будет ожидать вашего ввода:

$ tty
/dev/pts/0
$ cat

После этого следует открыть второе окно терминала и найти идентификатор процесса cat с помощью команды pgrep:

$ pgrep cat
20722

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

$ cat /proc/20722/cmdline
cat

Далее обратимся к директории с именем cwd, которая является ссылкой (а точнее, символьной ссылкой) на директорию, в которой было инициировано исполнение утилиты cat; в моем случае это домашняя директория:

$ ls -l /proc/20722/cwd
lrwxrwxrwx 1 alex alex 0 апр 6 21:51 /proc/20722/cwd -> /home/alex

В процессе исполнения бинарного файла обычно осуществляется открытие нескольких файлов. В общем случае открываются файлы стандартного ввода (stdin), стандартного вывода (stdout) и стандартного вывода сообщений об ошибках (stderr). Если вы исследуете содержимое поддиректории fd директории нашего процесса в файловой системе /proc, вы обнаружите три символьных ссылки на файл устройства терминала, с помощью которого был инициирован запуск процесса:

$ ls -l /proc/20722/fd
итого 0
lrwx------ 1 alex alex 64 апр 6 21:55 0 -> /dev/pts/0
lrwx------ 1 alex alex 64 апр 6 21:55 1 -> /dev/pts/0
lrwx------ 1 alex alex 64 апр 6 21:55 2 -> /dev/pts/0

Еще одним важным файлом является файл exe, представляющий собой символьную ссылку на абсолютную директорию запущенного бинарного файла. В моем случае это путь к утилите cat:

$ ls -l /proc/20722/exe
lrwxrwxrwx 1 alex alex 0 апр 6 21:58 /proc/20722/exe -> /bin/cat

Также важным файлом является файл, environ, содержащий информацию о переменных окружения процесса:

$ cat /proc/20722/environ
SHELL=/bin/bashSESSION_MANAGER=local/layla:@/tmp/.ICE-unix/2004,unix/layla:/tmp/.ICE-unix/2004COLORTERM=truecolor...

Важные файлы файловой системы proc

Хотя в примерах выше и были продемонстрированы некоторые важные файлы файловой системы /proc, таких файлов значительно больше, поэтому следует как минимум перечислить имена тех файлов, которые не были рассмотрены.

Важные файлы, относящиеся к процессам

Вы можете использовать следующие файлы файловой системы proc для получения информации об отдельных процессах:

  • /proc/$pid/cmdline — содержит параметры командной строки, переданные на этапе запуска процесса
  • /proc/$pid/cwd — является символьной ссылкой на текущую рабочую директорию процесса
  • /proc/$pid/environ — содержит переменные окружения, заданные на этапе запуска процесса
  • /proc/$pid/exe — является символьной ссылкой на исполненный бинарный файл
  • /proc/$pid/fd — поддиректория с символьными ссылками на файлы, открытые процессом
  • /proc/$pid/io — содержит статистику операций ввода/вывода процесса
  • /proc/$pid/limits — содержит информацию о лимитах использования ресурсов процессом
  • /proc/$pid/maps — содержит информацию об отображенных регионах памяти и правах доступа к ним
  • /proc/$pid/stack — содержит трассировку вызовов функций в рамках стека ядра
  • /proc/$pid/stat — содержит статистику использования ресурсов процессом
  • /proc/$pid/task/ — является директорией с информацией о программных потоках

Важные файлы, относящиеся к системе

А это список важных файлов, не относящихся к отдельным процессам:

  • /proc/cmdline — содержит аргументы, переданные ядру Linux
  • /proc/cpuinfo — содержит информацию о центральном процессоре
  • /proc/meminfo — содержит информацию об оперативной памяти
  • /proc/filesystems — содержит информацию о поддерживаемых ядром файловых системах
  • /proc/modules — содержит информацию о загруженных модулях ядра
  • /proc/partitions — содержит информацию дисковых разделах
  • /proc/swaps — содержит информацию о пространстве подкачки
  • /proc/self — содержит информацию о процессе, работающем с файловой системой proc
  • /proc/slabinfo — содержит информацию о кэшах ядра Linux
  • /proc/sys — содержит различные файлы и поддиректории, отражающие значения внутренних переменных ядра Linux

Где найти дополнительную информацию?

Данный обзор содержит описание лишь некоторых элементов файловой системы proc. Дополнительная информация доступна на странице руководства proc, доступ к которой может быть послучен после исполнения команды man proc или после перехода по следующей ссылке.