# Sysfs

Sysfs est un système de fichiers virtuel introduit par le noyau Linux 2.6. Sysfs permet d'exporter depuis l'espace noyau vers l'espace utilisateur des informations sur les périphériques du système et leurs pilotes, et est également utilisé pour configurer certaines fonctionnalités du noyau.

## Histoire

Pendant le cycle de développement du noyau 2.5 (branche expérimentale qui deviendra le noyau 2.6), le modèle de pilote Linux a été introduit afin de pallier certaines déficiences du noyau 2.4 :
* Il n'existe aucune méthode de représentation unifiée des relations pilote/périphérique.
* Il n'existe aucun mécanisme générique de 'branchement à chaud' (hotplug en anglais).
* Procfs était encombré d'une foule d'informations non liées aux processus.
Sysfs a été conçu pour exporter les informations présentes dans l'arbre des périphériques qui ainsi n'encombrerait plus procfs. Il a été écrit par Patrick Mochel. Maneesh Soni a plus tard écrit un patch permettant l'utilisation de la mémoire de masse par sysfs afin de réduire son empreinte en mémoire vive sur les gros systèmes.
Sysfs est un système de fichiers en mémoire qui était au départ basé sur ramfs. Ramfs a été écrit pendant la stabilisation du noyau 2.4.0. Grâce à sa simplicité et à l'utilisation de VFS, il fournit une excellente base afin d'en dériver pour créer de nouveaux systèmes de fichiers en mémoire.
Sysfs fut d'abord appelé ddfs (Device Driver Filesystem, système de fichiers pour pilotes de périphériques en anglais) et créé dans le but de debugger le nouveau modèle de pilote pendant son écriture. Auparavant, le debug était effectué en utilisant procfs pour exporter un arbre des périphériques, mais sous les recommandations insistantes de Linus Torvalds, il a été décidé d'utiliser un nouveau système de fichiers basé sur ramfs. Au moment de l'intégration au noyau 2.5.1 de ce nouveau modèle de pilote, il a pris le nom de driverfs.
Durant l'année suivante de développement de la branche 2.5 du noyau, les capacités de l'infrastructure du modèle de pilote et de driverfs ont commencé à se montrer très utiles aux autres sous-systèmes. kobjects a été développé afin de fournir un mécanisme de gestion centralisée des objets et driverfs a été renommé sysfs afin d'exprimer son ignorance des sous-systèmes sur lesquels il repose.

## Vue d'ensemble technique

Pour chaque objet ajouté dans l'arbre des modèles de pilote (pilotes, périphériques, classes de périphériques), un répertoire est créé dans sysfs. La relation parent/enfant est représentée sous la forme de sous-répertoires dans /sys/devices/ (représentant la couche physique). Le sous-répertoire /sys/bus/ est peuplé de liens symboliques, représentant la manière dont chaque périphérique appartient aux différents bus. /sys/class/ montre les périphériques regroupés en classes, comme les périphériques réseau par exemple, pendant que /sys/block/ contient les périphériques de type bloc.
Pour les périphériques et leurs pilotes, des attributs peuvent être créés. Ce sont de simples fichiers, la seule contrainte est qu'ils ne peuvent contenir chacun qu'une seule valeur et/ou n'autoriser le renseignement que d'une valeur (au contraire de certains fichiers de procfs, qui nécessitent d'être longuement parcourus). Ces fichiers sont placés dans le sous-répertoire du pilote correspondant au périphérique. L'utilisation de groupes d'attributs est possible en créant un sous-répertoire peuplé d'attributs.

## Quelques bus
### PCI

Exporte les informations à propos des périphériques PCI.

### USB

Contient à la fois les informations sur les hôtes et les périphériques USB.

## Sysfs et l'espace utilisateur

Sysfs est utilisé par quelques utilitaires pour accéder aux informations concernant le matériel et ses pilotes (des modules du noyau, comme udev ou HAL par exemple). Des scripts ont été écrits pour accéder aux informations obtenues précédemment via procfs, et certains scripts permettent la configuration du matériel et de leur pilote via leurs attributs.