Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Процессы в Linux

Откройте для себя возможности директории /proc

Оригинал: Discover the possibilities of the /proc directory
Автор: Federico Kereki
Дата: 15 февраля 2008
Свободный перевод: Алексей Дмитриев
Дата перевода: 2 марта 2008

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

В мире Линукс все является файлом; даже с устройствами обращаются как с файлами (в директории /dev). Хотя вы можете думать, будто "нормальные" файлы бывают либо двоичными, либо текстовыми (ну, возможно, еще файлы устройств, или конвейеров), в директории /proc содержатся файлы странного типа: виртуальные файлы. Эти файлы перечислены в списке, но не существуют на диске, операционная система создает их "на лету", когда вы пытаетесь прочитать их.

Большинство виртуальных файлов всегда датированы текущим временем, что свидетельствует об их постоянном обновлении. Сама директория /proc создается заново каждый раз, когда вы загружаете машину. Чтобы иметь возможность исследовать всю директорию, вам необходимо заручиться правами суперпользователя; некоторые файлы (относящиеся к процессам) принадлежат пользователю, запустившему процесс. И почти все файлы доступны только для чтения, немногие открытые для записи позволяют изменять параметры ядра (в основном в директории /proc/sys). Ясное дело, что нужно быть предельно внимательным, изменяя эти параметры.

Организация директории /proc

Директория /proc состоит из виртуальных каталогов и подкаталогов, в которых группируются файлы сходных типов. Работая как суперпользователь, введите команду:

# ls /proc

и получите список, вроде вот такого:

1     2432  3340  3715  3762  5441  815        devices      modules
129   2474  3358  3716  3764  5445  acpi       diskstats    mounts
1290  248   3413  3717  3812  5459  asound     dma          mtrr
133   2486  3435  3718  3813  5479  bus        execdomains  partitions
1420  2489  3439  3728  3814  557   dri        fb           self
165   276   3450  3731  39    5842  driver     filesystems  slabinfo
166   280   36    3733  3973  5854  fs         interrupts   splash
2     2812  3602  3734  4     6     ide        iomem        stat
2267  3     3603  3735  40    6381  irq        ioports      swaps
2268  326   3614  3737  4083  6558  net        kallsyms     sysrq-trigger
2282  327   3696  3739  4868  6561  scsi       kcore        timer_list
2285  3284  3697  3742  4873  6961  sys        keys         timer_stats
2295  329   3700  3744  4878  7206  sysvipc    key-users    uptime
2335  3295  3701  3745  5     7207  tty        kmsg         version
2400  330   3706  3747  5109  7222  buddyinfo  loadavg      vmcore
2401  3318  3709  3749  5112  7225  cmdline    locks        vmstat
2427  3329  3710  3751  541   7244  config.gz  meminfo      zoneinfo
2428  3336  3714  3753  5440  752   cpuinfo    misc

Ресурсы для изучения директории /proc

Поиски документации по файловой системе /proc могут стать утомительным делом, так как она разбросана по всем исходникам ядра. Просматривая директорию /usr/scr/linux/Documentation, я нашел файл proc.txt, который содержит множество информации, к сожалению, несколько устаревшей - последнее обновление было в ноябре 2000 года, когда только вышла версия ядра 2.4.0. Но все равно, бродить по директории проще, чем просматривать исходные файлы на языке Си. Вы можете найти даже больше, чем хотели; например, мне попался файл laptop-mode.txt, длиной почти в 1000 строк, посвященный исключительно единственному файлу /proc/sys/vm/laptop_mode.

Пронумерованные директории (позже мы к ним вернемся) соответствуют каждому процессу, протекающему в системе, специальная символическая ссылка self указывает на текущий процесс. Некоторые из виртуальных файлов содержат информацию о "железе", в частности /proc/cpuinfo, /proc/meminfo и /proc/interrupts. Другие файлы несут информацию о файловых системах, например /proc/filesystems или /proc/partitions. Файлы в директории /proc/sys относятся к параметрам конфигурации ядра, как мы увидим позже.

Команда: # cat /proc/meminfo

выведет на экран нечто вроде:

# cat /proc/meminfo
MemTotal:       483488 kB
MemFree:          9348 kB
Buffers:          6796 kB
Cached:         168292 kB
...несколько строк пропущено...

Если вы попробуете ввести команды top или free, вы, без сомнения, встретите знакомые номера процессов. Собственно говоря, многие хорошо известные утилиты получают свою информацию именно из директории /proc. Скажем, вы желаете узнать версию вашего ядра - можете набрать uname -srv, либо перейти в источнику этих данных и набрать cat /proc/version.
Вот еще интересные файлы:

  • /proc/apm: Содержит информацию про Advanced Power Management, если таковой установлен.
  • /proc/acpi: Похожая директория, содержащая массу информации по более современному Advanced Configuration and Power Interface. Например, чтобы выяснить, подключен ли ваш ноутбук к розетке, можете применить команду: cat /proc/acpi/ac_adapter/AC/state, чтобы получить ответ: "on line" или "off line."
  • /proc/cmdline: Показывает параметры, переданные ядру при загрузке. В моем случае это: root=/dev/disk/by-id/scsi-SATA_FUJITSU_MHS2040_NLA5T3314DW3-part3 vga=0x317 resume=/dev/sda2 splash=silent PROFILE=QuintaWiFi, что сообщает мне, какой раздел диска является корневым, какой режим VGA используется, и прочее. Последний параметр относится к openSUSE's System Configuration Profile Management.
  • /proc/cpuinfo: Содержит информацию о процессоре вашей машины. На моем ноутбуке, команда cat /proc/cpuinfo выдает листинг, начинающийся с:
    processor       : 0
    vendor_id       : AuthenticAMD
    cpu family      : 6
    model           : 8
    model name      : Mobile AMD Athlon(tm) XP 2200+
    stepping        : 1
    cpu MHz         : 927.549
    cache size      : 256 KB

    Это означает, что у меня один процессор, за номером 0, семейства 80686 (6 в графе cpu family соответствует среднему знаку числа 80636): AMD Athlon XP, работающий на частоте чуть меньше 1GHz.

  • /proc/loadavg: Родственный файл, показывает среднюю загруженность процессора; его информация включает: использование CPU за последнюю минуту, за последние 5 минут, и за последние 10 минут, а также число текущих в настоящий момент процессов.
  • /proc/stat: Также выдает статистику, но относящуюся к предыщей загрузке машины.
  • /proc/uptime: Коротенький файл, содержащий два числа: сколько секунд машина работала, и сколько секунд простаивала.
  • /proc/devices: Показывает все, на данный момент сконфигурированные и загруженные, character и block устройства. /proc/ide и /proc/scsi содержат информацию о IDE и SCSI устройствах.
  • /proc/ioports: Содержит информацию о портах ввода/вывода (I/O communications) используемых этими устройствами.
  • /proc/dma: Показывает используемые Direct Memory Access каналы.
  • /proc/filesystems: Сообщает, какие файловые системы поддерживаются вашим ядром. Кусочек этого файла может выглядеть следующим образом:
    nodev   sysfs
    nodev   rootfs
    nodev   bdev
    nodev   proc
    nodev   cpuset
    ...несколько строк пропущено...
    nodev   ramfs
    nodev   hugetlbfs
    nodev   mqueue
           ext3
    nodev   usbfs
           ext2
    nodev   autofs

    Первая колонка сообщает, смонтирована ли файловая система на блочное устройство. В моем случае смонтированы разделы, отформатированные в ext2 и ext3

  • /proc/mounts: Перечисляет все точки монтирования, используемые в вашей машине (вывод этого файла весьма смахивает на /etc/mtab). Аналогично, /proc/partitions и /proc/swaps показывают все разделы и все пространства подкачки (swap space).
  • /proc/fs: Если экспортируете файловые системы при помощи NFS, то эта директория содержит, среди своих многочисленных субдиректорий и файлов, файл /proc/fs/nfsd/exports, который показывает файловую систему открытую для доступа, и права такового доступа.
  • /proc/net: Служит для хранения сетевой информации. Описание всех файлов в этой директории займет слишком много места, скажем лишь, что она содержит /dev (каждое сетевое устройство), несколько iptables (файрволов), относящиеся к ним файлы, статистику сетей и сокетов, информацию о беспроводной связи и многое другое.

Еще там находятся несколько файлов, имеющих отношение к оперативной памяти. я уже упоминал /proc/meminfo, но вы увидите также /proc/iomem, который показывает, как оперативная память используется в вашей машине, и /proc/kcore, представляющий физическую память машины. В отличие от большинства других виртуальных файлов, /proc/kcore имеет размер, равный вашей оперативной памяти плюс еще немного. (Не пытайтесь просмотреть этот файл при помощи команды cat, так как его содержимое - двоичный код, который перемешает все на вашем экране). И, наконец, еще остается множество файлов и директорий, имеющих отношение к аппаратной части (железу) компьютера. Это и /proc/interrupts и /proc/irq, /proc/pci (все про PCI устройства), /proc/bus и прочие; все они содержат весьма специфичную информацию, которая не интересна большинству пользователей.

Что внутри процесса?

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

attr             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: Содержит симлинк на текущую работающую директорию (current working directory - CWD), ссылку на исполняемый файл процесса, и ссылку на его корневую директорию.
  • environ: Содержит все переменные среды окружения для данного процесса.
  • fd: Содержит все файловые дескрипторы для данного процесса, показывая, какие файлы или устройства процесс задействует.
  • maps, statm, and mem: Относятся к памяти задействованной в процессе.
  • stat and status: Содержит информацию о статусе процесса.

Все вышеперечисленные файлы позволяют проводить некоторые исследования при помощи скриптового программирования. Например, если вы хотите отловить некий zombie (зомби) процесс, вы можете просканировать все номерные директории, и проверить, появляется ли "(Z) Zombie" в /status файле. Мне однажды пришлось проверять, была ли запущена некая программа; я проводил сканирование, но отслеживал вместо этого файлы /cmdline, пытаясь найти желаемую строку. (То же самое можно проделать, работая в выводом команды ps, но обсуждение этого выходит за рамки настоящей статьи). А уж если вы решите спрограммировать более удобную команду top, то вся необходимая информация прямо у вас в руках.

Тонкая настройка системы: /proc/sys

Директория /proc/sys не только содержит информацию о системе, она еще позволяет изменять параметры ядра "на лету", а также активировать или отключать свойства. (Нет сомнения, что это может оказаться вредоносным для вашей системы - считайте, что я вас предупредил!)

Чтобы определить, можно ли редактировать файл, или же он является файлом "только для чтения", воспользуйтесь командой ls -ld; если файл имеет "W" атрибут, значит его можно каким-то образом использовать для конфигурации ядра. Для примера, вывод команды ls -ld /proc/kernel/* начинается примерно так:

dr-xr-xr-x 0 root root 0 2008-01-26 00:49 pty
dr-xr-xr-x 0 root root 0 2008-01-26 00:49 random
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acct
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acpi_video_flags
-rw-r--r-- 1 root root 0 2008-01-26 00:49 audit_argv_kb
-r--r--r-- 1 root root 0 2008-01-26 00:49 bootloader_type
-rw------- 1 root root 0 2008-01-26 00:49 cad_pid
-rw------- 1 root root 0 2008-01-26 00:49 cap-bound

Можно видеть, что файл bootloader_type не может быть изменен, а все остальные - могут. Для того, чтобы редактировать файл, применяйте команду типа: echo 10 >/proc/sys/vm/swappiness. Данный конкретный пример позволит вам подстроить виртуальную память в области страничной подкачки. Кстати, все эти изменения носят временный характер, их эффект исчезнет при перезагрузке. Чтобы произвести постоянные изменения воспользуйтесь командой sysctl и файлом /etc/sysctl.conf.

Давайте оглядим директории /proc/sys с высоты "птичьего полета".

  • debug: Содержит (удивительно!) отладочную информацию. Хорошо для тех, кто занимается разработкой ядра.
  • dev: Содержит параметры специфических устройств в вашей системе. Для примера просмотрите директорию /dev/cdrom.
  • fs: Предлагает информацию по всем возможным аспектам файловой системы.
  • kernel: Позволяет напрямую влиять на конфигурацию и работу ядра.
  • net: Позволяет контролировать сетевые аспекты. Будьте осторожны, в случае ошибки вы потеряете связь с сетью!
  • vm: Имеет дело с подсистемой VM (виртуальной памяти).

Заключение

Специфическая директория /proc содержит полную детализированную информацию о внутренней "интимной" деятельности Линукс и позволяет производить тонкую настройку многих аспектов ее конфигурации. Если не пожалеть времени на изучение возможностей этой директории, вы сможете улучшить свою машину. А это ли не то, чего мы все хотим?



Средняя оценка 5 при 2 голосовавших