L’interface d’appels système : strace et trace
A l’instar des langages évolués, le système d’exploitation effectue un certain nombre d’appels système tels que l’ouverture ou la fermeture de fichier, la lecture d’interface spécifique… Il s’agit à ce niveau, de récolter les informations concernant l’ensemble de ces appels et de leurs statistiques.
On peut trouver des outils comme le traditionnel strace (équivalent de la commande ltrace des bibliothèques concernant les appels système effectués lors de l’exécution d’un script ou d’un programme quel qu’il soit).
Exemple : récupérer les appels effectués lors de la commande "getent passwd root" :
# strace /usr/bin/getent passwd root
Cela permet d’afficher l’ensemble des appels réalisés au travers du système d’exploitation pour procéder à l’exécution de la commande elle-même. Certains outils de statistiques et de performance ne sont pas forcément implémentés nativement sur une distribution GNU/Linux. C’est le cas par exemple, du logiciel allemand, issu de la firme KDAB : perf, fournissant une sortie statique des statistiques, au format fichier perf.data des différents appels système exécutés :
$ perf stat ./mypgm
Dans la même gamme de produit, on trouve également le traceur trace (aussi appelé LTT-ng ou Linux Trace Toolkit), pour lequel il suffit juste d’appeler la commande trace pour effectuer la collecte d’informations, durant une durée précisée en secondes :
$ trace 15 <Pgm>
REMARQUE : les différentes collectes sont récupérées au sein du fichier <Pgm>.trace dans le pseudo-système de fichiers /proc, dans une arborescence appelée <Pgm>.proc. Il est possible de visualiser ces informations grâce à la commande traceview.
Enfin, à ce niveau on trouve également un certain nombre d’outils issus de la couche eBPF/BCC permettant de s’intéresser tout particulièrement aux différents appels effectués :
- opensnoop
- statsnoop
- syncsnoop
- killsnoop
Ces derniers permettent généralement de tracer les différents appels système auquel ils sont liés. Par exemple, pour opensnoop, on comptabilise les appels de type open() en décrivant le fichier ouvert, son chemin complet et en récupérant au passage le descripteur de ce même fichier.
Exemple : tracer le processus n°81 ou pour remonter les appels échoués :
# opensnoop -p 81 # opensnoop -x
REMARQUE : le même genre de fonction existe aussi pour les appels stats(), sync() ou kill(). Elles s’appellent respectivement statsnoop, syncsnoop ou killsnoop.