Одна из особенностей Linux систем — наличие специальной «виртуальной» файловой системы proc. Точкой монтирования для этой системы всегда выступает каталог /proc.
В операционной системе FreeBSD, из соображений совместимости с некоторыми Linux-пакетами иногда используется аналог файловой системы proc, который называется linprocfs. Вот как он выглядит в файле /etc/fstab:
linproc /compat/linux/proc linprocfs rw 0 0
А вот так — в обычной Linux-системе:
proc /proc proc defaults 0 0
Почему эта файловая система виртуальная? Главное её отличие от обычных систем — отсутствие физического устройства (жесткого диска) для её размещения. Второе отличие — эта файловая система и всё её содержимое создаётся и управляется непосредственно ядром операционной системы. Любые действия в такой системе не приводят к изменениям на жестком диске — после выключения питания сервера вся информация, содержащаяся в такой файловой системе будет утеряна — как и вся другая информация в оперативной памяти машины.
Кратко говоря — все файлы в этой системе (и её каталоге /proc) не записываются на жесткий диск, а создаются и изменяются «на лету» непосредственно ядром системы в памяти сервера.
В целом, хотя так и говорят, но называть proc(fs) виртуальной файловой системой — не совсем корректно, так как имеется «настоящая» виртуальная система — VFS.
А файловую систему proc более правильно её называть «псевдо-файловой системой«.
Назначение файловой системы proc
Очень точно её назначение можно описать такими словами:
«Использование подобной псевдо-файловой системы является прямым следованием всей UNIX-философии — «Всё сущее является файлами».
Суть для пользователя или администратора заключается в том, что в любое время без использования каких-либо дополнительных утилит он может получить необходимую информацию о текущем состоянии системы — размер и использование памяти, в том числе виртуальной, нагрузке процессора и его ядер, запущенные процессы и так далее.
Именно из этого каталога берут информацию такие утилиты мониторинга сервера как top, netstat, ps и другие.
Для примера — возьмём вывод команды ps -aux и какого-либо процесса:
# ps -ef | less
UID PID PPID C STIME TTY TIME CMD
…
setevoy 16204 16186 0 13:09 pts/0 00:00:00 screen
…
Пусть это будет в данном случае пользовательский процесс screen, который был запущен пользователем setevoy.
Каждый процесс имеет свой PID. О том, что такое PID немного подробнее можно прочитать в F.A.Q. — Что такое PID, PPID?
Для каждого PID создаётся отдельная директория в каталоге /proc, который является точкой монтирования виртуальной файловой системы proc.
Процесс screen имеет PID 16204, а PPID (Parent Process ID) — 16186. Посмотрим содержимое каталога /proc/16204:
# ls /proc/16204
attr cgroup coredump_filter environ fdinfo loginuid mountinfo net oom_score_adj root sessionid stat syscall
autogroup clear_refs cpuset exe io maps mounts oom_adj pagemap sched smaps statm task
auxv cmdline cwd fd limits mem mountstats oom_score personality schedstat stack status wchan
К примеру, файл cmdline содержит информацию о команде, запустившей данный процесс:
# cat /proc/16204/cmdline
screen
Файл environ содержит всю информацию о рабочем окружении процесса.
Файл status — информацию о PID, GID, использовании памяти и процессора этим процессом и другую полезную информацию:
# cat status
Name: screen
State: S (sleeping)
Tgid: 16204
Pid: 16204
PPid: 16186
TracerPid: 0
Uid: 500 500 500 500
Gid: 500 500 84 500
Utrace: 0
FDSize: 256
Groups: 500
VmPeak: 5344 kB
VmSize: 5328 kB
VmLck: 0 kB
VmHWM: 972 kB
VmRSS: 972 kB
VmData: 396 kB
VmStk: 88 kB
VmExe: 352 kB
VmLib: 2332 kB
VmPTE: 48 kB
VmSwap: 0 kB
Threads: 1
…
Очень важным является файл /proc/modules, который содержит информацию обо всех загруженных в настоящий момент модулях ядра.
Краткое описание других файлов:
- cpuinfo — информация о Центральном процессоре (CPU), известные баги, флаги и пр.;
- dma — информация о доступных каналах DMA и драйверах, использующих их;
- filesystems — краткая информация о файловых системах, поддерживаемых ядром;
- interrupts — краткий список всех IRQ, данные о количестве прерываний, поступивших по каждому из них и драйверы, обслуживающие эти IRQ;
- iomem — карта памяти;
- ioports — карта портов ввода-вывода.
- kcore — полный дамп памяти. Не пытайтесь копировать это файл, это может подвесить вашу систему. Используется в целях отладки;
- kmsg — сообщения, переданные ядром, не может и не должен читаться пользователями, поскольку содержит жизненно важную информацию. В основном используется в отладочных целях;
- ksyms — таблица символов ядра, которая используется, в основном, для отладки;
- loadavg — содержит величину средней нагрузки за последние 1, 5 и 15 минут;
- meminfo — информация об использовании памяти;
- mounts — ссылка на другой файл в файловой системе /proc, который содержит информацию обо всех смонтированных файловых системах;
- partitions — информация обо всех разделах на всех устройствах в системе;
- pci — информация обо всех PCI устройствах в системе, включая AGP и встроенные устройства, подключенные к шине PCI;
- swaps — информация о всех смонтированных swap-разделах;
- uptime — uptime системы — время в секундах, прошедшее с момента последней перезагрузки;
- version — версия ядра, включая дату сборки и версию компилятора.
В каталоге каждого процесса имеются так же несколько символических ссылок, например:
lrwxrwxrwx. 1 root root 0 Mar 7 13:58 cwd -> /home/setevoy
cwd ссылается на текущий рабочий каталог процесса;
lrwxrwxrwx. 1 root root 0 Mar 7 13:58 exe -> /usr/bin/screen
exe — симлинк на исполняемый файл процесса (программы);
lrwxrwxrwx. 1 root root 0 Mar 7 13:58 root -> /
root — указывает на корневой раздел (как правило — /)
Кроме того, в каталоге /proc ядро хранит информацию обо всем hardware-оборудовании машины.
Каталог /proc/bus содержит каталог с информациях о всех устройствах типа PCI, PCCard, USB. Информация о сети хранится в каталоге /proc/net. Жесткие диски описаны в /proc/ide и /proc/scsi. Каталог /procs/devices содержит список всех устройств системы (они разделены на две категории: «block» — блочные, «character» — символьные).
Некоторые файлы в каталоге /proc можно изменять, таким образом меняя настройки и поведения ядра. Однако, хотя просмотр файлов в этом каталоге безопасен — редактирование файлов без полной уверенности в своих действиях может привести к проблемам. Доступные для редактирования файлы как правило находятся в каталоге /proc/sys, и редактируются они с помощью специального интерфейса работы с ядром — sysctl.