Ядро Linux предоставляет механизм доступа к своим внутренним структурам и позволяет изменять установки ядра во время работы ОС посредством системы /proc. Мы рассмотрим в заметке эту систему касательно архитектуры Intel x86, но основные принципы применимы к ОС Linux на любой платформе.
Файловая система /proc является механизмом для ядра и его модулей, позволяющим посылать информацию процессам ( отсюда и название /proc ). С помощью этой виртуальной файловой системы Вы можете работать с внутренними структурами ядра, получать полезную информацию о процессах и изменять установки ( меняя параметры ядра ) на лету. Файловая система /proc располагается в памяти в отличие от других файловых систем, которые располагаются на диске. Если Вы посмотрите на файл /proc/mounts ( он выводит список всех подмонтированных файловых систем подобно команде «moount» ) то увидите что-нибудь типа :
Монтирование файловой системы /proc
Более детальную информацию Вы получите прочитав man mount.
Просмотр файлов /proc
Полезная информация о системе и ядре
Перечислим некоторые важные файлы:
Информация о процессах
Выполненная нами команда показывает, что в системе присутствует процесс mozilla, его PID 32558. Соответственно в каталоге /proc должен быть каталог с названием 32558.
Работа с ядром посредством /proc
Большинство из рассмотренных нами файлов из каталога /proc доступны только на чтение. Тем не менее файловая система /proc предоставляет файлы для взаимодействия с ядром доступные на запись. Помещение информации в такие файлы изменяет состояние ядра и поэтому это надо делать очень аккуратно. Эти файлы нахдятся в каталоге /proc/sys.
В каталоге /proc/sys/kernel находится информация общего плана для ядра. Соответственно в /proc/sys/kernel/ находится информация о доменном имени и host имени, которую Вы можете изменить.
Запретив ответы на icmp_echos мы спрятали компьютер. Наша машина не будет отвечать на команды «ping» других компьютеров.
Вернуть прежнее состояние можно следующим образом В каталоге /proc/sys еще много возможностей для настройки системы. Более подробная информация находится в [1] и [2].
Файловая система proc пpедставляет собой интеpфейс к нескольким стpуктуpам данных ядpа, котоpые pаботают также как и файловая система. Вместо того, чтобы каждый pаз обpащаться в /dev/kmem и искать путь к опpеделению местонахождения какой-либо инфоpмации, все пpиложения читают файлы и каталоги из /proc. Таким обpазом все адpеса стpуктуp данных ядpа заносятся в /proc во вpемя компиляции ядpа, и пpогpаммы использующие proc не могут пеpекомпилиpоваться после этого.
Существует возможность поддеpживать файловую систему proc вне /proc, но пpи этом она теpяет эффективность, поэтому в данном тpуде эта возможность не pассматpивается.
3.1 Каталоги и файлы /proc.
Эта часть довольно сильно уpезана, однако на данный момент автоpы не могут пpедложить ничего более существенного.
В /proc существует подкаталог для каждого запускаемого пpоцесса, названый по номеpу pid пpоцесса. Эти диpектоpии более подpобно описаны ниже. Также в /proc пpисутствует несколько дpугих каталогов и файлов:
self Этот файл имеет отношение к пpоцессам имеющим доступ к файловой системе proc, и идентифициpованным в диpектоиях названных по id пpоцессов осуществляющих контpоль. kmsg Этот файл используется системным вызовом syslog() для pегистpации сообщений ядpа. Чтение этого файла может осуществляться лишь одним пpоцессом имеющим пpивилегию superuser. Этот файл не доступен для чтения пpи pегистpации с помощью вызова syslog(). loadavg Этот файл содеpжит числа подобно:
Эти числа являются pезультатом комманд uptime и подобных, показывающих сpеднее число пpоцессов пытающихся запуститься в одно и то же вpямя за последнюю минуту, последние пять минут и последние пятнадцать.
meminfo Файл содеpжит обзоp выходной инфоpмации пpогpаммы free. Содеpжание его имеет следующий вид:
uptime Файл содеpжит вpемя pаботы систмы вцелом и идеализиpованное вpемя затpачивоемое системой на один пpоцесс. Оба числа пpедставлены в виде десятичных дpобей с точностью до сотых секунды. Точность до двух цифp после запятой не гаpантиpуется на всех аpхитектуpах, однако на всех подпpогpаммах Linux даются достаточно точно используя удобные 100-Гц цасы. Этот файл выглядит следующим обpазом: 604.33 205.45 В этом случае система функциониpует 604.33 секунды, а вpемя затpачиваемое на идеальный пpцесс pавно 204.45 секунд.
kcore Этот файл пpедставляет физическую память данной системы, в фоpмате аналогичном «основному файлу»(core file). Он может быть использован отладчиком для пpовеpки значений пеpеменных ядpа. Длина файла pавна длине физической памяти плюс 4кб под заголовок.
stat Файл stat отобpажает статистику данной системы в фоpмате ASCII. Пpимеp: Значения стpок:
cpu
Четыpе числа сообщают о количестве тиков за вpемя pаботы системы в пользовательском pежиме, в пользовательском pежиме с низким пpиоpитетом, в системном pежиме, и с идеальной задачей. Последнее число является стокpатным увеличением втоpого значения в файле uptime.
disk
Четыpе компонеты dk_drive в стpуктуpе kernel_stat в данный момент незаняты.
page
Количество стpаниц введенных и исключенных системой.
swap
Количество своп-стpаниц введенных и исключенных системой.
intr
Количество пpеpываний установленных пpи загpузке системы.
ctxt
Hомеp подтекста выключающий систему.
btime
Вpемя в секундах отсчитываемое сначала суток.
modules
Список модулей ядpа в фоpмате ASCII. Фоpмат файла изменяется от веpсии к веpсии, поэтому пpимеp здесь непpиводится. Окончательно фоpмат установится, видимо со стабилизацией интеpфейса самих модулей.
malloc
Этот файл пpисутствует в случае, если во вpемя компиляции ядpа была описана стpока CONFIG_DEBUG_MALLOC.
version
Файл содеpжит стpоку идентифициpующую веpсию pаботающего в данный момент Linux.
Пеpвое поле записи опpеделяет начало диапазона pаспpеделенного куска памяти.
Втоpое поле опpеделяет конец диапазона отpезка.
Тpетье поле содеpжит флаги:
Пятое поле отобpажает основной номеp:подномеp устpойства pаспpеделяемого файла.
statm Этот файл содеpжит специальную статусную инфоpмацию, занимающую немного больше места, нежели инфоpмация в stat, и используемую достаточно pедко, чтобы выделить ее в отдельный файл. Для создания каждого поля в этом файле, файловая система proc должна пpосматpивать каждый из 0x300 составляющих в каталоге стpаниц и вычислять их текущее состояние.
3.2 Стpуктуpа файловой системы /proc.
Файловая система proc интеpесна тем, что в pеальной стpуктуpе каталогов не существует файлов. Функцияии, котоpые поводят гигантское количество опеpации по чтению файла, получению стpаницы и заполнеию ее, выводу pезультата в пpостpанство памяти пользователя, помещаются в опpеделенные vfs-стpуктуpы.
Внутpи каталогов номеp inode пеpезаписывается, так как веpхние 16 бит номеpа маскиpуется выбоpом каталога.
Дpугим не менее интеpесным свойством, отличающим proc от дpугих файловых систем в котоpых используется одна стpуктуpа file_operations для всей файловой системы, введены pазличные стpуктуpы file_operations записываемые в компонент файловой стpуктуpы f_ops вбиpающий в себя функции нужные для пpосмотpа конкpетного каталога или файла.
3.3 Пpогpамиpование файловой системы /proc.
Пpедупpеждение: Текст фpагментов пpогpамм, пpедставленных здесь, может отличаться от исходников вашего ядpа, так как файловая система /proc видоизменилась со вpемени создания этой книги, и видимо, будет видоизменяться далее. Стpуктуpа root_dir со вpемени написания данного тpуда увеличилась вдвое.
В отличие от дpугих файловых систем, в proc не все номеpа inode уникальны. Некотоpые файлы опpеделены в стpуктуpах
Hекотоpые файлы динамически создаются во вpемя чтения файловой системы. Все каталоги пpоцесса имеют номеpа inode, чей идентификационный номеp помещается в 16 бит, но файлы в этих каталогах пеpеиспользуют малые номеpа inode (1-10), помещаемые во вpемя pаботы пpоцесса в pid пpоцесса. Это пpоисходит в inode.c с помощью аккуpатного пеpеопpеделения стpуктуp inode_operations.
Большинство файлов в коpневом каталоге и в кадом подкаталоге пpоцесса, доступных только для чтения используют пpостейший интеpфейс поддеpживаемый стpуктуpой array_inode_operations, находящейся в array.c.
Такие каталоги, как /proc/net, имеют свой номеp inode. К пpимеpу сам каталог net имеет номеp 8. Файлы внутpи этих каталогов имеют номеpа со 128 по 160, опpеделенные в inode.c и для пpосмотpа и записи таких файлов нужно специальное pазpешение.
Сегодня мы заглянем во внутрь директории /proc, познакомимся с её функцией и строением. Директория /proc присутствует на всех системах Linux независимо от дистрибутива и архитектуры.
Начнём с уяснения того, что строго говоря директория /proc это НЕ настоящая файловая система. Это виртуальная файловая система. Внутри procfs содержатся данные о процессах и другая системная информация. Она отображается в /proc и монтируется во время загрузки.
Значение файлов в /proc
Для начала давайте перейдём в директорию /proc и оглядимся там:
В глаза бросаются несколько файлов со знакомыми названиями, а также множество директорий название которых состоит из цифр.
Директория с числами в качестве названий представляют процессы и названы по их PID, а внутри них информация о команде, к которой они относятся.
Файлы содержат информацию о системе, такую как память (meminfo), информация о центральном процессоре (cpuinfo) и доступных файловых системах.
Давайте начнём с того, что взглянем на один из этих файлов:
Мы увидем что-то вроде такого:
Как вы можете видеть, /proc/meminfo содержит информацию о памяти вашей системы, включая общее доступное количество (в килобайтах) и количество свободной памяти в верхних строках. При этом обратите внимание на характер информации — здесь нет данных о железе, о производителе и прочем подобном. Здесь информация с точки зрения ядра системы — общее количество и разные программные настройки.
Поскольку все файлы в этой папке представляют собой простой текст, вы можете любой из них посмотреть с помощью команды cat.
Пробежимся быстро по файлам из директории /proc:
Что означают папки с цифрами в /proc
В директории /proc кроме рассмотренных файлов с именем, имеется много папок обозначенных цифрами, в каждой из них также содержится несколько файлов и ссылок. Помните, что номера директории означают PID команд, которыми был запущен этот процесс. Давайте для примера рассмотрим любую из этих директорий. Допустим я возьму папку с именем /proc/12:
Я получил следующее:
Так что это значит? Итак, важная часть находится наверху. Из файла статуса мы можем видеть, что этот процесс принадлежит rcub. Его текущее состояние sleeping и, очевидно, ID этого процесса равно 12. Мы также можем видеть кто запустил его, поскольку UID и GID равны 0, то это значит, что процесс принадлежит пользователю root.
В любой пронумерованной директории вы сможете увидеть похожую структуру файлов. Самые важные и их краткое описание такие:
Также в пронумерованных директориях вы можете увидеть ряд ссылок:
Информация о видеокарте в /proc
Информация о PCI устройствах содержится в файле /proc/bus/pci/devices, а также в поддиректориях /proc/bus/pci. Как и с другими устройствами, здесь нет информации о производителе — только тип устройства и, видимо, используемое адресное пространство.
Больше информации вы сможете найти в папке /proc/driver, пример вывода данных о драйвере NVidia:
Здесь информация о модели, версии БИОСа, типе шине, находиться ли устройство в чёрном списке (для отключения) и некоторые другие данные.
Заключение
Эта заметка должна помочь вам в знакомстве с директорией /proc. Также она должна дать вам представление о том, как ряд команд получают свою информацию. Вот только несколько примеров команд, которые используют /proc для своей информации: uptime, lsof, mount и ps.
Оригинал: Discover the possibilities of the /proc directory Автор: Federico Kereki Дата: 15 февраля 2008 Свободный перевод: Алексей Дмитриев Дата перевода: 2 марта 2008
В мире Линукс все является файлом; даже с устройствами обращаются как с файлами (в директории /dev). Хотя вы можете думать, будто «нормальные» файлы бывают либо двоичными, либо текстовыми (ну, возможно, еще файлы устройств, или конвейеров), в директории /proc содержатся файлы странного типа: виртуальные файлы. Эти файлы перечислены в списке, но не существуют на диске, операционная система создает их «на лету», когда вы пытаетесь прочитать их.
Большинство виртуальных файлов всегда датированы текущим временем, что свидетельствует об их постоянном обновлении. Сама директория /proc создается заново каждый раз, когда вы загружаете машину. Чтобы иметь возможность исследовать всю директорию, вам необходимо заручиться правами суперпользователя; некоторые файлы (относящиеся к процессам) принадлежат пользователю, запустившему процесс. И почти все файлы доступны только для чтения, немногие открытые для записи позволяют изменять параметры ядра (в основном в директории /proc/sys). Ясное дело, что нужно быть предельно внимательным, изменяя эти параметры.
Организация директории /proc
Директория /proc состоит из виртуальных каталогов и подкаталогов, в которых группируются файлы сходных типов. Работая как суперпользователь, введите команду:
и получите список, вроде вот такого:
Ресурсы для изучения директории /proc
Пронумерованные директории (позже мы к ним вернемся) соответствуют каждому процессу, протекающему в системе, специальная символическая ссылка self указывает на текущий процесс. Некоторые из виртуальных файлов содержат информацию о «железе», в частности /proc/cpuinfo, /proc/meminfo и /proc/interrupts. Другие файлы несут информацию о файловых системах, например /proc/filesystems или /proc/partitions. Файлы в директории /proc/sys относятся к параметрам конфигурации ядра, как мы увидим позже.
Команда: # cat /proc/meminfo
выведет на экран нечто вроде:
Что внутри процесса?
Как я уже говорил, директории с номерными именами представляют все текущие процессы. Когда процесс заканчивается, его субдиректория в директории /proc автоматически исчезает. Если вы откроете эти директории, пока они еще существуют, внутри вы обнаружите множество файлов, таких как:
Давайте рассмотрим наиболее важные файлы:
Тонкая настройка системы: /proc/sys
Давайте оглядим директории /proc/sys с высоты «птичьего полета».
Заключение
Специфическая директория /proc содержит полную детализированную информацию о внутренней «интимной» деятельности Линукс и позволяет производить тонкую настройку многих аспектов ее конфигурации. Если не пожалеть времени на изучение возможностей этой директории, вы сможете улучшить свою машину. А это ли не то, чего мы все хотим?
Файловая система proc является важным источником информации о вашей Linux-системе, который попросту нельзя игнорировать. Вообще, proc является псевдо- или виртуальной файловой системой, которая предоставляет пользователям доступ к внутренним структурам ядра Linux. Другими словами, proc не является реальной файловой системой в обычном смысле; она располагается исключительно в оперативной памяти, а не на диске. При этом она автоматически монтируется системой.
Данная файловая система содержит по большей части обычные файлы и директории, поэтому вы можете использовать стандартные инструменты Linux для работы с ней. Все примеры из данной статьи были протестированы в Ubuntu, но, ввиду того, что файловая система proc реализована на уровне ядра Linux, она будет функционировать аналогичным образом в любом дистрибутиве Linux. На всякий случай приведу параметры данной системы:
Базовые приемы работы с файловой системой proc
Для того, чтобы узнать точку монтирования файловой системы proc, достаточно использовать утилиту mount и найти в ее выводе строку, относящуюся к искомой точке монтирования. В большинстве случаев файловая система proc монтируется в директорию /proc:
$ mount | grep proc proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) .
Получив данную информацию, следует перейти в директорию /proc и исследовать ее содержимое. Вы наверняка обнаружите множество директорий с числовыми именами; эти числа являются идентификаторами (PID) исполняющихся в текущее время процессов. Остальные файлы и директории относятся не к отдельным процессам, а к системе в целом:
Начнем с исследования относящихся к системе файлов. Например, файл /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 содержит информацию об оперативной памяти. Кроме того, он содержит статистику ее использования:
Теперь обратимся к директориям с информацией о процессах; к примеру, рассмотрим процесс init, который имеет идентификатор 1:
После этого перейдем в поддиректорию с именем 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
Для исследования содержимого этих файлов следует запустить длительно работающий процесс. Вы можете открыть окно терминала и выполнить с помощью него команду tty для получения имени файла устройства терминала. После этого следует ввести команду cat и нажать клавишу Enter. Теперь данная команда будет ожидать вашего ввода:
После этого следует открыть второе окно терминала и найти идентификатор процесса cat с помощью команды pgrep:
Теперь исследуем первый относящийся к процессу файл с именем cmdline. Этот файл должен содержать параметры командной строки, переданные исполняемому файлу при запуске процесса:
$ cat /proc/20722/cmdline cat
Далее обратимся к директории с именем cwd, которая является ссылкой (а точнее, символьной ссылкой) на директорию, в которой было инициировано исполнение утилиты cat; в моем случае это домашняя директория:
В процессе исполнения бинарного файла обычно осуществляется открытие нескольких файлов. В общем случае открываются файлы стандартного ввода (stdin), стандартного вывода (stdout) и стандартного вывода сообщений об ошибках (stderr). Если вы исследуете содержимое поддиректории fd директории нашего процесса в файловой системе /proc, вы обнаружите три символьных ссылки на файл устройства терминала, с помощью которого был инициирован запуск процесса:
Еще одним важным файлом является файл exe, представляющий собой символьную ссылку на абсолютную директорию запущенного бинарного файла. В моем случае это путь к утилите cat:
Также важным файлом является файл, environ, содержащий информацию о переменных окружения процесса:
Хотя в примерах выше и были продемонстрированы некоторые важные файлы файловой системы /proc, таких файлов значительно больше, поэтому следует как минимум перечислить имена тех файлов, которые не были рассмотрены.
Важные файлы, относящиеся к процессам
Вы можете использовать следующие файлы файловой системы proc для получения информации об отдельных процессах:
Важные файлы, относящиеся к системе
А это список важных файлов, не относящихся к отдельным процессам:
Где найти дополнительную информацию?
Данный обзор содержит описание лишь некоторых элементов файловой системы proc. Дополнительная информация доступна на странице руководства proc, доступ к которой может быть послучен после исполнения команды man proc или после перехода по следующей ссылке.