Библиотека сайта rus-linux.net
Откройте для себя возможности директории /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 содержит полную детализированную информацию о внутренней "интимной" деятельности Линукс и позволяет производить тонкую настройку многих аспектов ее конфигурации. Если не пожалеть времени на изучение возможностей этой директории, вы сможете улучшить свою машину. А это ли не то, чего мы все хотим?