SDB:Configuration des périphériques et des interfaces sous SUSE LINUX

Aller à : navigation, rechercher


Version: 9.1 -

Configuration des périphériques et des interfaces sous SUSE Linux

Ce document décrit un nouveau système d'initialisation des périphériques et de configuration des interfaces. Les fichiers de configuration spéciaux d'autres services et processus qui peuvent également se trouver dans le répertoire /etc/sysconfig, sont décrits dans des documents séparés fournis avec les paquetages correspondants.

La première partie de ce document est consacrée aux connaissances de base nécessaires pour comprendre les modifications effectuées. La seconde traite de l'initialisation des périphériques et de la configuration des interfaces.

Idée générale et arrière-plan

Introduction, terminologie et un ancien problème

L'initialisation des périphériques et la configuration des interfaces a été repensée au moment de la sortie de SUSE Linux 9.1 et de tous les produits qui en dérivent. Ils se basent dorénavant sur le nouveau 'sysfs' du noyau 2.6. Ce système récent sera mis en ½uvre progressivement dans les toutes prochaines versions.

Pour mieux comprendre ce nouveau système, il est important de connaître la signification des notions de périphérique (device) et d'interface (interface) :

  • Un périphérique est un objet physique, quelque chose qui peut se casser si on le fait tomber. Un périphérique doit d'ordinaire être initialisé à l'aide d'un pilote. Après l'initialisation, le pilote crée une interface dédiée à ce périphérique.
  • Une interface est un logiciel : elle a un nom et dispose d'un ensemble de fonctions. On peut avoir plusieurs interfaces par périphérique.

Normalement, un périphérique et son interface forment une unité. Par exemple, une carte réseau PCI est une unité qui se compose d'un périphérique PCI et d'une interface réseau. Dans les versions de noyau antérieures à la version 2.6, il manquait des informations indiquant que telle interface appartenait à tel périphérique. Lorsqu'un périphérique était initialisé, le noyau attribuait un numéro à la nouvelle interface. Ce numéro ne dépendait cependant pas du périphérique lié à cette interface, mais de quelles autres interfaces du même genre étaient déjà initialisées.

La seule relation entre périphériques et interfaces était les lignes d'alias dans le fichier modules.conf. Celles-ci ne garantissaient rien néanmoins. Par exemple, on pouvait y trouver :

  alias eth0 driver0 # for device0
  alias eth1 driver1 # for device1

Si device0 ne pouvait pas être initialisé, alors 'eth0' ne pouvait pas être enregistré. Un 'ifup eth1' déclenchait alors le chargement de driver1. Cependant, la nouvelle interface recevait le nom 'eth0' et non 'eth1'. Dans le passé, cela se produisait rarement, mais avec le nombre croissant de périphériques, on est confronté à un véritable problème.

La même chose se produisait avec d'autres périphériques, comme les périphériques de stockage. Le noyau affectait les noms d'interfaces comme /dev/sd<X> qui n'étaient pas attribués de façon fixe à certains périphériques. Le noyau les numérotait dans l'ordre dans lequel ils démarraient. Imaginez que le deuxième des quatre disques durs SCSI tombe en panne et que le noyau affecte 'sbd' et 'sdc' aux périphériques qui étaient auparavant dénommés 'sdb' et 'sdd'.

Sysfs et noms persistants

Avec 'sysfs', il est maintenant possible d'attribuer des noms d'interface persistants. Les sous-répertoires /sys/devices/, /sys/bus, /sys/class et /sys/block présentent un intérêt surtout dans 'sysfs'. /sys/devices et /sys/bus sont deux aspects différents du matériel (les périphériques). /sys/class et /sys/block contiennent toutes les interfaces sur lesquelles on peut communiquer depuis des applications. (Bien que jusqu'ici vous soyez habitué à parler de /dev/sda comme d'un fichier, il s'agit dans notre terminologie d'une interface à un périphérique de stockage.)

Les liens du nom de 'device' qui pointent depuis un sous-répertoire d'interface dans /sys/class ou /sys/block vers un sous-répertoire de périphérique dans /sys/devices sont la clé de voûte de ce nouveau système. Si seul ce lien existe, on peut savoir quelle interface appartient à quel périphérique :

    /sys/block/sda/device ->
        ../../devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0/host0/0:0:0:0
    /sys/block/sdb/device ->
        ../../devices/pci0000:20/0000:20:01.1/host1/1:0:0:0
    /sys/class/net/eth0/device ->
        ../../../devices/pci0000:00/0000:00:1e.0/0000:02:00.0
    /sys/class/net/eth2/device ->
        ../../../devices/pci0000:00/0000:00:1e.0/0000:02:01.1/0000:07:00.0

Maintenant que ces relations sont connues, on peut affecter des noms persistants aux interfaces. Pour cela, nous avons besoin d'une table pour mettre en correspondance le périphérique et les noms d'interface. Pour tous les périphériques qui ont des n½uds /dev en tant qu'interfaces, l'opération peut avoir lieu dans le fichier /etc/udev/udev.conf. Pour les périphériques réseau, les noms des fichiers de configuration /etc/sysconfig/network/ifcfg-* doivent comporter une description du matériel. Par exemple, la configuration ifcfg-id-00:e0:98:a0:83:c2 intervient toujours pour le périphérique doté de l'adresse MAC 00:e0:98:a0:83:c2 ,; on peut indiquer un nom persistant au sein de cette configuration.

Inversion de la séquence d'initialisation des périphériques et configuration des interfaces

Jusqu'à maintenant, l'installation des interfaces réseau commençait par l'interface. Il y avait une configuration pour une interface réseau, qui n'avait pas besoin d'exister. Une interface 'ifup' déclenchait un 'modprobe' du module concerné dans le fichier modules.conf. Le pilote cherchait le matériel qu'il pouvait gérer et enregistrait toutes les interfaces qu'il avait créées. Les seules exceptions étaient USB et PCMCIA, qu'il n'était pas possible de connecter en cours de fonctionnement.

Puisque la relation périphériques et interfaces est connue, le processus démarre dès maintenant à l'autre extrémité, c'est-à-dire le périphérique. Lors de l'amorçage, une analyse recherche les périphériques disponibles et les événements « hotplug » (de branchement à chaud) sont déclenchés. 'Hotplug' gère ces événements et appelle l'agent approprié pour initialiser les périphériques. En d'autres termes, il charge le pilote. Quand le pilote enregistre de nouvelles interfaces, il déclenche à nouveau des événements 'hotplug', cette fois pour les interfaces. Ces événements sont gérés par un des agents d'interface.

Par conséquent, les lignes d'alias ne sont plus nécessaires dans le fichier modprobe.conf. On les déconseille même, parce qu'elles peuvent entraîner d'étranges effets. Auparavant, ces alias aidaient à initialiser automatiquement un périphérique si une quelconque opération était demandée à partir d'une interface non existante. Dorénavant, le périphérique est initialisé et l'interface définie automatiquement. Imaginez que vous souhaitiez vérifier avec 'ifconfig' (*) qu'une interface donnée est disponible et qu'elle ne le soit pas actuellement, aucun pilote n'étant chargé pour ce périphérique. Puis, quand 'ifconfig eth1' est appelé, il effectue un 'modprobe eth1' qui charge le pilote donné dans la ligne d'alias 'eth1'. Ce pilote déclenche un événement qui configure l'interface via 'ifup'. Ce n'était néanmoins pas ce que vous projetiez de faire.

'ifup' charge des modules, ce qui agit uniquement sur les interfaces existantes. Normalement, tous les périphériques disponibles sont initialisés pendant l'amorçage, de sorte qu'il n'y a aucune raison de le faire plus tard. Si le système a été configuré de façon qu'un périphérique donné reste non initialisé, ce dernier peut être initialisé ultérieurement en démarrant manuellement 'hwup'. Si l'interface de ce périphérique dispose d'un mode de démarrage 'auto', il est configuré automatiquement.

(*) Depuis l'avènement de 'ifconfig' on le déconseille également, mais pour d'autres
raisons. À la place, on utilise maintenant 'ip'. Cependant, il est préférable
d'utiliser 'ifup', 'ifstatus' et 'ifdown'.

Initialisation des périphériques

Les périphériques doivent normalement être démarrés et arrêtés au moyen de 'hwup' et de 'hwdown'. Vous trouvez les configurations des périphériques dans le fichier /etc/sysconfig/hardware. La plupart du temps, ces scripts sont appelés par des agents 'hotplug'. Le gestionnaire de profils (SCPM) ou la gestion d'énergie peuvent également arrêter et démarrer des périphériques. Un 'hwup' sur un n½ud de l'arborescence du matériel devrait déclencher l'initialisation de tous les périphériques connectés à ce n½ud via hotplug. Un problème lié à ce mode de fonctionnement est que souvent, un périphérique ne peut pas être initialisé isolément s'il y a plusieurs périphériques pris en charge par le même module de noyau. Ce comportement changera probablement dans l'avenir.

Ce système n'est pas très développé sous SUSE Linux 9.1. 'hwup' est utilisé pour le branchement à chaud, mais s'il n'existe aucun fichier de configuration pour un périphérique, le système tente de trouver automatiquement un pilote.

Actuellement 'hdwup' ne charge que des modules de noyau et appelle des scripts d'aide possibles. 'hdwup' utilise 'getcfg' pour trouver une configuration correspondante et applique alors cette dernière. Vous trouverez d'autres informations dans la page de manuel 8 consacrée à 'hdware'. Un mode de démarrage peut également être ajouté à une configuration. Pour qu'un périphérique reste non initialisé pendant l'amorçage ou lors de son branchement, définissez STARTMODE=manual (ou ' off') dans la ligne de configuration.

Les fichiers de configuration sont /etc/sysconfig/hardware/hwcfg-<nom>. <keyword>coldplug,hotplug,usb,pci,hardware,scan,périphérique,boot,ifdown,ifup,hwup,hwdown,sysfs</keyword>