Изучаем файловую систему proc
Sandeep Grover
Перевод
Pukhlyakov Kirill
linuxfocus.org, оригинал
Ядро Linux предоставляет механизм доступа к своим внутренним структурам и
позволяет изменять установки ядра во время работы ОС посредством системы /proc.
Мы рассмотрим в заметке эту систему касательно архитектуры Intel x86, но
основные принципы применимы к ОС Linux на любой платформе.
Содержание:
Виртуальная файловая система /proc
Файловая система /proc является механизмом для ядра и его модулей,
позволяющим посылать информацию процессам ( отсюда и название /proc ).
С помощью этой виртуальной файловой системы Вы можете работать с внутренними
структурами ядра, получать полезную информацию о процессах и изменять
установки ( меняя параметры ядра ) на лету. Файловая система /proc располагается
в памяти в отличие от других файловых систем, которые располагаются на диске.
Если Вы посмотрите на файл /proc/mounts ( он выводит список всех подмонтированных
файловых систем подобно команде "moount" ) то увидите что-нибудь типа :
grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc контролируется ядром. Из-за того, что она предоставляет информацию
контролируемую ядром, логично, что она располагается в памяти, контролируемой также
ядром. Команда "ls -l" покажет, что большинство файлов в этой системе
имеют нулевую длину, но посмотрев любой файл Вы получите достаточно информации.
Как это может быть? Все просто - файловая система /proc как любая другая
файловая система регистрируется на уровне VFS ( Virtual File System layer ).
Поэтому при запросе файлов/каталогов, файловая система /proc создает эти
файлы/каталоги на основании информации, содержащейся в ядре.
Монтирование файловой системы /proc
Если /proc еще не подмонтирована - Вы можете сделать это следующим
образом:
mount -t proc proc /proc
Более детальную информацию Вы получите, прочитав man mount.
Просмотр файлов /proc
С помощью файлов в /proc Вы можете получить информацию о состоянии ядра,
процессов, параметрах компьютера и т.д. Большинство файлов в /proc содержат
самую свежую информацию о системном оборудовании. Несмотря на то, что эти
файлы виртуальные - их можно просмотреть любым текстовым редактором или
с помощью команд "more", "less" или "cat".
При попытке открытия виртуального файла текстовым редактором - этот
файл создается на лету на основе информации, содержащейся в ядре. Приведу
здесь некоторые интересные цифры о моей системе:
$ ls -l /proc/cpuinfo -r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo
$ file /proc/cpuinfo
/proc/cpuinfo: empty
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 6
cpu MHz : 1000.119
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
sep_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips : 1998.85
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 6
cpu MHz : 1000.119
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
sep_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips : 1992.29
Это двухпроцессорная система. В некоторых файлах файловой системы /proc
информация закодирована, однако некоторые утилиты приспособлены к этому -
они выводят ее в виде понятном человеку. К этим утилитам относятся:
"top", "ps", "apm" и т.д.
Полезная информация о системе и ядре
Перечислим некоторые важные файлы:
- /proc/cpuinfo - информация о процессоре ( модель, семейство, размер кэша и т.д.)
- /proc/meminfo - информация о RAM, размере свопа и т.д.
- /proc/mounts - список подмонтированных файловых систем.
- /proc/devices - список устройств.
- /proc/filesystems - поддерживаемые файловые системы.
- /proc/modules - список загружаемых модулей.
- /proc/version - версия ядра.
- /proc/cmdline - список параметров, передаваемых ядру при загрузке.
На самом деле файлов в каталоге /proc намного больше. Вы можете детально просмотреть
все файлы в /proc командами "more" и read [1]. Советую Вам использовать
"more" вместо "cat" потому, что некоторые файлы ( например kcore )
могут быть очень большого размера.
Информация о процессах
Файловая система /proc служит также источником информации о выполняющихся процессах.
Если Вы внимательно посмотрите внутрь каталога /proc, то увидите каталоги, названия
которых состоят из цифр - это и есть информация о процессах - название каталога
отражает идентификатор процесса ( PID ). Внутри этих каталогов находятся файлы,
содержащие важную информацию о процессах - состояние, окружение и т.д. Давайте
посмотрим на какой-нибудь процесс:
$ ps -aef | grep mozilla
root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla
Выполненная нами команда показывает, что в системе присутствует процесс mozilla,
его PID 32558. Соответственно в каталоге /proc должен быть каталог с названием 32558.
$ ls -l /proc/32558
total 0
-r--r--r-- 1 root root 0 Dec 25 22:59 cmdline
-r--r--r-- 1 root root 0 Dec 25 22:59 cpu
lrwxrwxrwx 1 root root 0 Dec 25 22:59 cwd -> /proc/
-r-------- 1 root root 0 Dec 25 22:59 environ
lrwxrwxrwx 1 root root 0 Dec 25 22:59 exe -> /usr/bin/mozilla*
dr-x------ 2 root root 0 Dec 25 22:59 fd/
-r--r--r-- 1 root root 0 Dec 25 22:59 maps
-rw------- 1 root root 0 Dec 25 22:59 mem
-r--r--r-- 1 root root 0 Dec 25 22:59 mounts
lrwxrwxrwx 1 root root 0 Dec 25 22:59 root -> //
-r--r--r-- 1 root root 0 Dec 25 22:59 stat
-r--r--r-- 1 root root 0 Dec 25 22:59 statm
-r--r--r-- 1 root root 0 Dec 25 22:59 status
В файле "cmdline" содержится информация, которой был запущен процесс.
В файле "environ" находятся переменные окружения этого процесса, а также
идентификатор пользователя ( UID ) и группы ( GID ) запустившего процесс,
идентификатор родительского процесса ( PPID ) и текущее состояние процесса
( например "Sleeping" или "Running" ). Также в подобных
каталогах находятся символические ссылки: "cwd" - ссылка к текущему
рабочему каталогу процесса, "exe" - исполняемый файл процесса,
"root" - ссылка к каталогу, который считается процессом корневым ( обычно
это "/" ). В каталоге "fd" находятся ссылки к используемым
дескрипторам файлов процессом. "cpu" доступен только на SMP ядрах Linux.
/proc/self интересный подкаталог - с его помощью приложение найдет
информацию о себе. На самом деле /proc/self является символической ссылкой на каталог
процесса обращающегося к /proc.
Работа с ядром посредством /proc
Большинство из рассмотренных нами файлов из каталога /proc доступны только на чтение.
Тем не менее файловая система /proc предоставляет файлы для взаимодействия с ядром
доступные на запись. Помещение информации в такие файлы изменяет состояние ядра и
поэтому это надо делать очень аккуратно. Эти файлы находятся в каталоге /proc/sys.
В каталоге /proc/sys/kernel находится информация общего плана для ядра.
Соответственно в /proc/sys/kernel/{domainname, hostname} находится информация
о доменном имени и host имени, которую Вы можете изменить.
$ hostname
machinename.domainname.com
$ cat /proc/sys/kernel/domainname
domainname.com
$ cat /proc/sys/kernel/hostname
machinename
$ echo "new-machinename" > /proc/sys/kernel/hostname
$ hostname
new-machinename.domainname.com
Таким образом изменив файл в файловой системе /proc мы можем поменять hostname.
Много данных для настройки находится в /proc/sys/kernel/. Повторюсь, невозможно
в заметке рассмотреть все файлы, думаю Вам самим будет интересно повнимательней
посмотреть на эти каталоги.
Еще один интересный каталог
/proc/sys/net. В нем Вы можете произвести
сетевые настройки, например спрятать Ваш компьютер в сети.
$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Запретив ответы на icmp_echos мы спрятали компьютер. Наша машина не будет отвечать
на команды "ping" других компьютеров.
$ ping machinename.domainname.com
no answer from machinename.domainname.com
Вернуть прежнее состояние можно следующим образом
$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
В каталоге /proc/sys еще много возможностей для настройки системы. Более подробная
информация находится в [1] и [2].
Вывод
Файловая система /proc обеспечивает файловый интерфейс к внутренним структурам Linux.
С ее помощью можно узнать полезную информацию и настроить систему. Знание этой
файловой системы и умение применить эти знания - большой плюс в работе с ОС Linux.
Список литературы
- [1] Документация по файловой системе ОС Linux находится здесь:
/usr/src/linux/Documentation/filesystems/proc.txt
- [2] Руководство пользователя RedHat: Файловая система /proc:
http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.html