Як працює / proc / *?


62

Є багато файлів в /proc, як /proc/cpuinfo, /proc/meminfo, /proc/devicesі так далі, що, коли відкритий, повернення системи інформації.

Ці файли, схоже, не існують насправді, оскільки запущені fileна них кажуть лише, що вони порожні.

$ file /proc/cpuinfo
/proc/cpuinfo: empty

Як саме працюють ці файли?

Відповіді:


72

Це насправді досить просто, принаймні, якщо вам не потрібні деталі реалізації.

По-перше, в Linux всі файлові системи (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) реалізовані в ядрі. Деякі можуть вивантажити роботу з кодом користувача через FUSE, а деякі надходять лише у вигляді модуля ядра ( рідний ZFS є помітним прикладом останнього через ліцензійні обмеження), але в будь-якому випадку залишається компонент ядра. Це важлива основна.

Коли програма хоче читати з файлу, він буде видавати різні виклики бібліотек системи , яка в кінцевому рахунку , в кінцевому підсумку в ядрі у вигляді open(), read(), close()послідовність (можливо , з seek()доданими для хорошої заходом). Ядро приймає наданий шлях та ім'я файлу, і через файлову систему та пристрій шар вводу / виводу переводить їх у фізичні запити на читання (а також у багатьох випадках також запити запису - подумайте, наприклад, оновлення atime) до деякого базового сховища.

Однак не потрібно перекладати ці запити спеціально на постійне зберігання . Контракт ядра полягає в тому, що видача цього конкретного набору системних викликів надаватиме вміст відповідного файлу . Там, де саме в нашій фізичній царині існує "файл", є вторинним для цього.

На /procзазвичай монтується те, що відомо procfs. Це особливий тип файлової системи, але оскільки це файлова система, вона насправді не відрізняється від, наприклад, ext3файлової системи, десь встановлена. Тож запит передається до коду драйвера файлової системи procfs, який знає про всі ці файли та каталоги та повертає окремі фрагменти інформації з структур даних ядра .

У цьому випадку "рівень зберігання" - це структура даних ядра і procfsзабезпечує чистий, зручний інтерфейс для доступу до них. Майте на увазі, що монтаж profs /procпросто - це умова ; ви могли так само легко встановити його в іншому місці. Насправді, це іноді робиться, наприклад, у в'язницях Chroot, коли процес, який там працює, потребує доступу до / proc з певних причин.

Це працює так само, якщо ви записуєте значення в якийсь файл; на рівні ядра, що призводить до ряду open(), seek(), write(), close()виклики , які знову отримати передаються драйверу файлової системи; знову ж таки, у цьому конкретному випадку код procfs.

Конкретна причина, чому ви бачите fileповернення, emptyполягає в тому, що багато файлів, які піддаються procfs, піддаються розміру в 0 байт. Розмір 0 байтів, ймовірно, є оптимізацією на стороні ядра (багато файлів в / proc є динамічними і можуть легко змінюватися по довжині, можливо, навіть від одного читання до другого, і обчислення довжини кожного файлу в кожному прочитаному каталозі буде потенційно можуть бути дуже дорогими). Переходячи до коментарів до цієї відповіді, яку ви можете перевірити у власній системі, пропустивши через strace або подібний інструмент, fileспочатку надсилає stat()виклик для виявлення будь-яких спеціальних файлів, а потім користується можливістю, якщо розмір файлу повідомляється як 0 , перервіть і повідомте про файл як про порожній.

Така поведінка фактично задокументовані і можуть бути перевизначені шляхом вказівки -sабо --special-filesна fileвиклик, хоча , як зазначено на сторінці керівництва , які можуть мати побічні ефекти. Цитата нижче - із підручної сторінки файлу BSD 5,11 від 17 жовтня 2011 року.

Зазвичай файл намагається лише прочитати та визначити тип файлів аргументів, які звіти stat (2) є звичайними файлами. Це запобігає проблемам, оскільки читання спеціальних файлів може мати особливі наслідки. Визначення -sпараметра призводить до того, що файл також може читати файли аргументів, які є блоковими або символьними спеціальними файлами. Це корисно для визначення типів файлової системи даних у необроблених дискових розділах, які є блоком спеціальних файлів. Ця опція також призводить до того, що файл не враховує розмір файлу, як повідомляє stat (2), оскільки в деяких системах він повідомляє нульовий розмір для необроблених розділів диска.


5
Якщо ви дивитесь на це за допомогою strace file /proc/versionабо ltrace -S /proc/version, оптимізація досить мала. Здійснює stat()дзвінок спочатку і виявляє, що розмір дорівнює 0, тим самим пропускаючи open()- але перед цим завантажуючи кілька магічних файлів.
ott--

2
@ ott-- Це дійсно дивна послідовність подій, але це може бути пов'язано з тим, що ви можете передавати кілька імен файлів file. Таким чином, файл попередньо завантажує чарівні файли, потім обробляє параметр командного рядка за параметром; замість переміщення чарівної завантаження файлу в «зробити це просто , перш ніж намагатися визначити , який файл це особливо один є" частиною коду, який призведе до збільшення складності. Виклик stat()і дія на його зворотному значенні по суті нешкідливий; додаючи складності у відслідковуванні додаткових внутрішніх ризиків, вводячи помилки.
CVn

@ ott-- Насправді причина fileзвітів "файл порожній" полягає в тому, що він вимагає statвиявити спеціальні файли (названі труби, пристрої, ...), і він використовує цю можливість, щоб зупинити обробку порожніх файлів. file -s /proc/versionповідомляє "ASCII текст".
Жиль

4
@Gilles -sПередбачається для спеціальних пристроїв для блокування. Нарешті я подивився на fileджерело, і наприкінці fsmagic.c побачив це пояснення, чому воно повертається ASCII textзамість empty:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

У цьому каталозі ви можете керувати тим, як ядро ​​переглядає пристрої, коригувати налаштування ядра, додавати пристрої до ядра та видаляти їх знову. У цьому каталозі ви можете безпосередньо переглянути статистику використання пам'яті та вводу / виводу .

Ви можете побачити, які диски змонтовані та які файлові системи використовуються. Коротше кажучи, кожен окремий аспект вашої системи Linux може бути вивчений з цього каталогу, якщо ви знаєте, що шукати.

/procКаталог не звичайний каталог. Якби ви завантажувались із завантажувального компакт-диска і дивилися на цей каталог на своєму жорсткому диску, ви побачили б його порожнім. Якщо ви дивитесь на це під звичайною робочою системою, вона може бути досить великою. Однак, схоже, не використовується жодного місця на жорсткому диску. Це тому, що це віртуальна файлова система.

Оскільки /procфайлова система є віртуальною файловою системою і знаходиться в пам'яті, то нова /procфайлова система створюється щоразу, коли ваша машина Linux перезавантажується.

Іншими словами, це просто засіб легко зазирнути та ткнути по кишечнику системи Linux через інтерфейс файлових та каталогів. Переглядаючи файл у /procкаталозі, ви дивитесь безпосередньо на діапазон пам'яті в ядрі Linux і бачите, що він може бачити.

Шари у файловій системі

Введіть тут опис зображення

Приклади:

  • Всередині /procє каталог кожного запущеного процесу, названий його ідентифікатором процесу. Ці каталоги містять файли з корисною інформацією про процеси, такі як:
    • exe: символічне посилання на файл на диску, з якого було розпочато процес.
    • cwd: що є символьним посиланням на робочий каталог процесу.
    • wchan: який при зчитуванні повертає канал очікування, в якому знаходиться процес.
    • maps: яка при прочитанні повертає карти пам'яті процесу.
  • /proc/uptime повертає час безперервної роботи у вигляді двох десяткових значень у секундах, розділених пробілом:
    • кількість часу з моменту запуску ядра.
    • кількість часу, коли ядро ​​не працює.
  • /proc/interrupts: Для інформації, пов’язаної з перебоями.
  • /proc/modules: Список модулів.

Для більш детальної інформації див. Man proc або kernel.org .


"Якби ви завантажувались із завантажувального компакт-диска і дивилися на цей каталог на своєму жорсткому диску, ви побачили б це як порожнє." Це не характерно для / proc, воно є загальним для будь-якої точки монтування, де базова файлова система не була змонтована. Якщо ви завантажитеся з того самого завантажувального компакт-диска і зробите щось на кшталт mount -t procfs procfs /mnt/proc, ви побачите поточний / ядер запущеного ядра.
CVn

5

Ви маєте рацію, вони не є реальними файлами.

Найпростіше кажучи, це спосіб поговорити з ядром, використовуючи звичайні методи читання та запису файлів, замість того, щоб викликати ядро ​​безпосередньо. Це відповідає філософії "все є файлом" Unix.

Файли /procфізично ніде не існують, але ядро ​​реагує на файли, які ви читаєте та пишете всередині них, і замість того, щоб записувати у сховище, воно повідомляє інформацію або щось робить.

Аналогічно, файли в /devнасправді не є файлами в традиційному розумінні (хоча в деяких системах файли в /devнасправді можуть існувати на диску, вони не матимуть багато іншого, крім того, на якому пристрої вони посилаються) - вони дозволяють вам говорити на пристрій, що використовує звичайний API вводу / виводу файлів Unix - або все, що його використовує, як оболонки


1
Більше схоже на * nix, що можна захистити лише файл. Оскільки списки контролю доступу зберігаються у файловій системі, зручно захищати привілейовані ресурси за допомогою загального механізму, який вже надається драйвером файлової системи. Це спрощує реалізацію інструментів, які отримують доступ до структур ядра та дозволяють запускати їх без підвищених дозволів, замість того, щоб читати з віртуальних файлів файлової системи proc.
Pekka

3

Всередині /procкаталогу є два типи вмісту, перший номерний каталог, а другий - файл інформаційної системи.

/procце віртуальна файлова система. Наприклад, якщо ви це зробите ls -l /proc/stat, ви помітите, що він має розмір 0 байт, але якщо ви зробите "cat / proc / stat", ви побачите деякий вміст у файлі.

Зробіть це ls -l /proc, і ви побачите безліч каталогів із просто числами. Ці числа представляють ідентифікатори процесу (PID). Файли всередині цього пронумерованого каталогу відповідають процесу з цим конкретним PID.

Деякі файли, доступні в розділі /proc, містять системну інформацію, таку як cpuinfo, meminfo та loadavg.

Деякі команди Linux зчитують інформацію з цих /procфайлів і відображають її. Наприклад, вільна команда зчитує інформацію з пам'яті з /proc/meminfoфайлу, форматує її та відображає її.

Щоб дізнатися більше про окремі /procфайли, зробіть "man 5 FILENAME".

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

2
Мені це більше звучить як "як використовувати те, що є в / proc?" а не "як працює / проц?". Корисна інформація, але не обов'язково відповідає на це конкретне питання .
CVn

Кожен файл в / proc є інформацією виконання, тобто коли ви переглядаєте / proc / meminfo частина ядра виконує функцію, яка генерує вміст файлу.
Шайлеш

3

Приклад мінімальної експлуатації

Найкращий спосіб зрозуміти ці речі, на мою думку, - це насправді пограти з ними, тому ось модуль ядра, який створює запис profs:

myprocfs.c

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

а потім ми взаємодіємо з ним як:

insmod procfs.ko
cat /proc/lkmc_procfs

і це дає результат:

abcd

З цього прикладу, ми ясно бачимо , що procфайли дозволяють здійснювати довільні «системні виклики , пов'язані з файлами» , такі як open, readі llseek.

Ці системні виклики можуть бути використані для довільної зв'язку з ядром.

Тому ці файли не повинні мати нічого спільного з фактичними файлами у файлових системах, і це стосується майже всіх.

Наприклад, у нашому маленькому прикладі ми просто робимо марний файл, який readзавжди повертається abcd\n.

Ось моя повністю автоматизована настройка QEMU + Buildroot, щоб легко та безпечно створювати та грати з цим модулем ядра:

Деякі інші подібні інтерфейси включають:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.