Linux-Mandrake: |
Guide de l'utilisateur |
et Manuel de référence |
MandrakeSoft
Janvier 2000 http://www.linux-mandrake.com
/proc
Le système de fichiers /proc
est une spécificité de
Linux. C'est un système de fichiers virtuel, et en tant que tel
il ne prend aucun espace disque. C'est un moyen très pratique d'obtenir
des informations sur le système, d'autant plus que la plupart des
fichiers dans ce répertoire sont lisibles (enfin, avec un peu
d'habitude). Beaucoup de programmes, en fait, collectent des
informations depuis des fichiers de /proc
, les formatent à leur
façon puis les affichent. C'est le cas pour tous les programmes qui
affichent des informations sur les processus, et nous en avons déjà vu
quelques-uns (top
, ps
et autres). /proc
est
aussi une bonne source d'informations sur votre matériel, et de la même
façon, bon nombre de programmes sont en fait des interfaces pour les
informations contenues dans /proc
.
Il existe également un sous-répertoire spécial, /proc/sys
. Il
permet de changer certains paramètres du noyau en temps réel ou d'en
consulter.
Si vous listez le contenu du répertoire /proc
, vous verrez
beaucoup de répertoires dont le nom est un nombre. Ce sont les
répertoires contenant les informations sur tous les processus
fonctionnant à l'instant donné sur le système:
$ ls -d /proc/[0-9]*
/proc/1/ /proc/302/ /proc/451/ /proc/496/ /proc/556/ /proc/633/
/proc/127/ /proc/317/ /proc/452/ /proc/497/ /proc/557/ /proc/718/
/proc/2/ /proc/339/ /proc/453/ /proc/5/ /proc/558/ /proc/755/
/proc/250/ /proc/385/ /proc/454/ /proc/501/ /proc/559/ /proc/760/
/proc/260/ /proc/4/ /proc/455/ /proc/504/ /proc/565/ /proc/761/
/proc/275/ /proc/402/ /proc/463/ /proc/505/ /proc/569/ /proc/769/
/proc/290/ /proc/433/ /proc/487/ /proc/509/ /proc/594/ /proc/774/
/proc/3/ /proc/450/ /proc/491/ /proc/554/ /proc/595/
Notez qu'en tant qu'utilisateur, vous ne pouvez (fort logiquement)
afficher les informations que sur vos propres processus. Mettons-nous
donc en tant que root
et voyons quelle information est
disponible depuis le processus 127:
$ su
Password:
$ cd /proc/127
$ ls -l
total 0
-r--r--r-- 1 root root 0 d c 14 19:53 cmdline
lrwx------ 1 root root 0 d c 14 19:53 cwd -> //
-r-------- 1 root root 0 d c 14 19:53 environ
lrwx------ 1 root root 0 d c 14 19:53 exe -> /usr/sbin/apmd*
dr-x------ 2 root root 0 d c 14 19:53 fd/
pr--r--r-- 1 root root 0 d c 14 19:53 maps|
-rw------- 1 root root 0 d c 14 19:53 mem
lrwx------ 1 root root 0 d c 14 19:53 root -> //
-r--r--r-- 1 root root 0 d c 14 19:53 stat
-r--r--r-- 1 root root 0 d c 14 19:53 statm
-r--r--r-- 1 root root 0 d c 14 19:53 status
$
Chaque répertoire contient les mêmes entrées. Voici une brève description de quelques-unes de ces entrées:
cmdline
: Ce (pseudo-)fichier contient l'intégralité de la
ligne de commande utilisée pour invoquer le processus. Elle n'est pas
formatée: il n'y a aucun espace entre le programme et ses arguments, et
il n'y a pas non plus de saut de ligne à la fin du fichier.
cwd
: Ce lien symbolique pointe sur le répertoire de travail
en cours ("current working directory" en anglais, d'où le nom)
du processus.
environ
: Ce fichier contient toutes les variables
d'environnement pour le processus, sous la forme VARIABLE=valeur
.
De même que pour cmdline
, la sortie n'est pas formatée du tout:
pas de saut de ligne pour séparer les différentes variables, et pas de
saut de ligne à la fin non plus.
exe
: C'est un lien symbolique pointant sur le fichier
exécutable correspondant au processus en cours d'exécution.
fd
: Ce sous-répertoire contient la liste de tous les
descripteurs de fichiers actuellement ouverts par le processus. Voyez
ci-dessous.
maps
: Quand vous affichez le contenu de ce tube nommé (avec
cat
par exemple), vous pouvez voir toutes les parties de
l'espace d'adressage du processus qui sont actuellement des projections
en mémoire de fichiers. Les champs, de gauche à droite, sont: la plage
d'adresses de la projection mémoire, les permissions associées à cette
projection, le décalage depuis le début du fichier où commence la
projection, le périphérique sur lequel le fichier projeté se trouve, le
numéro d'i-noeud du fichier, et enfin le nom du fichier lui-même.
Voyez mmap(2)
.
root
: C'est un lien symbolique qui pointe sur le répertoire
racine utilisé par le processus. Habituellement, ce sera /
, mais
voyez chroot(2)
.
status
: Ce fichier contient diverses informations sur le
processus: le nom de l'exécutable, son état actuel, son PID et son
PPID, ses UID et GID réels et effectifs, son occupation mémoire
et autres.Si nous listons le contenu du répertoire fd
, nous obtenons ceci:
$ ls -l fd
total 0
lrwx------ 1 root root 64 déc 16 22:04 0 -> /dev/console
l-wx------ 1 root root 64 déc 16 22:04 1 -> pipe:[128]
l-wx------ 1 root root 64 déc 16 22:04 2 -> pipe:[129]
l-wx------ 1 root root 64 déc 16 22:04 21 -> pipe:[130]
lrwx------ 1 root root 64 déc 16 22:04 3 -> /dev/apm_bios
lr-x------ 1 root root 64 déc 16 22:04 7 -> pipe:[130]
lrwx------ 1 root root 64 déc 16 22:04 9 -> /dev/console
$
C'est en fait la liste des descripteurs de fichiers ouverts par le processus. Chaque descripteur ouvert est matérialisé par un lien symbolique dont le nom est le numéro du descripteur, et qui pointe sur le fichier ouvert par le biais de ce descripteur[18]. Vous pouvez également remarquer les permissions des liens symboliques: c'est le seul endroit où elles ont un sens pour les liens symboliques, puisqu'elles sont le reflet des droits avec lesquels le fichier correspondant au descripteur a été ouvert.
Outre les répertoires des différents processus, /proc
contient
aussi une foule de renseignements sur le matériel présent sur votre
machine. Une liste des fichiers du répertoire /proc
donne ceci:
$ ls -d [a-z]*
apm dma interrupts loadavg mounts rtc swaps
bus/ fb ioports locks mtrr scsi/ sys/
cmdline filesystems kcore meminfo net/ self/ tty/
cpuinfo fs/ kmsg misc partitions slabinfo uptime
devices ide/ ksyms modules pci stat version
$
Par exemple, si nous regardons le contenu de interrupts
,
nous pouvons constater qu'il contient la liste des interruptions
actuellement utilisées par le système, ainsi que le périphérique qui les
occupe. De même, ioports
contiendra la liste des plages
d'entrée/sortie actuellement occupées, et enfin dma
fait de même
avec les canaux DMA. Donc, si vous voulez repérer un conflit,
regardez le contenu de ces trois fichiers:
$ cat interrupts
CPU0
0: 127648 XT-PIC timer
1: 5191 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 1402 XT-PIC xirc2ps_cs
8: 1 XT-PIC rtc
10: 0 XT-PIC ESS Solo1
12: 2631 XT-PIC PS/2 Mouse
13: 1 XT-PIC fpu
14: 73434 XT-PIC ide0
15: 80234 XT-PIC ide1
NMI: 0
$ cat ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
0300-030f : xirc2ps_cs
0376-0376 : ide1
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(auto)
1050-1057 : ide0
1058-105f : ide1
1080-108f : ESS Solo1
10c0-10cf : ESS Solo1
10d4-10df : ESS Solo1
10ec-10ef : ESS Solo1
$ cat dma
4: cascade
$
Ou, plus simplement, utilisez la commande lsdev
, qui regroupe
les informations de ces trois fichiers et classe les informations par
périphérique, ce qui est quand même nettement plus
pratique[19]:
$ lsdev
Device DMA IRQ I/O Ports
------------------------------------------------
cascade 4 2
dma 0080-008f
dma1 0000-001f
dma2 00c0-00df
ESS 1080-108f 10c0-10cf 10d4-10df 10ec-10ef
fpu 13 00f0-00ff
ide0 14 01f0-01f7 03f6-03f6 1050-1057
ide1 15 0170-0177 0376-0376 1058-105f
keyboard 1 0060-006f
Mouse 12
pic1 0020-003f
pic2 00a0-00bf
rtc 8 0070-007f
serial 03f8-03ff
Solo1 10
timer 0 0040-005f
vga+ 03c0-03df
xirc2ps_cs 5 0300-030f
$
Une énumération complète des fichiers présents serait trop longue, néanmoins voici la description de quelques-uns d'entre eux:
cpuinfo
: Ce fichier contient, comme son nom l'indique (en
anglais), des informations sur le ou les processeur(s) présent(s) sur
votre machine.
modules
: Ce fichier contient la liste des modules
actuellement utilisés dans le noyau ainsi que leur compteur
d'utilisations. En fait, c'est la même information que celle reportée
par la commande lsmod
.
meminfo
: Ce fichier contient des informations sur
l'utilisation qui est faite de la mémoire à l'instant où vous affichez
son contenu. Une sortie plus clairement formatée est disponible avec la
commande free
.
apm
: Si vous avez un ordinateur portable, afficher le
contenu de ce fichier vous permet de voir l'état de votre batterie. Vous
pouvez savoir si l'alimentation externe est branchée, la charge courante
de votre batterie, et si le BIOS APM de votre portable le
permet (malheureusement ce n'est pas le cas de tous), la durée de vie
restante, en minutes. Le fichier n'est pas très lisible en tant que tel,
vous aurez donc avantage à utiliser la commande apm
à la
place, qui donne les mêmes informations dans un format plus lisible (si
on comprend l'anglais...).
bus
: Ce sous-répertoire contient des informations sur tous
les périphériques trouvés sur les différents bus de votre machine. Les
informations qu'il renferme sont en général peu lisibles, et sont pour
la plupart traitées et remises en forme par des utilitaires externes:
lspcidrake
, lspnp
, etc./proc/sys
Le rôle de ce sous-répertoire est de reporter différents paramètres du
noyau, et de pouvoir changer en temps réel certains de ces paramètres. A
la différence de tous les autres fichiers dans /proc
, certains
fichiers de ce répertoire sont accessibles en écriture, mais par
root
seulement.
Une liste des répertoires et fichiers présents serait trop longue, d'autant plus qu'ils dépendront en grande partie de votre système d'une part, et que la plupart des fichiers ne seront utiles que pour des programmes hautement spécialisés. Voici toutefois trois utilisations courantes de ce sous-répertoire:
root
:
$ echo 1 >/proc/sys/net/ipv4/ip_forward
Remplacez le 1 par un 0 si vous voulez interdire le routage.
$ echo 1 >/proc/sys/net/ipv4/conf/all/rp_filter
et ce type d'attaque devient impossible.
$ echo 8192 >/proc/sys/fs/file-max
$ echo 16384 >/proc/sys/fs/inode-max
Pour que ces paramètres soient appliqués dès le démarrage du système,
vous voudrez sans doute rajouter ces deux lignes dans
/etc/rc.d/rc.local
pour vous éviter d'avoir à les retaper à
retaper à chaque fois.