original in en Sandeep Grover
en to ru Pukhlyakov Kirill
Sandeep Grover работает в Magma Design Automation, India -- быстроразвивающейся EDA (Electronic Design Automation) компании. В свободное время занимается изучением устройства ОС Linux и надеется в будущем поучаствовать в разработке ядра этой операционной системы!
Ядро Linux предоставляет механизм доступа к своим внутренним структурам и позволяет изменять установки ядра во время работы ОС посредством системы /proc. Мы рассмотрим в заметке эту систему касательно архитектуры Intel x86, но основные принципы применимы к ОС Linux на любой платформе.
Файловая система /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 еще не подмонтирована - Вы можете сделать это следующим
образом:
mount -t proc proc /proc
Более детальную информацию Вы получите прочитав man mount.С помощью файлов в /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 служит также источником информации о выполняющихся процессах. Если Вы внимательно посмотрите внутрь каталога /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/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/. Повторюсь, невозможно в заметке рассмотреть все файлы, думаю Вам самим будет интересно повнимательней посмотреть на эти каталоги.
$ 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.