/proc
. Nota :
Contributeurs, les sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
C'est le répertoire contenant toutes les informations sur le fonctionnement du processeur en direct live !
Ces informations créent des fichiers virtuels qui vont disparaître au prochain arrêt du pc.
Le répertoire /proc ne représente pas de vrais fichiers, mais est simplement une interface entre le noyau et l'utilisateur.
Il permet d'obtenir facilement des informations sur le paramétrage du noyau et permet également de le changer.
Cet article va vous faire découvrir les subtilités de ce système de fichiers et va également tenter de remédier au manque de documentation en français sur le sujet.
Le répertoire /proc étant relativement peuplé, nous allons examiner ici les divers fichiers et répertoires qui l'habitent.
Il est vivement conseillé au lecteur d'examiner les fichiers correspondants sur son système en cours de lecture.
Ceci étant dit, entrons maintenant dans le vif du sujet.
Le répertoire /proc
contient un grand nombre de fichiers et de sous-répertoires.
Examinons tout d'abord les fichiers contenus dans le premier niveau de l'arborescence.
Ces fichiers décrivent la configuration matérielle et l'état du système.
cat /proc/meminfo
et
free
/proc contient également un certain nombre de répertoires dont le nom est un nombre.
Il y en a un par processus en cours d'exécution sur le système et chacun d'entre eux contient des fichiers et répertoires qui donnent un certain nombre d'informations sur le processus en question.
Notons au passage qu'un lien nommé self pointe automatiquement vers le répertoire contenant les informations sur le processus courant; ainsi :
ls -al /proc/self
listera le contenu du répertoire contenant les informations sur le processus ls en cours.
ls -l /proc/2441
total 0 -r--r--r-- 1 root root 0 sep 29 16:34 cmdline lrwx------ 1 root root 0 sep 29 16:34 cwd -> /root -r-------- 1 root root 0 sep 29 16:34 environ lrwx------ 1 root root 0 sep 29 16:34 exe -> /bin/bash dr-x------ 2 root root 0 sep 29 16:34 fd pr--r--r-- 1 root root 0 sep 29 16:34 maps -rw------- 1 root root 0 sep 29 16:34 mem lrwx------ 1 root root 0 sep 29 16:34 root -> / -r--r--r-- 1 root root 0 sep 29 16:34 stat -r--r--r-- 1 root root 0 sep 29 16:34 statm -r--r--r-- 1 root root 0 sep 29 16:34 status
Examinons les lignes une par une :
ls -l /proc/2441/fd
total 0 lrwx------ 1 root root 64 sep 29 16:46 0 -> /dev/pts/1 lrwx------ 1 root root 64 sep 29 16:46 1 -> /dev/pts/1 lrwx------ 1 root root 64 sep 29 16:46 2 -> /dev/pts/1 lrwx------ 1 root root 64 sep 29 16:46 255 -> /dev/pts/1 lrwx------ 1 root root 64 sep 29 16:46 4 -> socket:[177]
Les trois premiers descripteurs de fichiers (0, 1, 2) correspondent aux flux standards et seront présents pour quasiment tous les processus :
08048000-080c0000 r-xp 00000000 03:08 29952 /bin/bash [...] 40000000-40015000 r-xp 00000000 03:08 33989 /lib/ld-2.1.92.so 40015000-40017000 rw-p 00014000 03:08 33989 /lib/ld-2.1.92.so 40029000-4002c000 r-xp 00000000 03:08 33944 /lib/libtermcap.so.2.0.8 4002c000-4002d000 rw-p 00002000 03:08 33944 /lib/libtermcap.so.2.0.8 4002d000-4002f000 r-xp 00000000 03:08 33995 /lib/libdl-2.1.92.so 4002f000-40030000 rw-p 00001000 03:08 33995 /lib/libdl-2.1.92.so 40030000-40147000 r-xp 00000000 03:08 33991 /lib/libc-2.1.92.so 40147000-4014d000 rw-p 00116000 03:08 33991 /lib/libc-2.1.92.so [...] 40186000-40187000 rw-p 00000000 00:00 0 bfffb000-c0000000 rwxp ffffc000 00:00 0
Examinons de plus près la signification de chaque ligne :
cat /proc/2441/status
Name: bash State: S (sleeping) Pid: 222 PPid: 220 Uid: 0 0 0 0 Gid: 0 0 0 0 Groups: 0 VmSize: 2360 kB VmLck: 0 kB VmRSS: 1392 kB VmData: 260 kB VmStk: 20 kB VmExe: 480 kB VmLib: 1416 kB SigPnd: 0000000000000000 SigBlk: 0000000000010000 SigIgn: 8000000000384004 SigCgt: 000000004b813efb CapInh: 0000000000000000 CapPrm: 00000000fffffeff CapEff: 00000000fffffeff
Examinons une par une la signification de chaque ligne :
Les sept lignes suivantes concernent l'utilisation mémoire :
Les lignes restantes se réfèrent aux signaux et capacités du processus; nous ne décrirons ici que les caractéristiques principales.
Examinons maintenant chacun des sous-répertoires plus en détail :
Ce répertoire contient des informations à propos de tous les périphériques IDE connus par le noyau. Il contient :
cat /proc/ide/drivers
ide-cdrom version 4.58 ide-disk version 1.10
Les informations plus détaillées sont disponibles dans les sous-répertoires spécifiques à chaque contrôleur.
Ceux-ci sont nommés ide0, ide1, etc.
Parmi les fichiers contenus dans ces sous-répertoires, on note en particulier :
capacity : taille du disque en secteurs de 512 octets.
cat /proc/ide/ide0/hda/capacity
12692736
Et :
bc -ql
12692736*512/1024 6346368
On a donc affaire à un disque de 6.3 Go.
Géométries physique et logique des disques.
cat /proc/ide/ide0/hda/geometry
physical 12592/16/63 logical 12592/16/63
Contient disk ou cdrom selon le cas.
Contient le modèle et la marque du périphérique.
cat /proc/ide/ide0/hda/model
IBM-DHEA-36481
Informations complètes sur la configuration du périphérique
Le sous-répertoire net contient des informations sur la configuration réseau et son usage.
En particulier, le contenu du fichier dev pourra être utilisé pour déterminer quels sont les périphériques réseaux disponibles sur la machine ainsi que le nombre de paquets reçus et envoyés par chaque interface.
Seuls les fichiers les plus importants sont mentionnés dans la liste ci-dessous :
Dans le cas où le support pour IPv6 est compilé dans le noyau, un certain nombre de fichiers supplémentaires avec un nom terminé par le chiffre 6 apparaîtront dans le répertoire. Ils remplissent le même rôle, mais décrivent la configuration IPv6 et non plus IPv4 comme ceux que nous venons de décrire.
Si vous avez une carte SCSI, le répertoire /proc/scsi
contiendra un répertoire dont le nom correspond au type de carte.
Celui-ci contient un sous-répertoire par périphérique de ce type présent sur votre machine.
ls -l /proc/scsi/
dr-xr-xr-x 2 root root 0 Apr 28 17:47 ncr53c7xx -rw-r-r- 1 root root 0 Apr 28 17:47 scsi
Le fichier /proc/scsi/scsi
contient quant à lui la liste complète de tous les périphériques SCSI pris en charge par le système.
cat /proc/scsi/scsi
Attached devices: Host: scsi0 Channel: 00 Id: 00 Lun: 00 Vendor: RICOH Model: MP6200S Rev: 1.20 Type: CD-ROM ANSI SCSI revision: 02
Ici, le seul périphérique SCSI reconnu est un lecteur de CD-Rom.
Ce répertoire contient les informations sur les ports parallèles du système.
Il contient un sous-répertoire, dont le nom est le numéro du port (la numérotation débutant à zéro).
Chacun de ces répertoire contient quatre fichiers :
Les informations à propos des terminaux virtuels disponibles et en cours d'utilisation sont disponibles dans ce répertoire et ses sous-répertoires.
cat /proc/tty/driver/serial
serinfo:1.0 driver:5.02 revision:2000-08-09 0: uart:16550A port:3F8 irq:4 baud:9600 tx:0 rx:0 1: uart:16550A port:2F8 irq:3 baud:9600 tx:0 rx:4453 RTS|DTR 2: uart:unknown port:3E8 irq:4 [...]
Modification dynamique des paramètres du noyau
Le répertoire /proc/sys
est une source d'information très importante, mais également un moyen de modifier les paramètres du noyau en cours d'utilisation.
Les fichiers contenus dans /proc/sys
et ses sous-répertoires peuvent être utilisés pour paramétrer finement un grand nombre de choses.
Notons également que l'utilisation de certains paramètres change subtilement d'une version de noyau à une autre.
C'est le noyau 2.2.13 qui a servi de base à cet article; ceux d'entre vous qui utilisent déjà un noyau 2.3.x ou encore un noyau 2.0.y pourront donc également noter l'apparition ou la disparition de certains fichiers.
Le fichier file-max détermine le nombre maximum de fichiers ouvrables simultanément par le système. Dans le cas où cette valeur soit trop faible (sur un serveur assez chargé par exemple), il est possible de la changer dynamiquement en écrivant une nouvelle valeur dans ce fichier.
cat /proc/sys/fs/file-max
echo 6000 > /proc/sys/fs/file-max
cat /proc/sys/fs/file-max
Le fichier file-nr quant à lui contient trois nombres qui correspondent respectivement :
Il est important de noter que ces limites sont globales au système.
Le nombre maximum de fichiers ouverts simultanément par un seul processus est limité à 1024, et il est sensiblement plus difficile de changer cette limitation.
Il faut pour cela modifier la valeur des macros NR_OPEN dans les fichiers fs.h et limits.h, puis augmenter la valeur de la macro NR_FILE dans fs.h (ces fichiers se trouvant dans les sources du noyau), puis recompiler celui-ci.
Tout comme pour les descripteurs de fichiers, le noyau alloue dynamiquement l'espace nécessaire pour stocker les i-nodes, mais ne peut pas le désallouer.
La valeur contenue dans le fichier inode-max est le nombre maximum de descripteurs de i-nodes.
Cette valeur doit être trois à quatre fois supérieure à la valeur de file-max dans la mesure où stdin, stdout et les sockets utilisent chacun un descripteur de i-node.
Seules les trois premières valeurs de inode-state sont utilisées; elles correspondent à :
Nombre de i-nodes actuellement allouées.
Le nombre peut être légèrement supérieur à inode-max dans la mesure où les i-nodes sont allouées par page mémoire complète.
Nombre de i-nodes non utilisées.
Cette valeur est non nulle lorsque nr_inodes est supérieur à inode-max; le système essayera de recycler les i-nodes non utilisées au lieu d'en allouer de nouvelles.
Le fichier inode-nr contient simplement les deux premières valeurs de inode-state.
En dehors des fichiers précédemment cités, le répertoire sys/fs contient également le sous-répertoire binfmt_misc qui permet de contrôler les types d'exécutables reconnus par le noyau.
binfmt_misc permet de déclarer de nouveaux types de fichiers exécutables au noyau sans avoir à le recompiler. Le système fonctionne en repérant les exécutables soit par nombre magique (“magic number” en anglais) ou soit par extension du nom de fichier.
Une fois que le noyau a reconnu un type d'exécutable, l'interpréteur associé sera invoqué avec le nom du fichier exécutable passé en paramètre.
Le répertoire binfmt_misc contient les fichiers register et status, plus un fichier par format déclaré.
La syntaxe standard pour déclarer un nouveau type d'exécutable est la suivante :
echo :nom:type:offset:magic:mask:interpréteur > /proc/sys/fs/binfmt_misc/register
Un exemple valant mieux qu'un long discours, voyons comment utiliser ce système pour permettre au noyau d'exécuter directement des applications Windows (grâce à l'émulateur Wine) et des scripts Python.
echo ':DOSWin:M::MZ::/usr/bin/wine:' > /proc/sys/fs/binfmt_misc/register
echo ':Python:E::py::/usr/bin/python:' > /proc/sys/fs/binfmt_misc/register
La lettre `M' ou `E' indique si le repère pour déterminer le type du fichier sera son magic numer ou l'extension du nom de fichier (les deux premiers caractères d'un exécutable Windows sont toujours MZ).
ls -al /proc/sys/fs/binfmt_misc/
dr-xr-xr-x 2 root root 0 May 1 16:55 . dr-xr-xr-x 3 root root 0 May 1 16:55 .. -rw-r--r-- 1 root root 0 May 1 16:55 DOSWin -rw-r--r-- 1 root root 0 May 1 16:55 Python -w-------- 1 root root 0 May 1 16:55 register -rw-r--r-- 1 root root 0 May 1 16:55 status
cat /proc/sys/fs/binfmt_misc/Python
enabled interpreter /usr/bin/python extension .py
Essayons maintenant d'exécuter directement un script Python.
cat > test.py print 'hello'
^D
chmod +x test.py
./test.py
hello Ca marche !
Le fichier status quant à lui permet de déterminer si la fonctionnalité binfmt_misc est activée ou non.
cat /proc/sys/fs/binfmt_misc/status
enabled
Vous pouvez de même changer cette valeur en écrivant 0 (désactiver) ou 1 (activer) dans ce fichier.
Chaque format enregistré crée un fichier dans le répertoire binfmt_misc.
Ceux-ci ont la même fonction que le fichier status, à la différence qu'ils ne s'appliquent par à la fonctionnalité, mais seulement au format en question.
Ce répertoire contient les paramètres qui régissent le fonctionnement général du noyau.
Ce fichier (présent si et seulement si l'accounting BSD est activé) contient trois valeurs :
Elles permettent d'éviter l'engorgement du système de fichiers par le fichier d'historique.
Si le système de fichiers où se situe l'historique contient moins de `low' pourcents de place libre, l'accounting sera suspendu jusqu'à ce que la valeur repasse au-dessus de la barre des `high' pourcents.
Le paramètre `frequency' correspond à l'intervalle de temps (en secondes) entre chaque vérification de l'espace libre disponible. Les valeurs par défaut sont 2, 4 et 30.
Si la valeur contenue dans ce fichier est 0, la pression simultanée des touches
Ctrl+Alt+Suppr
est transmise au processus init.
Si cette valeur est supérieure à zéro, le noyau lancera un reboot immédiatement, sans démonter les systèmes de fichiers.
Lorsqu'un programme (comme dosemu) utilise le clavier en mode “raw”, alors c'est lui qui intercepte la combinaison Ctrl+Alt+Suppr et qui décide ce qui doit être fait.
Ces fichiers contrôlent les domaines NIS et nom d'hôte de votre machine.
Comme leur nom l'indique, ces fichiers contiennent respectivement le numéro de version, le nom du système et la version exacte du noyau :
cat /proc/sys/kernel/osrelease
2.2.13
et :
cat /proc/sys/kernel/ostype
Linux
et enfin :
cat /proc/sys/kernel/version
#6 Sun Apr 16 23:20:59 CEST 2000
Si les deux premiers fichiers n'appellent pas de commentaires, attardons-nous sur le dernier :
La valeur contenue dans ce fichier représente le nombre de secondes que le noyau attend pour rebooter après un “kernel panic”.
Si vous utilisez un watchdog logiciel, la valeur recommandée est 60.
La valeur par défaut est 0, ce qui désactive le reboot.
Les quatre valeurs contenues dans ce fichier correspondent respectivement à :
Ce fichier montre la taille du tampon du pilote SCSI.
Pour le moment, la seule manière de changer sa valeur consiste à changer la valeur de SG_BIG_BUFF dans le fichier :
include/scsi/sg.h
puis à recompiler le noyau.
L'emplacement où l'exécutable modprobe est situé.
Le noyau utilise ce paramètre pour charger les modules à la demande.
Les fichiers de ce répertoire permettent de paramétrer le fonctionnement de la gestion de la mémoire virtuelle du noyau. Certains de ces fichiers, comme bdflush, ont également une influence sur l'utilisation du disque.
bdflush est le système qui met à jour les fichiers sur les disques en fonction des modifications effectuées sur leur copie dans le cache disque du noyau.
En effet, lorsqu'un fichier est ouvert en lecture ou en écriture, Linux en charge une copie en mémoire ce qui permet d'accélérer grandement les opérations d'écriture, car en général les mêmes opérations sont répétées sur un même fichier (par exemple : le fichier contenant une page très demandée d'un serveur Web).
La modification des paramètres qui vont être décrits n'a en général que peu d'intérêt sur une machine personnelle, mais peut considérablement améliorer les performances sur un serveur à condition d'utiliser des valeurs judicieuses.
A vous d'expérimenter et de trouver les valeurs qui correspondent le mieux à votre machine.
Dans le doute, vous pouvez conserver les valeurs par défaut qui donnent généralement d'assez bons résultats.
Ce fichier contrôle le fonctionnement de la thread kernel bdflush. Il contient actuellement neuf nombres dont seuls six sont actuellement utilisés.
Les deux derniers champs ne sont pas utilisés.
Les trois valeurs que contient ce fichier contrôlent la quantité de mémoire qui doit être utilisée.
Ce sont des pourcentages par rapport à la quantité totale de mémoire.
Ce fichier contient trois valeurs.
kswapd est le nom du programme de swap, c'est-à-dire celui qui copie certaines parties de la mémoire virtuelle sur disque lorsque la mémoire physique est pleine.
Etant donné que chaque système a des besoins différents, vous pourrez avoir à changer les paramètres par défaut dans le cas d'un serveur chargé.
Le fichier kswapd contient trois valeurs :
Ce fichier contient une seule valeur qui détermine la conduite à utiliser pour l'allocation de la mémoire. Si la valeur est positive, alors le système considère qu'il y a toujours assez de mémoire disponible.
Cette fonctionnalité est utile dans la mesure où les programmes réservent (grâce à la fonction malloc) de grandes quantités de mémoire qu'ils n'utilisent pas toujours.
Si vous laissez cette valeur à zéro, cela risque de conduire à l'échec d'un malloc de grande quantité de mémoire alors que le programme aurait eu assez de mémoire pour fonctionner.
Cependant, si la valeur est changée pour 1, vous pouvez provoquer un épuisement de la mémoire du système.
Ce répertoire contient les paramètres spécifiques aux périphériques.
Actuellement, seuls les lecteurs de CD-Rom sont supportés, et les informations sont regroupées dans un seul fichier.
cat /proc/sys/dev/cdrom/info
CD-ROM information, Id: cdrom.c 2.56 1999/09/09 drive name: hdb drive speed: 40 drive # of slots: 0 Can close tray: 1 Can open tray: 1 Can lock tray: 1 Can change speed: 1 Can select disk: 0 Can read multisession: 1 Can read MCN: 1 Reports media changed: 1 Can play audio: 1
Chaque ligne étant suffisamment explicite, nous ne détaillerons pas plus.
Ce répertoire contient quatre fichiers qui activent ou désactivent le débogage pour les principales fonctions RPC :
La valeur par défaut est zéro (débogage désactivé) et peut être changée pour 1 (activation du débogage).
L'interface comprenant les fonctionnalités réseau du noyau est située dans ce répertoire.
Celui-ci peut contenir un grand nombre de répertoires.
Voici les principaux d'entre eux.
Nous allons ici nous concentrer uniquement sur l'aspect TCP/IP, les autres types de réseaux étant beaucoup moins courants.
Bien qu'il soit également possible de changer la majorité des paramètres, il est extrêmement déconseillé de le faire :
Les fichiers de ce répertoire correspondent aux caractéristiques communes à tous les types de réseaux, principalement les tailles des tampons.
IP version 4 est le protocole réseau le plus utilisé actuellement.
Il devrait cependant être remplacé par IP version 6 d'ici quelques années.
Du fait de l'importance et de la relative complexité de ce protocole, sa configuration est étalée sur plusieurs sous-répertoires.
Commençons par les fichiers qui sont situés directement dans le répertoire /proc/sys/net/ipv4.
icmp_echo_ignore_all, icmp_echo_ignore_broadcast
La valeur contenue dans ces fichiers contrôle si le noyau ignore (0) ou répond (1) à toutes les demandes ICMP ECHO (utilisées principalement par la commande ping) ou seulement celles destinées aux adresses de broadcast et de multicast.
icmp_destunreach_rate, icmp_echoreply_rate, icmp_paramprob_rate, icmp_timeexceed_rate
Définit les limites pour envoyer les différents types de paquets ICMP.
Seuls les fichiers les plus importants sont mentionnés dans cette section.
Ce fichier donne deux informations :
Voici un exemple de fichier loadavg :
0.99 0.93 0.87 1/202 4027
Les trois premières colonnes mesurent l'utilisation de l'unité centrale en fonction des dernières périodes de 1, 5 et 10 minutes.
La quatrième colonne indique le nombre de processus en cours d'exécution et le nombre total de processus.
La dernière colonne affiche le dernier ID de processus utilisé.
Source :
Références :
Fichier Documentation/filesystems/proc.txt dans les sources du noyau (qui a été d'une grande aide pour la rédaction de cet article qui s'en est largement inspiré). Le code source du système de fichiers /proc dans les sources du noyau se trouve dans le répertoire fs/proc.
Merci à :
Pour son article parût dans : Linux Magazine France n° 18 - Juin 00