Два слова о /proc в Linux: cpuinfo и другие параметры

Используя файловую систему /proc, можно изменять многие параметры системы без необходимости перезагрузки машины и многое узнать о работе системы. О некоторых полезных командах - далее в этом посте.


Что такое proc в Linux зачем оно нужно?
Файловая система /proc - это виртуальная файловая система в Линукс, и файлы в этом каталоге на самом деле не занимают места на жестком диске. Файловая система /proc это интерфейс ко внутренним структурам данных в ядре, что можно использовать для получения информации о системе и изменения некоторые параметров ядра во время работы системы.

Многие программы собирают информацию из файлов в /proc, форматируют их и выводят результат пользователю (top, ps и другие). Также существует специальный подкаталог /proc/sys. Он позволяет вам просматривать параметры ядра и изменять их на лету.

Не стоит открывать эти файлы обычным текстовым редактором - это может нарушить целостность данных или ядро может успеть изменить значения в этих файлах.
Чтобы этого избежать, следует пользоваться командами echo и cat для установки и просмотра содержимого файлов соответственно.


Структура файловой системы /proc в Linux
Чтобы передать значение fake в файл /proc/your/file, следует дать команду:
echo "fake" > /proc/your/file
Для того, чтобы увидеть значение в файле, используем cat:

cat /proc/your/file

получим:
fake
В основном в /proc вы найдете файлы read-only за исключением /proc/sys, которая содержит большинство параметров ядра и предназначена для изменения во время работы системы.

Содержимое /proc можно очень условно поделить на пользовательское и системное.



Зачем /proc для пользователя
Пользовательское содержимое - каталоги, состоящие из цифр, которые соответствуют идентификатору процессов (PID), и псевдофайлы, которые содержат информацию о процессах (в том числе и пользовательских)

Если вы когда-нибудь запускали top чтобы посмотреть на активные процессы, вы наверняка видели что-то вроде:
top - 12:12:27 up 4:31, 1 user, load average: 0.87, 1.01, 1.10
Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.0%us, 2.7%sy, 0.0%ni, 91.0%id, 0.0%wa, 0.3%hi, 0.0%si, 0.0%st
Mem: 498880k total, 466680k used, 32200k free, 8520k buffers
Swap: 698720k total, 95440k used, 603280k free, 123416k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5532 beast 20 0 615m 249m 19m S 2.0 51.1 4:57.59 firefox-bin
26204 beast 20 0 175m 44m 41m S 2.0 9.1 3:08.17 mocp
5475 root 20 0 323m 25m 2140 S 1.3 5.3 8:13.39 Xorg
29783 beast 20 0 34900 20m 16m S 1.3 4.2 0:00.60 kwrite
68 root -51 -5 0 0 0 S 0.3 0.0 0:51.25 IRQ-9
5548 beast 20 0 7624 2296 1932 S 0.3 0.5 1:14.43 conky
5584 beast 20 0 30096 8004 5800 S 0.3 1.6 0:20.98 yakuake

Вся информация здесь взята из /proc.

/proc/loadavg
Содержит средние значения нагрузки на систему за последние 1, 5 и 15 минут, а также число активно работающих процессов и общее число процессов. Пример:

# cat /proc/loadavg
0.96 1.03 1.10 2/131 29924


/proc/cpuinfo
Этот псевдофайл содержит информацию о процессоре, которую удалось выяснить во время загрузки, например, тип процессора. Вот что можно там увидеть:
# cat cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 13
model name : Intel(R) Pentium(R) M processor 1.73GHz
stepping : 8
cpu MHz : 1729.034
cache size : 2048 KB
fdiv_bug : no
hlt_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 clflush dts acpi mmx fxsr sse sse2 ss tm pbe nx est tm2
bogomips : 3459.55
clflush size : 64
Здесь можно выудить тип процессора (семейство процессоров и модель), скорость процессора, размер кэша, и многое другое.


Структура директорий /proc для работающих процессов
И это тоже может пригодиться пользователю - например, если броузер открыл потоковое видео и не даёт его скачать на жёсткий диск, вытащить видеоролик можно всё равно.

Итак, после запуска каждый процесс получает индетификатор (PID). При этом в директории /proc создаётся каталог, соответствующий номеру PID, а именно /proc/PID. Внутри создаются файлы, которые содержат информацию о процессе, и которую мы можем использовать в своих корыстных целях или просто удовлетворить своё любопытство.

Ниже лишь некоторые псевдофайлы, которые представляют интерес:
  • /proc/PID/cmdline этот файл содержит команду, которая первоначально запустила процесс.
  • /proc/PID/cwd ссылка на текущий рабочий каталог процесса.
  • /proc/PID/exe ссылка на оригинальный исполняемый файл, если он ещё существует (процесс может продолжать работать после того, как его исполняемый файл был удален или заменён).
  • /proc/PID/status файл содержит основную информацию о процессе, включая его состояние выполнения и потребляемую память.
Подкаталоги содержат больше информации, и вот что тут интересного:
  • /proc/PID/fd каталог, содержащий символическую ссылку для дескрипторов файлов, которые открыты процессом. Это значит, что мы можем увидеть здесь ссылки на открытые файлы и устройства. Внутри вы найдёте ссылки в виде номеров: 0 1 10 11 12 13 2 3 4 5 6 7 8 9, но команда ls -l скажет вам намного больше интересного (об этом ниже).
  • /proc/PID/fdinfo каталог, содержащий файлы, которые описывают положение и флаги для каждого дескриптора открытого файла. Там вы увидите на те номера, которые отражены в /proc/PID/fd
  • /proc/PID/task каталог, содержащий жесткие ссылки на любые задачи, которые были начаты этим процессом.
Чтобы было интереснее, давайте понаблюдаем за моим медиаплеером и посмотрим, что о нём узнать из данных, хранящихся в файловой системе /proc

Итак, в наушниках играет музыка - а кто её играет?
beast@notebeast:/proc$ lsof -n | grep mp3
lsof: WARNING: can't stat() reiserfs file system /dev/.static/dev
Output information may be incomplete.
mocp 26168 beast mem REG 3,2 12808 364453 /usr/lib/moc/decoder_plugins/libmp3_decoder.so
mocp 26204 beast mem REG 3,2 9639936 1645857 /home/beast/zips/music/NewAge/Carbon Based Lifeforms/CBL_the_path/10 - CBL - Submerged.mp3
mocp 26204 beast mem REG 3,2 12808 364453 /usr/lib/moc/decoder_plugins/libmp3_decoder.so
mocp 26204 beast 4r REG 3,2 9639936 1645857 /home/beast/zips/music/NewAge/Carbon Based Lifeforms/CBL_the_path/10 - CBL - Submerged.mp3
Её играет плеер MOCP. Отлично, теперь мы знаем его PID - это 26204:
cd /proc/26204/
Посмотрим, какие файлы он открыл:
cd /proc/26204/fd
И что мы видим:
beast@notebeast:/proc/26204/fd$ ls -l
итого 0
lrwx------ 1 beast beast 64 2012-03-03 12:44 0 -> /dev/pts/2
l-wx------ 1 beast beast 64 2012-03-03 12:44 1 -> /dev/null
l-wx------ 1 beast beast 64 2012-03-03 12:44 10 -> /dev/null
lr-x------ 1 beast beast 64 2012-03-03 12:44 11 -> /dev/snd/timer
lrwx------ 1 beast beast 64 2012-03-03 12:44 12 -> /dev/snd/pcmC0D0p
lrwx------ 1 beast beast 64 2012-03-03 12:44 13 -> /dev/snd/controlC0
l-wx------ 1 beast beast 64 2012-03-03 12:44 2 -> /dev/null
lrwx------ 1 beast beast 64 2012-03-03 12:44 3 -> socket:[115134]
lr-x------ 1 beast beast 64 2012-03-03 12:54 4 -> /home/beast/zips/music/NewAge/Carbon Based Lifeforms/CBL_the_path/10 - CBL - Submerged.mp3
lr-x------ 1 beast beast 64 2012-03-03 12:44 5 -> pipe:[115095]
l-wx------ 1 beast beast 64 2012-03-03 12:44 6 -> pipe:[115095]
lrwx------ 1 beast beast 64 2012-03-03 12:44 7 -> socket:[115096]
lrwx------ 1 beast beast 64 2012-03-03 12:44 8 -> /dev/snd/controlC0
l-wx------ 1 beast beast 64 2012-03-03 12:44 9 -> /dev/null
Последняя строчка, подсвеченная красным, нам говорит, что открыто устройство воспроизведения звука. Это точно, в наушниках это очень заметно.

Более интересно, что ссылка 4 ведёт на файл MP3, который сейчас играет. Помня, что в UNIX всё есть файл, попробуем скопировать ссылку 4 в свой домашний каталог:
cp 4 ~/strangefile
Оно что-то скопировало, но что это? Раз ссылка ведёт на аудиофайл, попробуем его воспроизвести, например, с помощью mplayer

beast@notebeast:/proc/26204/fd$ mplayer ~/strangefile
MPlayer SVN-r29532-4.1.2 (C) 2000-2009 MPlayer Team

Playing /home/beast/strangefile.
Audio only file format detected.
Clip info:
Title: Submerged
Artist: Carbon Based Lifeforms
Album: The path
Year: 1998
Comment: mp3.com/cbl
Track: 10
Genre: Ambient
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A: 4.5 (04.5) of 602.0 (10:02.0) 1.3%
Да это же наш файл, который играется плеером! Так можно вытаскивать открытые файлы из приложений, которые по каким-то причинам не хотят ими делиться.



Зачем /proc для системного администратора
Системное содержимое - псевдофайлы со статистикой или информацией по оборудованию и переменными ядра. В каталоге /proc множество файлов, большинство из них - только для чтения, из них можно узнать многое об оборудовании. Но есть файлы и на запись - они позволяют менять в процессе работы (''на лету'') параметры работы ядра.

/proc/scsi/scsi
Позволяет добавить или отключить диск, если он поддерживает горячую замену (SCSI или SATA). Указать ядру на подключение нового диска можно командой:

echo "scsi add-single-device w x y z" > /proc/scsi/scsi
Чтобы эта команда работала правильно, вы должны указать параметры значений w, x, y, и z следующим образом:
  • w - это ID хост адаптера, где первый адаптер имеет ID ноль (0))
  • x - это канал SCSI на хост адаптере, где первый канал ноль (0)
  • y - это SCSI ID устройства
  • z - это номер LUN, где первый LUN ноль (0)
Этот трюк можно проворачивать не только с дисками: в своё время это пришлось делать мне для подключения многослотового кардиридера.

Чтобы извлечь диск из системы без перезагрузки, размонтируем его и даём команду:
echo "scsi remove-single-device w x y z" > /proc/scsi/scsi

Перед тем как ввести эту команду и удалить SCSI диск, убедитесь, что вы отмонтировали файловые системы на этом диске.


/proc/sys/kernel/acct
Здесь содержатся три конфигурируемых значения, которые управляют подсчётом процессов, основанном на свободном пространстве файловой системы в формате high, low, frequency.

Если свободное пространство ниже значения low в процентах, то подсчет процессов останавливается. Если свободное пространство выше значения high, то процесс запускается. Проверка подсчёта процессов производится frequency раз в секунду.
Значения по умолчанию: 4 2 30


/proc/sys/kernel/ctrl-alt-del
Этот файл содержит двоичное значение, которое управляет реакцией системы на комбинацию ctrl+alt+delete. Возможны два значения:

  1. Ноль (0) значит, что ctrl+alt+delete принимается и отправляется программе init, что обеспечит правильный останов и перезагрузку как если бы вы ввели команду reboot.
  2. Один (1) значит, что ctrl+alt+delete не принимается и никакого чистого отключения не происходит - перезагрузка как при нажатии на RESET.
Значение по умолчанию - 0.


/proc/sys/kernel/panic
Задаёт время в секундах, которое ядро будет ждать перед перезагрузкой если произойдет "kernel panic". Установка в ноль (0) секунд отключит возможность перезагрузки при kernel panic.
Значение по умолчанию - 0.


/proc/sys/kernel/sysrq
Включает или выключает возможность использования Волшебной SysRQ-клавишей (Magick System Request Key). Если в ядре она активирована, чаще всего значение в этом файле 1.
Об этой клавише и её возможностях было написано тут.



/proc/sys/vm/swappiness

Этот параметр позволяет регулировать стремление системы сбрасывать данные из памяти в файл подкачки. Чрезмерное значение здесь приведёт к интенсивному использованию своп-файла, что нежелательно в ряде случаев (ноутбуки, lowlatency-системы). Слишком маленькое значение может привести к тому, что при заполнении памяти будет принудительно запущен OOMkiller (процесс, запускающийся при исчерпании памяти и убивающий наиболее ресурсоёмкие задачи).

Значение параметра может быть в пределах от 0 (наименьшее использование подкачки) до 100 (подкачка используется часто). Значение по умолчанию - 60. Есть сообщения, что при большом объёме памяти (от 1Гб) оптимальным значением является 10. Для этого:
echo "10" > /proc/sys/vm/swappiness
Больше об этом говорится здесь.


/proc/uptime

Содержит время (в секундах) непрерывной работы (с последней перезагрузки или выключения) компьютера, а так же время простоя системы. Пример:

375455.86 319845.47


/proc/swaps
Показывает все подключённые источники виртуальной памяти. Например:

Filename Type Size Used Priority
/dev/sda6 partition 1005440 0 0

Колонка "приоритета" полезна, когда в системе используются несколько своп-файлов.
Чем ниже приоритет, тем более вероятно, что своп-файл будет использоваться.


Как сделать настройки в /proc постоянными
Для того, чтобы изменения в директории /proc/sys стали постоянными, нужно внести изменения в файл конфигурации для sysctl - /etc/sysctl.conf

Формат этого файла требует некоторых пояснений. Так как sysctl может только изменять переменные в директории /proc/sys, то часть имени переменной обозначающая директорию отбрасывается. Другое изменение касается слэшей, которые заменяются на точки. Вот два простых правила для преобразования файлов в /proc/sys и переменных в sysctl:
  • Уберите из начала команды /proc/sys
  • Замените слэши на точки в имени файла.
Эти два правила позволят вам преобразовать любой файл в /proc/sys в любое имя переменной в sysctl. Обычное преобразование имени файла в переменную:
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file

Вы можете увидеть все переменные, доступные для изменения, используя команду sysctl -a.


Ссылки
В сети много информации по /proc, но некоторые посты хотелось бы отметить особо. Здесь и тут есть много интересного, ну и конечно отличная документация этих седых UNIX-орлов из IBM :-) А здесь просто кладезь параметров, относящихся к работе в сети, которыми можно управлять через /proc (спасибо deimos). Так же можно прочитать о многих параметрах /proc на русском в интересной серии постов.

9 комментариев: |высказаться!| RSS-лента дискуссии.|
deimos комментирует...

Может будет полезным...
http://www.opennet.ru/docs/RUS/LARTC/x1727.html

Анонимный комментирует...

Достаточно понятно написано, спасибо за работу.

virens комментирует...

2 deimos пишет...
Может будет полезным...
Вот это клад! Огромное спасибо! Добавил в пост.

2 Анонимный пишет...
Достаточно понятно написано, спасибо за работу.
Пожалуйста :-)
На самом деле я просто записал те параметры, которыми пользовался. Ну и пост в загашниках лежит уже почти год.

Анонимный комментирует...

1) Здесь содержатся три конфигурируемых значения, которые управляют подсчётом процессов, основанном на свободном пространстве файловой системы и ведёт лог:
Э-э-э... кто ведёт лог?
2)Ссылки "есть сообщения ..." и "об этом говорится здесь." ведут на одну и ту же страницу. Это так и задумано?
3) Спасибо за статью.

virens комментирует...

2 sdfi пишет...
Э-э-э... кто ведёт лог?
Что-то я не то тут написал :-) Поправил.

Ссылки "есть сообщения ..." и "об этом говорится здесь." ведут на одну и ту же страницу. Это так и задумано?
Это так получилось :-) Исправлено.

Спасибо за статью.
Всегда пожалуйста.

Анонимный комментирует...

>Значения по умолчанию: 2 4 30
Вот мой вывод:
$ cat /proc/sys/kernel/acct
4 2 30
Получается, что "эти значения остановят подсчёт, если в файловой системе менее 4 процентов свободного пространства и начнет опять если появится 2 или более процентов."?
Нелогично :)

pkh комментирует...

Можно ли сделать изменения в ядре, чтобы установить модули ядра VirtualBox?
На ядра 2.6.26-2-686 и 2.6.27.10dubl все устанавливается гладко, а вот на 2.6.27.10w3 никак.
# /etc/init.d/vboxdrv setup
Stopping VirtualBox kernel module:done..
Recompiling VirtualBox kernel module:
Look at /var/log/vbox-install.log to find out what went wrong failed!
#cat /var/log/vbox-install.log
Attempting to install using DKMS
removing old DKMS module vboxdrv version 3.1.2

------------------------------
Deleting module version: 3.1.2
completely from the DKMS tree.
------------------------------
Done.

Creating symlink /var/lib/dkms/vboxdrv/3.1.2/source ->
/usr/src/vboxdrv-3.1.2

DKMS: add Completed.

Error! Your kernel headers for kernel 2.6.27.10w3 cannot be found at
/lib/modules/2.6.27.10w3/build or /lib/modules/2.6.27.10w3/source.
You can use the --kernelsourcedir option to tell DKMS where it's located, or you could install the linux-headers-2.6.27.10w3 package.
Failed to install using DKMS, attempting to install without
Makefile:152: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR= and run Make again. Останов.

но я ведь заголовки установил:
#ls /usr/src
cdfs.tar.bz2 linux-headers-2.6.27.10w3_2.6.27.10w3-10.00.Custom_i386.deb
linux-2.6.27.10 linux-kbuild-2.6.26
linux-headers-2.6.26-2-486 rpm
linux-headers-2.6.26-2-686 vboxdrv-3.1.2
linux-headers-2.6.26-2-common vboxnetadp-3.1.2
linux-headers-2.6.27.10dubl vboxnetflt-3.1.2
linux-headers-2.6.27.10w3 virtualbox-3.1_3.1.2-56127%5fDebian%5flenny_i386.deb

еще boot покажу
# ls /boot
config-2.6.26-2-486 grub initrd.img-2.6.27.10w3 System.map-2.6.27.10w3 vmlinuz-2.6.27.10w3
config-2.6.26-2-686 initrd.img-2.6.26-2-486 System.map-2.6.26-2-486 vmlinuz-2.6.26-2-486
config-2.6.27.10dubl initrd.img-2.6.26-2-686 System.map-2.6.26-2-686 vmlinuz-2.6.26-2-686
config-2.6.27.10w3 initrd.img-2.6.27.10dubl System.map-2.6.27.10dubl vmlinuz-2.6.27.10dubl

Может через /proc можно что подправить?

Анонимный комментирует...

Довольно интересно!!!Спасибо=)

virens комментирует...

Так, автор по большой оказии заглянул сюда и перекроил пост. Много добавлено материала по файловым дескрипторам, разбавлены примерами и вообще пост стал объёмнее и (хочется надеяться) лучше.

@Богдан комментирует...
Нелогично :)
Да, верно. Это я цифры местами перепутал. Немного поправил формулировку, теперь должно стать понятнее.

@pkh комментирует...
Можно ли сделать изменения в ядре, чтобы установить модули ядра VirtualBox?
Хммм.. если я правильно представляю себе механизм загрузки модулей в ядро, то с его точки зрения, это РАЗНЫЕ ядра.

Автор просто копировал модуль в другое ядро - по крайней мере с kqemu это проходило.

Может через /proc можно что подправить?
Хороший вопрос. По идее, можно было бы перезаписать /proc/version, но оно так просто не даётся.

Автор берёт минуту на размышления :-)

@Анонимный комментирует...
Довольно интересно!!!Спасибо=)
А пожалуйста. На самом деле, всё это можно найти в документации к ядру, но если не знаешь, что искать... В общем, это и автору зарубка на память - что где лежит. Мало ли, амнезия сантабарбарой в голову стукнет, тут хоть на бложик свой зайду.

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.