procfs - procfs

Le système de fichiers proc ( procfs ) est un système de fichiers spécial dans les systèmes d'exploitation de type Unix qui présente des informations sur les processus et d'autres informations système dans une structure de type fichier hiérarchique, fournissant une méthode plus pratique et standardisée pour accéder dynamiquement aux données de processus contenues dans le noyau que méthodes de traçage traditionnelles ou accès direct à la mémoire du noyau . En règle générale, il est mappé à un point de montage nommé /proc au démarrage. Le système de fichiers proc agit comme une interface avec les structures de données internes sur les processus en cours d'exécution dans le noyau. Sous Linux , il peut également être utilisé pour obtenir des informations sur le noyau et pour modifier certains paramètres du noyau lors de l'exécution ( sysctl ).

De nombreux systèmes d'exploitation de type Unix prennent en charge le système de fichiers proc, notamment Solaris , IRIX , Tru64 UNIX , BSD , Linux , IBM AIX , QNX et Plan 9 de Bell Labs . OpenBSD a abandonné le support dans la version 5.7, publiée en mai 2015.

Le noyau Linux l' étend aux données non liées aux processus.

Le système de fichiers proc fournit une méthode de communication entre l' espace noyau et l'espace utilisateur . Par exemple, la version GNU de l'utilitaire de rapport de processus ps utilise le système de fichiers proc pour obtenir ses données, sans utiliser d' appels système spécialisés .

Histoire

UNIX 8e édition

Tom J. Killian a implémenté la version UNIX 8th Edition (V8) de /proc : il a présenté un article intitulé "Processes as Files" à USENIX en juin 1984. La conception de procfs visait à remplacer l' appel système ptrace utilisé pour le traçage des processus. Une documentation détaillée peut être trouvée dans la page de manuel proc(4) .

SVR4

Roger Faulkner et Ron Gomes ont porté V8 /proc sur SVR4 et ont publié un article intitulé "The Process File System and Process Model in UNIX System V" à USENIX en janvier 1991. Ce type de procfs prenait en charge la création de ps , mais les fichiers pouvaient accessible uniquement avec les fonctions read() , write() et ioctl () . Entre 1995 et 1996, Roger Faulkner a créé l'interface procfs-2 pour Solaris-2.6 qui offre un système de fichiers /proc structuré avec des sous-répertoires.

Plan 9

Plan 9 a implémenté un système de fichiers de processus, mais est allé plus loin que la V8. Le système de fichiers de processus de V8 implémentait un seul fichier par processus. Plan 9 a créé une hiérarchie de fichiers séparés pour fournir ces fonctions et a fait de /proc une véritable partie du système de fichiers.

4.4BSD

4.4BSD a cloné son implémentation de /proc à partir du Plan 9. Depuis février 2011, procfs est progressivement supprimé dans FreeBSD, et s'est tourné vers l'utilisation de sysctl à la place pour les informations liées aux processus. Il a été supprimé d' OpenBSD dans la version 5.7, qui a été publiée en mai 2015, car il "a toujours souffert de conditions de concurrence et est maintenant inutilisé". macOS n'a pas implémenté procfs et les programmes d'espace utilisateur doivent utiliser l'interface sysctl pour les données de processus.

Pour fournir une compatibilité binaire avec les programmes d'espace utilisateur Linux, le noyau FreeBSD fournit également des linprocfs similaires aux procfs Linux.

Solaris

/proc dans Solaris était disponible dès le début. Solaris 2.6 en 1996 a introduit procfs2 de Roger Faulkner.

Linux

Linux a d'abord ajouté un système de fichiers /proc dans la v0.97.3 , en septembre 1992, et a commencé à l'étendre aux données non liées au processus dans la v0.98.6, en décembre 1992.

Depuis 2020, l'implémentation Linux inclut un répertoire pour chaque processus en cours d'exécution, y compris les processus du noyau , dans des répertoires nommés /proc/PID , où PID est le numéro du processus. Chaque répertoire contient des informations sur un processus, notamment :

  • /proc/PID/cmdline , la commande qui a initialement démarré le processus.
  • /proc/PID/cwd , un lien symbolique vers le répertoire de travail actuel du processus.
  • /proc/PID/environ contient les noms et les valeurs des variables d'environnement qui affectent le processus.
  • /proc/PID/exe , un lien symbolique vers le fichier exécutable d' origine , s'il existe toujours (un processus peut continuer à s'exécuter après que son exécutable d'origine ait été supprimé ou remplacé).
  • /proc/PID/fd , un répertoire contenant un lien symbolique pour chaque descripteur de fichier ouvert .
  • /proc/PID/fdinfo , un répertoire contenant des entrées qui décrivent la position et les drapeaux de chaque descripteur de fichier ouvert.
  • /proc/PID/maps , un fichier texte contenant des informations sur les fichiers et les blocs mappés (comme le tas et la pile).
  • /proc/PID/mem , une image binaire représentant la mémoire virtuelle du processus , n'est accessible que par un processus ptrace 'ing.
  • /proc/PID/root , un lien symbolique vers le chemin racine tel que vu par le processus. Pour la plupart des processus, ce sera un lien vers/à moins que le processus ne s'exécute dans une prison chroot .
  • /proc/PID/status contient des informations de base sur un processus, notamment son état d'exécution et son utilisation de la mémoire.
  • /proc/PID/task , un répertoire contenant des liens physiques vers toutes les tâches qui ont été démarrées par ce processus (c'est-à-dire le parent).

(Les utilisateurs peuvent obtenir le PID avec un utilitaire tel que pgrep , pidof ou ps :

$ ls -l /proc/$(pgrep -n python3)/fd        # List all file descriptors of the most recently started `python3' process
total 0
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python3)/exe    # List executable used to launch the most recently started `python3' process  
/usr/bin/python3.8

)

/proc inclut également des informations système non liées au processus, bien que dans le noyau 2.6, une grande partie de ces informations ont été déplacées vers un pseudo-système de fichiers séparé, sysfs , monté sous /sys :

  • selon le mode de gestion de l'alimentation (le cas échéant), soit le répertoire, /proc/acpi ou /proc/apm , qui est antérieur à sysfs et contient diverses informations sur l'état de la gestion de l'alimentation.
  • /proc/buddyinfo , informations sur l' algorithme de contact qui gère la fragmentation de la mémoire.
  • /proc/bus , contenant des répertoires représentant divers bus sur l'ordinateur, tels que PCI / USB . Cela a été largement remplacé par sysfs sous /sys/bus qui est beaucoup plus informatif.
  • /proc/fb , une liste des framebuffers disponibles
  • /proc/cmdline , donnant les options de démarrage passées au noyau
  • /proc/cpuinfo , contenant des informations sur le CPU , telles que son fournisseur (et la famille de CPU, le modèle et les noms de modèle qui devraient permettre aux utilisateurs d'identifier le CPU) et sa vitesse (CPU clockspeed ), la taille du cache, le nombre de frères et sœurs, les cœurs, et les drapeaux CPU . /proc/cpuinfo inclut une valeur pour " bogomips ", souvent mal interprétée comme une mesure de la vitesse du processeur, comme une référence, mais il ne mesure en fait aucune valeur sensible (pour les utilisateurs finaux). Cela se produit comme un effet secondaire de l'étalonnage de la minuterie du noyau et donne des valeurs très variables selon le type de processeur, même à des vitesses d'horloge égales.
$ cat /proc/cpuinfo
processor	: 0
 vendor_id	: AuthenticAMD
 cpu family	: 16
 model		: 6
 model name	: AMD Athlon(tm) II X2 270 Processor
 stepping	: 3
 microcode	: 0x10000c8
 cpu MHz		: 2000.000
 cache size	: 1024 KB
 ...
 processor	: 1
 vendor_id	: AuthenticAMD
 cpu family	: 16
 model		: 6
 model name	: AMD Athlon(tm) II X2 270 Processor
 stepping	: 3
 microcode	: 0x10000c8
 cpu MHz		: 800.000
 cache size	: 1024 KB
 ...

Sur les processeurs multicœurs, /proc/cpuinfo contient les champs « frères et sœurs » et « cpu cores » qui représentent le calcul suivant est appliqué :

"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)

Un package CPU signifie un processeur physique qui peut avoir plusieurs cœurs (un seul cœur pour un, deux cœurs pour deux, quatre cœurs pour quatre). Cela permet une distinction entre hyper-threading et dual-core, c'est-à-dire que le nombre d'hyper-threads par paquet CPU peut être calculé par frères/cœurs CPU . Si les deux valeurs d'un package CPU sont identiques, l'hyper-threading n'est pas pris en charge. Par exemple, un package CPU avec frères = 2 et "cpu cores" = 2 est un processeur double cœur mais ne prend pas en charge l'hyper-threading.

  • /proc/crypto , une liste des modules cryptographiques disponibles
  • /proc/devices , une liste de périphériques caractères et blocs triés par ID de périphérique mais donnant également la majeure partie du nom /dev
  • /proc/diskstats , donnant des informations (y compris les numéros de périphérique) pour chacun des périphériques de disque logique
  • /proc/filesystems , une liste des systèmes de fichiers pris en charge par le noyau au moment de la liste
  • /proc/interrupts , /proc/iomem , /proc/ioports et le répertoire /proc/irq , donnant quelques détails sur les périphériques (physiques ou logiques) utilisant les différentes ressources système
  • /proc/kmsg , contenant les messages générés par le noyau
  • /proc/meminfo , contenant un résumé de la façon dont le noyau gère sa mémoire.
  • /proc/modules , l'un des fichiers les plus importants de /proc , contenant une liste des modules du noyau actuellement chargés. Il donne une indication (pas toujours tout à fait correcte) des dépendances.
  • /proc/mounts , un lien symbolique vers self/mounts qui contient une liste des périphériques actuellement montés et leurs points de montage (et quel système de fichiers est utilisé et quelles options de montage sont utilisées).
  • /proc/net/ , un répertoire contenant des informations utiles sur la pile réseau, en particulier /proc/net/nf_conntrack , qui répertorie les connexions réseau existantes (particulièrement utile pour suivre le routage lorsque iptables FORWARD est utilisé pour rediriger les connexions réseau)
  • /proc/partitions , une liste des numéros de périphériques, leur taille et les noms /dev que le noyau a identifiés comme partitions existantes
  • /proc/scsi , donnant des informations sur tous les périphériques connectés via un contrôleur SCSI ou RAID
  • un lien symbolique vers le processus actuel (traversant) dans /proc/self (c'est -à- dire /proc/PID/PID est celui du processus actuel).
  • /proc/slabinfo , répertoriant les statistiques sur les caches pour les objets fréquemment utilisés dans le noyau Linux
  • /proc/swaps , une liste des partitions de swap actives, leurs différentes tailles et priorités
  • Accès aux options du noyau configurables dynamiquement sous /proc/sys . Sous /proc/sys apparaissent des répertoires représentant les zones du noyau, contenant des fichiers virtuels lisibles et inscriptibles .
    Par exemple, un fichier virtuel couramment référencé est /proc/sys/net/ipv4/ip_forward , car il est nécessaire pour le routage des pare-feu ou des tunnels. Le fichier contient soit un '1' soit un '0' : s'il vaut 1, la pile IPv4 transfère les paquets qui ne sont pas destinés à l'hôte local, s'il vaut 0, ce n'est pas le cas.
  • /proc/sysvipc , contenant des informations sur le partage de mémoire et la communication inter-processus (IPC).
  • /proc/tty , contenant des informations sur les terminaux actuels ; /proc/tty/driver semble être une liste des différents types de tty disponibles - chacun étant une liste de ceux de chaque type
  • /proc/uptime , la durée d'exécution du noyau depuis le démarrage et passé en mode inactif (tous deux en secondes)
  • /proc/version , contenant la version du noyau Linux, le numéro de distribution, le numéro de version gcc (utilisé pour construire le noyau) et toute autre information pertinente relative à la version du noyau en cours d'exécution
  • d'autres fichiers en fonction de divers matériels, configurations de module et modifications apportées au noyau.

Les utilitaires de base qui utilisent /proc sous Linux sont fournis dans le package procps ( / procprocess ) et ne fonctionnent qu'en conjonction avec un /proc monté .

CYGWIN

Cygwin a implémenté un procfs qui est fondamentalement le même que le procfs Linux.

Extensions propriétaires

Plusieurs entreprises et projets ont ajouté des fonctions supplémentaires à /proc pour leurs systèmes, par exemple /proc/lcd , pourrait être un fichier contenant le contenu de l'écran LCD du panneau avant. Le texte écrit dans ce fichier serait affiché à l'écran.

Les références

Liens externes