69 votes

Comment fonctionne /proc/* ?

Il existe de nombreux fichiers dans /proc comme /proc/cpuinfo , /proc/meminfo , /proc/devices et ainsi de suite, qui, lorsqu'ils sont ouverts, renvoient des informations sur le système.

Ces fichiers ne semblent pas avoir d'existence en réalité, car l'exécution de file sur eux indique seulement qu'ils sont vides.

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

Comment ces fichiers fonctionnent-ils exactement ?

77voto

user Points 28521

C'est en fait assez simple, du moins si vous n'avez pas besoin des détails de mise en œuvre.

Tout d'abord, sous Linux, tous les systèmes de fichiers (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) sont implémentés dans le noyau. Certains peuvent décharger le travail vers le code de l'utilisateur par le biais de FUSE, et d'autres ne sont disponibles que sous la forme d'un module du noyau ( ZFS natif est un exemple notable de cette dernière en raison des restrictions de licence), mais dans tous les cas, il reste un composant noyau. Il s'agit d'une base importante.

Lorsqu'un programme veut lire un fichier, il lance divers appels à la bibliothèque système qui aboutissent finalement dans le noyau sous la forme d'un fichier de type open() , read() , close() (éventuellement avec seek() pour faire bonne mesure). Le noyau prend le chemin d'accès et le nom de fichier fournis et, par l'intermédiaire du système de fichiers et de la couche E/S du périphérique, les traduit en requêtes de lecture physique (et dans de nombreux cas, en requêtes d'écriture - pensez par exemple aux mises à jour atime) vers un stockage sous-jacent.

Cependant, il n'a pas à traduire ces requêtes spécifiquement pour physique, persistant stockage . Le contrat du noyau est que l'émission d'un ensemble particulier d'appels système va fournir le contenu du fichier en question . L'endroit exact où se trouve le "fichier" dans notre monde physique est secondaire.

Sur /proc est généralement monté ce que l'on appelle procfs . Il s'agit d'un type de système de fichiers spécial, mais puisqu'il s'agit d'un système de fichiers, il n'est pas vraiment différent d'un système de fichiers de type . ext3 système de fichiers monté quelque part. La requête est donc transmise au code du pilote du système de fichiers procfs, qui connaît tous ces fichiers et répertoires et renvoie des éléments d'information particuliers à partir des structures de données du noyau .

Dans ce cas, la "couche de stockage" est constituée par les structures de données du noyau. procfs fournit une interface propre et pratique pour y accéder. Gardez à l'esprit que le montage de procfs à /proc est simplement une convention ; vous pourriez tout aussi bien le monter ailleurs. En fait, cela est parfois fait, par exemple dans les jails chroot lorsque le processus qui s'y exécute a besoin d'accéder à /proc pour une raison quelconque.

Cela fonctionne de la même manière si vous écrivez une valeur dans un fichier ; au niveau du noyau, cela se traduit par une série de open() , seek() , write() , close() qui sont à nouveau passés au pilote du système de fichiers ; à nouveau, dans ce cas particulier, le code procfs.

La raison particulière pour laquelle vous voyez file en retournant sur empty est que beaucoup de fichiers exposés par procfs sont exposés avec une taille de 0 octet. La taille de 0 octet est probablement une optimisation du côté du noyau (beaucoup de fichiers dans /proc sont dynamiques et peuvent facilement varier en longueur, peut-être même d'une lecture à l'autre, et calculer la longueur de chaque fichier à chaque lecture de répertoire serait potentiellement très coûteux). D'après les commentaires de cette réponse, que vous pouvez vérifier sur votre propre système en utilisant strace ou un outil similaire, file publie d'abord un stat() pour détecter tout fichier spécial, et en profite pour, si la taille du fichier est égale à 0, abandonner et signaler que le fichier est vide.

Ce comportement est en fait documenté et peut être remplacée en spécifiant -s o --special-files sur le file l'invocation, bien que, comme indiqué dans la page du manuel, cela puisse avoir des effets secondaires. La citation ci-dessous est tirée de la page de manuel BSD file 5.11, datée du 17 octobre 2011.

Normalement, file tente seulement de lire et de déterminer le type de fichiers d'arguments que stat(2) rapporte être des fichiers ordinaires. Cela évite les problèmes, car la lecture de fichiers spéciaux peut avoir des conséquences particulières. En spécifiant l'option -s permet au fichier de lire également les fichiers d'arguments qui sont des fichiers spéciaux de blocs ou de caractères. Ceci est utile pour déterminer les types de système de fichiers des données dans les partitions de disque brutes, qui sont des fichiers spéciaux de bloc. Cette option permet également au fichier de ne pas tenir compte de la taille du fichier telle que rapportée par stat(2). car sur certains systèmes, il rapporte une taille nulle pour les partitions de disque brut.

17voto

stderr Points 10006

Dans ce répertoire, vous pouvez contrôler la façon dont le noyau voit les périphériques, ajuster les paramètres du noyau, ajouter des périphériques au noyau et les supprimer à nouveau. Dans ce répertoire, vous pouvez visualiser directement l'utilisation de la mémoire et les paramètres du noyau. I/O statistiques.

Vous pouvez voir quels disques sont montés et quels systèmes de fichiers sont utilisés. En bref, chaque aspect de votre système Linux peut être examiné à partir de ce répertoire, si vous savez ce qu'il faut chercher.

El /proc n'est pas un répertoire normal. Si vous deviez démarrer à partir d'un CD de démarrage et regarder ce répertoire sur votre disque dur, vous verriez qu'il est vide. Lorsque vous le regardez sous votre système d'exploitation normal, il peut être assez grand. Cependant, il ne semble pas utiliser d'espace sur le disque dur. C'est parce qu'il s'agit d'un système de fichiers virtuel.

Depuis le /proc est un système de fichiers virtuel et réside dans la mémoire, un nouveau système de fichiers est créé. /proc est créé à chaque fois que votre machine Linux redémarre.

En d'autres termes, il s'agit simplement d'un moyen de jeter un coup d'œil et de fouiller dans les entrailles du système Linux par le biais d'une interface de type fichier et répertoire. Lorsque vous regardez un fichier dans le répertoire /proc vous regardez directement une plage de mémoire dans le noyau Linux et voyez ce qu'elle peut voir.

Les couches du système de fichiers

Enter image description here

Exemples :

  • À l'intérieur de /proc il y a un répertoire pour chaque processus en cours, nommé avec son ID de processus. Ces répertoires contiennent des fichiers qui ont des informations utiles sur les processus, tels que :
    • exe qui est un lien symbolique vers le fichier sur le disque à partir duquel le processus a été lancé.
    • cwd qui est un lien symbolique vers le répertoire de travail du processus.
    • wchan qui, lorsqu'il est lu, renvoie le canal d'attente sur lequel se trouve le processus.
    • maps qui, lorsqu'il est lu, renvoie les cartes mémoire du processus.
  • /proc/uptime renvoie le temps de fonctionnement sous la forme de deux valeurs décimales en secondes, séparées par un espace :
    • le temps écoulé depuis le démarrage du noyau.
    • le temps pendant lequel le noyau est resté inactif.
  • /proc/interrupts : Pour des informations relatives aux interruptions.
  • /proc/modules : Pour obtenir la liste des modules.

Pour des informations plus détaillées, voir procréation assistée o kernel.org .

6voto

LawrenceC Points 70381

Vous avez raison, ce ne sont pas de vrais fichiers.

En termes simples, c'est un moyen de parler au noyau en utilisant les méthodes normales de lecture et d'écriture de fichiers, au lieu d'appeler le noyau directement. C'est en accord avec la philosophie d'Unix "tout est un fichier".

Les fichiers dans /proc n'existent physiquement nulle part, mais le noyau réagit aux fichiers que vous lisez et écrivez à l'intérieur, et au lieu d'écrire sur le stockage, il rapporte des informations ou fait quelque chose.

De même, les fichiers dans /dev ne sont pas vraiment des fichiers au sens traditionnel du terme (bien que sur certains systèmes les fichiers dans /dev peuvent en fait exister sur le disque, ils n'auront pas grand-chose d'autre que le périphérique auquel ils se réfèrent) - ils vous permettent de parler à un périphérique en utilisant l'API normale d'E/S de fichiers d'Unix - ou tout ce qui l'utilise, comme les shells

4voto

Exemple minimal exécutable de création d'une nouvelle entrée procfs

La meilleure façon de comprendre ces choses, à mon avis, est de jouer avec. Voici donc un module du noyau qui crée une entrée procfs :

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");

et ensuite nous interagissons avec elle comme :

insmod procfs.ko
cat /proc/lkmc_procfs

et cela produit la sortie :

abcd

Dans cet exemple, nous voyons clairement que proc nous permettent d'implémenter des "appels système liés aux fichiers" arbitraires tels que open , read y llseek .

Ces appels système peuvent ensuite être utilisés pour une communication arbitraire avec le noyau.

Par conséquent, ces fichiers n'ont pas besoin d'avoir quelque chose à voir avec les fichiers réels des systèmes de fichiers, et c'est le cas pour la quasi-totalité d'entre eux.

Dans notre petit exemple, nous faisons simplement un fichier inutile pour lequel read retourne toujours abcd\n .

Voici ma configuration entièrement automatisée de QEMU + Buildroot pour construire et jouer avec ce module de noyau de manière simple et sûre :

D'autres interfaces similaires existent :

3voto

flochtililoch Points 2081

A l'intérieur de la /proc il y a deux types de contenu, le premier est un répertoire numéroté et le second est un fichier d'informations système.

/proc est un système de fichiers virtuel. Par exemple, si vous faites ls -l /proc/stat vous remarquerez qu'il a une taille de 0 octet, mais si vous faites "cat /proc/stat", vous verrez du contenu dans le fichier.

Faites un ls -l /proc et vous verrez de nombreux répertoires contenant uniquement des numéros. Ces nombres représentent les identifiants de processus (PID). Les fichiers à l'intérieur de ce répertoire numéroté correspondent au processus avec ce PID particulier.

Certains fichiers qui sont disponibles sous /proc contient des informations sur le système telles que cpuinfo, meminfo, et loadavg.

Certaines commandes Linux lisent les informations de ces /proc et l'afficher. Par exemple, le gratis lit les informations de la mémoire du /proc/meminfo le formate et l'affiche.

Pour en savoir plus sur l'individu /proc les fichiers, faites "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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X