SDB:Aperçu du système Hotplug sous SUSE LINUX
Version: 9.1 -
Aperçu du système Hotplug sous SUSE LINUX
Le système Hotplug (branchement à chaud) de SUSE Linux est dérivé du Linux Hotplug Project, bien qu'il se comporte d'une manière quelque peu différente. La principale différence est que l'on ne fait pas intervenir le multiplexeur d'événements (/etc/hotplug.d/), mais /sbin/hw{up,down}. Ce document décrit les différences entre les deux méthodes, ainsi que le système Hotplug de SUSE Linux complet.
Fonctionnement
Hotplug est utilisé partout
Le système Hotplug ne concerne pas seulement les périphériques que l'on peut connecter ou déconnecter, mais tous les périphériques détectés après le démarrage du noyau. Cela signifie qu'avant de démarrer Hotplug ou Coldplug, seuls les périphériques de base sont initialisés : le système de bus principal (PCI, le plus souvent), les lecteurs d'amorçage, le clavier, etc. Tous les périphériques gérés par Hotplug sont représentés dans 'sysfs'.
Périphériques et interfaces
Hotplug concerne les périphériques (devices) aussi bien que les interfaces. Dans ce document, nous ferons la distinction entre les périphériques et les interfaces vers des périphériques. Un périphérique constitue la partie qui est connectée à un type de bus ou à une interface donnés. Une interface correspond à ce qui est mis à disposition par ce périphérique pour connecter un autre périphérique ou une autre application. Dans 'sysfs', on trouve les périphériques dans /sys/devices. Les interfaces sont répertoriées dans le répertoire /sys/class ou /sys/block. Toutes les interfaces doivent avoir un lien vers leurs périphériques dans 'sysfs', mais il y a encore des pilotes qui n'ajoutent pas de lien.
Exemples :
- Une carte réseau PCI est un périphérique connecté au bus PCI (/sys/devices/pci0000:00/0000:00:1e.0/0000:02:00.0). Ce périphérique fournit une interface réseau qu'utilisent les services de réseau ou à laquelle les périphériques réseau virtuels (par exemple, un tunnel ou un VLAN) sont connectés (/sys/class/net/eth0).
- Un contrôleur SCSI PCI est un périphérique (/sys/devices/pci0000:20/0000:20:01.1) qui fournit différentes interfaces physiques sous la forme d'un bus (/sys/class/scsi_host/host1).
- Un disque dur SCSI est un périphérique (/sys/devices/pci0000:20/0000:20:01.1/host1/1:0:0:0) comportant plusieurs interfaces (/sys/block/sda*).
Événements Hotplug
Tous les autres périphériques et interfaces sont initialisés au moyen de Hotplug. Il existe pour chaque périphérique ou interface un événement Hotplug traité par les agents Hotplug appropriés. Les événements des périphériques Hotplug sont déclenchés de deux manières différentes :
- Par le noyau, quand la connexion à un périphérique est établie. Ici aussi, on trouve deux cas de figure :
+ Le bus ou l'interface à laquelle le périphérique a été connecté est déjà actif et le périphérique est connecté physiquement (USB, PCMCIA, parfois PCI, ...). Le pilote du bus génère un événement pour chaque périphérique connecté.
+ Le périphérique a déjà été connecté physiquement, mais le bus correspondant et/ou l'interface n'ont encore pas été initialisés. Si à présent le bus est initialisé, le pilote du bus analyse le bus à la recherche de tous les périphériques connectés et génère un événement pour chaque périphérique. - Par Coldplug, qui fait une nouvelle analyse des bus importants et génère des événements pour tous les périphériques qui n'ont toujours pas été initialisés.
Il y a en outre des événements d'interface qui sont déclenchés par le noyau dès qu'un pilote enregistre une interface.
Lorsqu'un événement Hotplug est généré, un outil Hotplug en mode utilisateur est invoqué ; il s'agit la plupart du temps de /sbin/hotplug. Le noyau appelle l'outil qui a été déclaré dans le fichier /proc/sys/kernel/hotplug. L'outil en mode utilisateur /sbin/hotplug cherche un agent Hotplug correspondant au type de l'événement. Lorsqu'il n'y a pas d'agent pour ce type d'événement et qu'il existe un fichier 'dev' dans le chemin d'accès au périphérique, il appelle 'generic_udev.agent'.
Lorsque des types d'événements donnés doivent toujours être ignorés, on peut leur associer la valeur HOTPLUG_SKIP_EVENTS dans le fichier /etc/sysconfig/hotplug.
Agents Hotplug
Depuis la version 2.6 du noyau, il y a tellement d'événements Hotplug différents qu'il devient difficile de les connaître tous. Chaque nouveau pilote peut ajouter un nouveau type d'événement. Pour tous les événements bien connus, il existe des agents dédiés qui effectuent les actions nécessaires.
Les agents de périphérique chargent principalement des modules de noyau, mais il faut parfois appeler quelques commandes supplémentaires. Certaines architectures matérielles, comme S/390 d'IBM, s'attendent à ce que chaque périphérique soit activé en déclarant des valeurs spéciales quelque part dans 'procfs' ou 'sysfs'. Pour accomplir ce type de tâches, le système Hotplug de SUSE appelle toujours /sbin/hw{up,down}. Il cherche dans le répertoire /etc/sysconfig/hardware une configuration adaptée au périphérique et utilise les informations qu'il a trouvées. S'il ne trouve aucune configuration 'hwup', il a recours au « chargement automatique de modules ». Vous trouverez des détails sur hw{up,down} dans les fichiers /usr/share/doc/packages/sysconfig/README et 'man hwup'. Les versions futures verront le chargement automatique de modules entièrement supprimé et, si aucun fichier de configuration n'a été trouvé, 'hwup' déclenchera le processus de configuration.
Les agents d'interface remplissent essentiellement deux missions : la mise en place d'une interface et/ou l'appel de 'udev' pour générer un noeud de périphérique. La mise en place des interfaces est effectuée par /sbin/if{up,down}, pour le moment toutefois, uniquement sur les interfaces réseau. Vous trouverez d'autres détails sur 'if{up,down}' dans les documents consacrés à 'sysconfig', dans les fichiers /usr/share/doc/packages/sysconfig/README et dans la page de manuel de 'ifup'. 'udev' dispose également d'une documentation et d'une page de manuel propres.
Lorsqu'il n'y a pas d'agent pour un événement donné et qu'il existe dans le chemin d'accès au périphérique dans 'sysfs" un fichier 'dev', un agent 'udev' est appelé pour s'assurer que tous les n½uds de périphérique nécessaires ont été créés.
Chargement automatique de modules
Tous les agents qui doivent initialiser des périphériques essaient de trouver un module pilotant le périphérique dans le cas où 'hwup' échoue. Pour cela, ils mettent en oeuvre quelques correspondances de modules. Tous les agents parcourent d'abord un fichier /etc/hotplug/*.handmap et, uniquement dans le cas où ils n'y ont rien trouvé, ils examinent /lib/modules/<kernelversion>/modules.*map. Si le réglage par défaut tiré des correspondances du noyau ne convient pas à vos besoins, vous pouvez alors ajouter une ligne appropriée dans le fichier *.handmap.
Comme souvent, il existe deux règles supplémentaires pour PCI et USB :
- USB : le script 'usb.agent' cherche également dans /etc/hotplug/usb.usermap et /etc/hotplug/usb/*.usermap des pilotes en mode utilisateur : cela signifie qu'il est possible de démarrer des programmes exécutables pour certains périphériques.
- PCI : le script 'pci.agent' recherche des modules de pilote dans 'hwinfo' et ne s'intéresse ensuite aux fichiers 'Map' que si 'hwinfo' ne fournit pas de pilote. Du fait que 'hwinfo' examine les fichiers 'pci.handmap' et les correspondances du noyau, cela ne devrait normalement pas être nécessaire. 'hwinfo' dispose d'une base de données supplémentaire qui est exploitée après 'pci.handmap' mais avant les correspondances du noyau.
Il est en outre possible de brider 'pci.agent' de manière à ce qu'il ne charge que des modules de certains sous-répertoires de /lib/modules/<kernelversion>/kernel/drivers. S'il existe au moins un nom de sous-répertoire dans HOTPLUG_PCI_DRIVERTYPE_WHITELIST, seuls les modules de ces sous-répertoires sont chargés. Les modules des sous-répertoires listés dans HOTPLUG_PCI_DRIVERTYPE_BLACKLIST ne sont jamais chargés.
Enfin, il reste encore le fichier /etc/hotplug/blacklist. Ce fichier contient une énumération ligne par ligne des noms des modules qui ne doivent être chargés par aucun agent.
Si plusieurs modules conviennent dans un fichier de correspondance, le chargement est interrompu dès lors qu'un module a été chargé avec succès. Ces modules supplémentaires ne sont en principe que des modules de rechange. Pour que Hotplug charge tous les modules appropriés, définissez HOTPLUG_LOAD_MULTIPLE_MODULES=yes.
Veillez à ce que cela n'affecte pas le chargement du module via 'hwup'. Le chargement automatique de modules est juste un mécanisme de repli qui ne sera bientôt plus disponible.
Périphériques réseau et leurs noms d'interface
S'il y a plusieurs périphériques réseau dotés de différents pilotes, il peut arriver que les noms d'interfaces de ces périphériques changent fortuitement lors de chaque amorçage. Ce comportement est dû au fait que les événements Hotplug sont gérés de manière asynchrone et partant de là, que deux pilotes initialisent leurs périphériques en parallèle. Cela signifie qu'il peut y avoir compétition entre ces processus.
Pour éviter ce problème, les événements des périphériques réseau sont placés dans une file d'attente. Si ce comportement devait être problématique pour quelque raison que ce soit, il est toujours possible de le désactiver dans le fichier /etc/sysconfig/hotplug au moyen d'un réglage HOTPLUG_PCI_QUEUE_NIC_EVENTS=no.
Pour obtenir des noms d'interface persistants, il est recommandé d'attribuer des noms d'interface dédiés dans les fichiers de configuration d'interface : le traitement des événements via une file d'attente n'est alors plus nécessaire. Reportez-vous à la section sur les noms persistants dans le fichier /usr/share/doc/packages/sysconfig/README.
Branchement PCI à chaud (« PCI Hotplugging »)
Quelques ordinateurs permettent de changer de périphériques PCI en cours de fonctionnement. Pour que le branchement PCI à chaud soit correct, des modules de noyau spéciaux sont chargés et peuvent s'avérer préjudiciables pour les ordinateurs non « Hotplug PCI ». Du fait que les emplacements PCI de branchement à chaud ne peuvent pas être détectés automatiquement, cette fonction doit être activée manuellement dans le fichier /etc/sysconfig/hotplug en paramétrant HOTPLUG_DO_REAL_PCI_HOTPLUG.
Coldplug
Coldplug se charge des périphériques qui ont été connectés avant l'activation du système Hotplug. C'est toujours ce qui se produit au cours de l'amorçage. Coldplug gère également les périphériques dont la détection est complexe.
Coldplug appelle d'abord le script 'hwup' pour chaque configuration matérielle statique dans /etc/sysconfig/hardware (hwcfg-static-*). De cette manière, on peut initialiser des matériels anciens ou exotiques. Il est même envisageable d'initialiser des périphériques dans un ordre donné.
Les scripts /etc/hotplug/*.rc recherchent les périphériques qui n'ont pas encore été initialisés et génèrent pour ceux-ci des événements Hotplug. Pour les périphériques PCI, il existe une liste blanche et une liste noire des types de périphériques à prendre en charge ou à ignorer. Ces listes sont décrites dans les commentaires du fichier /etc/sysconfig/hotplug.
Les scripts '*.rc' affichent un caractère pour chaque périphérique analysé :
- . : le périphérique est déjà initialisé et est de ce fait ignoré
- * : génère un événement Hotplug pour ce périphérique
- W : le périphérique ne se trouve pas dans la liste blanche et est de ce fait ignoré
- B : le périphérique se trouve dans la liste noire et est de ce fait ignoré
Configuration
/etc/sysconfig/hotplug
Ce fichier contient des variables permettant de modifier le comportement de Hotplug et de Coldplug. Les conséquences de ces variables sont décrites dans les commentaires de ce fichier.
/proc/sys/kernel/hotplug
Il s'agit du nom du fichier exécutable que le noyau appelle.
Paramètres d'amorçage
Voici quelques paramètres que vous pouvez fixer à l'invite d'amorçage :
- NOHOTPLUG=yes : s'il est réglé sur 'yes', les événements Hotplug ne sont traités que si 'rchotplug start' a été appelé manuellement.
- NOCOLDPLUG=yes : s'il est réglé sur 'yes', Coldplug est ignoré.
- HOTPLUG_TRACE=<N> : s'il est paramétré, Hotplug affiche sur la console le nom du module qu'il charge et attend N secondes.
Débogage
Fichiers journaux
Dans la configuration par défaut, Hotplug ne consigne que les messages importants dans le journal système ('syslog'). Pour obtenir des indications plus détaillées sur le fonctionnement de Hotplug, paramétrez HOTPLUG_DEBUG=yes. Si vous suspectez la présence d'un bogue dans un script quelconque, pensez à déclarer HOTPLUG_DEBUG=max. Chaque commande de l'interpréteur est ensuite consignée par ces scripts ; il peut s'ensuivre un très grand nombre de lignes supplémentaires dans le fichier journal.
Le système Hotplug utilise 'syslog' par défaut. En d'autres termes, vous trouverez tous les messages dans le fichier /var/log/messages. Toutefois, lors de l'amorçage, 'syslog' n'est démarré qu'après Hotplug et Coldplug, ce qui entraîne la perte d'un grand nombre de messages. Par conséquent, vous pouvez attribuer à HOTPLUG_SYSLOG une autre valeur. Pour plus d'informations, lisez les commentaires contenus dans le fichier /etc/sysconfig/hotplug.
Problèmes au cours de l'amorçage
Si l'ordinateur reste bloqué pendant l'amorçage, il est possible de désactiver Hotplug (NOHOTPLUG=yes) et/ou Coldplug (NOCOLDPLUG=yes) à l'invite d'amorçage. Le réglage NOHOTPLUG empêche Hotplug d'appeler un agent Hotplug, d'où que viennent les événements. Toutefois, les configurations matérielles statiques (hwcfg-static-*) sont encore appliquées par Coldplug. Si plus tard Hotplug est démarré manuellement (sans qu'il y ait eu modification du niveau d'exécution), HOTPLUG est ignoré. Le réglage NOCOLDPLUG ignore Coldplug lors de l'amorçage : cela signifie qu'aucune analyse de périphérique et aucune configuration matérielle ne seront exécutées, mais que Hotplug continue néanmoins à fonctionner.
Quand le coupable est un module que Hotplug a chargé, vous pouvez surveiller Hotplug en définissant HOTPLUG_TRACE=<N> à l'invite d'amorçage. Hotplug affiche alors le nom du module à charger sur la console et attend N secondes avant de charger le module en question. Il n'y a pas de mode interactif.
L'enregistreur d'événements
Il y a un programme /sbin/hotplugeventrecorder qui est toujours appelé par /sbin/hotplug et /sbin/hotplug-stopped. S'il existe un répertoire /events, tous les événements hotplug y sont consignés dans des fichiers séparés. <keyword>coldplug,hotplug,usb,pci,hardware,scan,boot,ifdown,ifup,hwup,hwdown,sysfs</keyword>