Файловая система proc в Linux

Программы пространства пользователя в Linux не могут обращаться к ядру системы напрямую. Но для получения информации от ядра были созданы несколько специальных директорий с помощью которых любая программа или пользователь могут получить данные о состоянии компьютера и ядра. Это файловая система proc и sys.

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

В этой инструкции будет рассмотрена файловая система proc, ее структура, назначения файлов и где найти ту или иную нужную информацию. Но сначала немного теории.

Что такое proc?

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

Только папка proc linux содержит файлы нулевого размера. А также у каждого файла будет текущая дата создания. Например файл /proc/meminfo будет содержать разные данные при каждом открытии, поскольку использование памяти постоянно колеблется.

С помощью такой системы разработчики придерживаются главной концепции Unix - все есть файл. Все файлы доступны для редактирования любым редактором, и все они в простом текстовом формате, но для того чтобы проанализировать весь каталог вам понадобятся права суперпользователя. Почти все файлы доступны только для чтения, с них мы можем только получать информацию. Но есть и доступные для записи, в частности это /proc/sys с помощью которого вы можете настраивать различные параметры ядра.

Структура файловой системы proc

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

/proc/buddyinfo

В этом файле хранится информация о фрагментации памяти в ядре Linux. Чаще всего используется для диагностики проблем с фрагментацией памяти. Если в двух словах, то строка означает зону памяти, а номер количество доступных страниц определенного уровня.

Node 0, zone      DMA      0      0      0      1      2      0      1      0      1      1      3
Node 0, zone    DMA32    421    164     73     49     71     17     53     44     33      7     89
Node 0, zone   Normal    387    127     65     39     78     30     29     56     20      9     52

/proc/cgroups

Система контейнеризации и управления ресурсами доступными для процессов cgroups разработанная ребятами из Google позволяет ограничить доступ к любым ресурсам для процесса, а также контролировать его поведение в системе. В этом файле можно посмотреть состояние контрольных групп в вашей системе и их настройки.

/proc/cmdline

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

BOOT_IMAGE=/vmlinuz-4.1.21-14-default root=UUID=0e87875d-beb3-4639-8df4-8a9de4100dda resume=/dev/disk/by-uuid/a390a040-5848-4838-a8c7-3ba001e29d89 splash=silent quiet showopts

/proc/config.gz

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

Для извлечения информации обычно используется утилита zcat поскольку данные сжаты по алгоритму gzip:

zcat /proc/config.gz

/proc/consoles

В этом файле хранятся зарегистрированные в ядре символические устройства для системной консоли /dev/console:

tty0 -WU (EC p ) 4:7

/proc/cpuinfo

Здесь хранится очень подробная информация о процессоре. Вы можете посмотреть производителя, количество ядер, кеша, активные ядра, частоту, поддерживаемые расширения и многое другое. Ту же информацию можно получить с помощью специальных команд, но, как видите папка proc тоже предоставляет такие данные. И даже больше, все скрипты, выводящие информацию о процессоре берут ее отсюда.

processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 250 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 3000.000
cache size : 1024 KB
physical id : 0
siblings : 2

/proc/crypto

Здесь перечислены все криптографические шифры, поддерживаемые ядром, а также дополнительная информация по каждому из них.

name : cbc(aes)
driver : cbc(aes-generic)
module : kernel
priority : 100
refcnt : 1
selftest : passed
internal : no
type : blkcipher
blocksize : 16
min keysize : 16
max keysize : 32
ivsize : 16
geniv : <default>

/proc/devices

Здесь отображаются различные блочные и символические устройства подключенные к системе. Кроме тех, для которых не загружены модули ядра. Устройства разделены на символические и блочные. У символических устройств нет буфера и они отправляют ядру данные определенного размера. Блочные устройства имеют буфер для данных и предназначены для сохранения информации, например, на жесткие диски.

Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs

/proc/diskstats

Статистика ввода и вывода на блочные устройства, в том числе и жесткие диски.

8 0 sda 411 0 6808 1772 0 0 0 0 0 512 1772
8 1 sda1 102 0 1696 804 0 0 0 0 0 444 804
8 2 sda2 96 0 1648 488 0 0 0 0 0 344 488
8 3 sda3 122 0 1856 432 0 0 0 0 0 312 432

Первые две цифры - номер устройства, дальше название. Четвертая цифра - количество удачных чтений с диска, количество объединенных чтений, секторов прочитано, время чтения в миллисекундах, удачные записи, объединенные записи, секторов записано,  время записи в миллисекундах, текущие операции ввода и вывода, текущее время работы и общее время операций ввода и вывода.

/proc/fb

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

0 nouveaufb

Также здесь может быть указан драйвер Nvidia или catalyst если вы использовали проприетарный драйвер. Это один из способов посмотреть какой драйвер видеокарты используется.

/proc/filesystems

Здесь содержится список файловых систем, которые на данный момент поддерживаются ядром. Например:

nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
ext3
ext4

nodev значит, что это файловая система специального назначения и она не используется для хранения данных на носителях.

/proc/interrupts

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

CPU0 CPU1
0: 45 0 IO-APIC-edge timer
1: 0 2 IO-APIC-edge i8042
7: 2 0 IO-APIC-edge parport0
8: 0 1 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
12: 1 4 IO-APIC-edge i8042

/proc/iomem

В этом файле содержится текущая карта памяти для всех программ и ядра Linux. Эта информация может быть полезной программистам.

00000000-00000fff : reserved
00001000-0009ebff : System RAM
0009ec00-0009ffff : reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000d0000-000dffff : PCI Bus 0000:00
000e4000-000fffff : reserved
000f0000-000fffff : System ROM
00100000-cfe8ffff : System RAM
01000000-0166a9ea : Kernel code
0166a9eb-01f0f67f : Kernel data
0209e000-02219fff : Kernel bss

/proc/ioports

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

0000-0cf7 : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0061-0061 : PNP0800:00
0064-0064 : keyboard
0070-0071 : rtc0

/proc/kallsyms

Содержимое этого файла вряд-ли понадобится обычному пользователю. Здесь собраны все доступные функции и их адреса, которые могут быть использованы из модулей ядра.

/proc/kcore

Это все содержимое вашей оперативной памяти представленное в одном файле. В отличии от других файлов у этого есть размер - объем вашей ОЗУ плюс 4 килобайта. Для доступа к нему нужны права суперпользователя. Не нужно открывать этот файл для чтения, у вас ничего не выйдет. Перед тем как с ним работать скопируйте файл в другую папку, а уже потом делайте что нужно, например вы можете попытаться найти определенный фрагмент текста из памяти браузера.

/proc/kmsg

Вы, наверное, уже пользовались утилитой dmesg для просмотра сообщений ядра. Так вот, эти сообщения накапливаются и сохраняются в этом файле. Для доступа к нему тоже нужны права root.

/proc/kpagecount

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

/proc/loadavg

Здесь вы можете оценить среднюю нагрузку на систему. Например:

2.58 2.53 1.74 2/569 20842

Первые три цифры показывают нагрузку на процессор сейчас, пять и пятнадцать минут назад, следующие два столбца показывают количество активных процессов и общее количество запущенных процессов. А последняя цифра - это PID идентификатор последнего процесса.

/proc/locks

Здесь содержится список заблокированных ядром ресурсов. Может содержать много отладочной информации и не несет совсем никакой пользы для обычных пользователей:

1: POSIX  ADVISORY  WRITE 16342 08:16:43386485 1073741825 1073741825
2: POSIX  ADVISORY  READ  16342 08:16:43386485 1073741826 1073742335
3: POSIX  ADVISORY  READ  1686 08:16:43253829 124 124
4: POSIX  ADVISORY  WRITE 16342 08:16:43647306 0 EOF

/proc/meminfo

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

MemTotal: 6109848 kB
MemFree: 2044352 kB
MemAvailable: 2562056 kB
Buffers: 36872 kB
Cached: 742456 kB
SwapCached: 740888 kB
Active: 2187724 kB

/proc/misc

В этом файле перечислены различные драйверы, загруженные для подключенных устройств или программ:

55 rfkill
200 tun
56 vboxnetctl
57 vboxdrvu
58 vboxdrv
232 kvm
59 memory_bandwidth

/proc/modules

Тоже довольно известный файл. Здесь содержится список всех загруженных модулей ядра. Ту же самую информацию мы можем увидеть выполнив lsmod. Но этой утилите тоже информацию предоставляет структура proc.

/proc/mounts

В этом файле перечислены все точки монтирования и все подключенные файловые системы:

sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=3016160k,nr_inodes=754040,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0

То же самое можно увидеть выполнив mount -a.

/proc/partitions

В этом файле отображены все подключенные к системе разделы жестких дисков или других запоминающих устройств:

major minor #blocks name

8 0 488386584 sda
8 1 62914560 sda1
8 2 148064256 sda2
8 3 277406720 sda3
8 16 976762584 sdb

/proc/stat

В этом файле содержится различная статистическая информация о системе. Такая, как частота процессора, количество тактов, количество сброшенных страниц памяти на диск, количество системных прерываний, время загрузки и т д.

/proc/swaps

Здесь находится информация о пространстве подкачки. Подключенные разделы, файлы, а также их размер, приоритет и состояние:

Filename Type Size Used Priority
/dev/sdb2 partition 8388604 0 -1

/proc/sysrq-trigger

Это еще один файл, выделяющийся из большинства других. Он доступен для записи и используется для управления передачи ядру специальных SysRq команд, о которых мы уже говорили в статье перезагрузка компьютера в Linux. Вы можете записывать коды команд с помощью echo или любого текстового редактора.

/proc/uptime

Здесь отображается сколько времени прошло после запуска компьютера. Первое число означает общее количество секунд после запуска компьютера, а второе время в режиме ожидания:

/proc/version

Это еще один способ узнать точную версию ядра, компилятора, и в некоторых случаях, даже дистрибутива:

Linux version 4.1.21-14-default (geeko@buildhost) (gcc version 4.8.5 (SUSE Linux) ) #1 SMP PREEMPT Sun Apr 17 07:27:45 UTC 2016 (fc187c1)

/proc/vmstat

И снова информация об оперативной памяти. На этот раз информация о виртуальной памяти и ее использовании в системе.

/proc/zoneinfo

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

/proc/PID/

Файловая система proc состоит не только из файлов, но здесь есть и папки. Больше всего здесь папок с номерами вместо имен. Каждый этот номер означает PID процесса, а эта папка содержит информацию о каждом запущенном в системе процессе. Когда процесс заканчивается, его каталог исчезает из системы. Если открыть любой из этих каталогов в нем есть такие файлы:

ttr cpuset fdinfo mountstats stat
auxv cwd loginuid oom_adj statm
clear_refs environ maps oom_score status
cmdline exe mem root task
coredump_filter fd mounts smaps wchan

Мы не будем рассматривать все, давайте рассмотрим только основные файлы:

  • cmdline - содержит команду с помощью которой был запущен процесс, а также переданные ей параметры
  • cwd - символическая ссылка на текущую рабочую директорию процесса
  • exe - ссылка на исполняемый файл
  • root - ссылка на папку суперпользователя
  • environ - переменные окружения, доступные для процесса
  • fd - содержит файловые дескрипторы, файлы и устройства, которые использует процесс
  • maps, statm, и mem - информация о памяти процесса
  • stat, status - состояние процесса

С помощью этих файлов вы можете составлять различные скрипты. Например если вы хотите уничтожить все  зомби процессы, то вы можете сканировать все директории на наличие Z в файле status. Так же само можно проверить запущена ли нужная вам программа просмотрев все cmdline.

/proc/sys/

Эта папка в proc linux не только предоставляет информацию о системе, но и позволяет изменять различные параметры ядра на лету, а также включать дополнительные функции.

Чтобы посмотреть можно ли записывать в файлы используйте команду:

ls -ld /proc/sys/

Если у файла есть флаг W, значит в него можно записывать данные. Давайте рассмотрим основные подкаталоги в этой папке:

  • debug - содержит отладочную информацию, она будет вам полезна если вы разработчик ядра
  • dev - параметры различных устройств, подключенных к системе
  • fs - вся информация о файловой системе
  • kernel - позволяет напрямую настраивать ядро
  • net - настройка разных параметров сети
  • vm - взаимодействие с подсистемой vm

Это еще не все что можно сделать с помощью этого каталога подробнее настройка ядра linux будет рассмотрена в одной из следующих статей.

Выводы

Файловая система proc содержит наиболее полную и подробную информацию о внутреннем устройстве и работе операционной системе Linux и позволяет вам точно настроить многие параметры своей работы. Если потратить немного времени на изучение всех тонкостей этой подсистемы, вы получите более совершенную систему Linux. Разве это не то чего мы все хотим?

Один комментарий

  1. zargbell Июнь 19, 2016 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: