Mini-HOWTO Machines Multi-Ethernet Don Becker, becker@cesdis.gsfc.nasa.gov 5 aout 1995 Ce mini-Howto explique comment configurer Linux pour qu'il reconnaisse plusieurs cartes Ethernet sur une meme machine. 11.. IInnttrroodduuccttiioonn Dans le cas de la plupart des distributions classiques de Linux, il suffit d'ajouter la ligne suivante au debut de votre fichier /etc/lilo.conf et de relancer lilo : append = "ether=0,0,eth1" C'est tout ce que vous avez a faire. Lors du prochain redemarrage de la machine, Linux devrait reconnaitre la seconde carte. 22.. LLeess ddiiffffeerreenntteess ssoolluuttiioonnss Par defaut, le noyau Linux ne recherche qu'une seule carte Ethernet, et ne va pas plus loin des qu'il en a trouve une. Il y a trois facons de contraindre le noyau a rechercher des cartes supplementaires. Par ordre de simplicite (et de souplesse) croissante : +o fournir des parametres au noyau lors du demarrage ; +o configurer le chargeur pour qu'il fournisse lui-meme systematiquement ces parametres au noyau ; +o modifier les tables de detection des cartes Ethernet du noyau dans le fichier drivers/net/Space.c (et recompiler le noyau apres coup). Dans la plupart des cas, c'est la deuxieme solution qui convient le mieux, et correspond a ce que nous avons decrit en introduction. Les deux premieres solutions reposent sur le passage de parametres au noyaux et sont decrites dans la section suivante. La troisieme solution est decrite ensuite. 33.. TTrraannssmmeettttrree ddeess ppaarraammeettrreess aauu nnooyyaauu Le noyau Linux admet qu'on lui fournisse un certain nombre de parametres lors de son lancement. Le plus souvent ces parametres decrivent des aspects de la configuration qui ne peuvent etre determines qu'au moment du demarrage. Pour les cartes reseaux, le parametre est le suivant : ether=IRQ,adresse-E/S,param1,param2,nom Les valeurs numeriques admises peuvent etre exprimees en decimal, en octal (precedees par un '0') ou en hexadecimal (precedees par '0x'). Le premier argument qui n'est pas une valeur numerique est pris comme _n_o_m du peripherique (ici une carte reseau). Les parametres vides (entre virgules) ont zero comme valeur par defaut, et les parametres manquants avant le nom ne sont pas modifies. IIRRQQ Ce parametre indique l'IRQ (ligne d'interruption) a configurer (pour les cartes admettant un parametrage logiciel de l'IRQ) ou a utiliser (pour celles ou l'IRQ est configuree avec des cavaliers sur la carte). Une valeur nulle (0) indique de demander a la carte quelle IRQ utiliser (si elle le permet) ou d'utiliser l'autoIRQ si la carte ne le permet pas. aaddrreessssee--EE//SS Ce parametre indique l'adresse d'entree/sortie a tester. Une valeur nulle (0) demande le test de toutes les adresses d'entree/sortie raisonnables. Celles-ci sont determinees d'apres une carte des zones d'entree/sortie habituelles pour les differents types de peripherique. Cette carte des zones est ignoree si une adresse d'entree/sortie est specifiee. Utilise avec le parametre reserve=_b_a_s_e,_t_a_i_l_l_e,... (-- Se reporter a la documentation _L_i_l_o.--) ceci permet d'empecher l'auto-test d'une zone d'entree/sortie par d'autres pilotes et d'eviter ainsi le dysfonctionnement d'un peripherique qui se trouverait pertube par ces tests. ppaarraamm11,,ppaarraamm22 Au depart, ces parametres permettaient d'indiquer l'adresse d'une zone de memoire partagee pour les cartes qui utilisaient cette technique, comme la WD8013. Leur utilisation a ensuite ete etendue a la transmission d'autres informations propres aux differents types de cartes. nnoomm Ce parametre indique le nom d'un peripherique predefini. Le noyau standard definit ainsi au moins "eth0", "eth1", "eth2" et "eth3". D'autres noms peuvent etre predefinis (pour PPP, SLIP, etc.) mais ils ont une semantique differente (pour toute precision, se reporter aux FAQ et HOWTO correspondants). Deux methodes peuvent etre utilisees pour fournir ces parametres au noyau Linux lors de son lancement. La methode habituelle est de les indiquer directement apres le nom de l'image noyau a charger. L'exemple suivant permet de tester les quatre emplacements possibles : linux ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3 Pour eviter d'avoir a taper ceci a chaque demarrage, il est plus pratique de configurer votre chargeur. 33..11.. CCoonnffiigguurreerr vvoottrree cchhaarrggeeuurr Il est suppose dans ce qui suit que vous utilisez le chargeur Linux standard _L_i_l_o. Il est bien evidemment penible d'avoir a taper une serie de parametres lors de chaque demarrage, et de plus cela empecherait tout redemarrage involontaire de s'effectuer correctement (-- Bien que ce type de redemarrage ne se produise pas sous Linux ;-)(_N_._D_._T_.).--) . L'ajout d'une ligne append a votre fichier de configuration _L_i_l_o (/etc/lilo.conf) vous permet de fournir automatiquement ces parametres au noyau (n'oubliez pas de relancer lilo pour mettre a jour votre configuration). append = "ether=0,0,eth1 ether=0,0,eth2 ether=0,0,eth3" Cet exemple est equivalent au precedent (test des quatre emplacements), en utilisant cette fois _L_i_l_o pour transmettre a chaque demarrage ces parametres au noyau. 44.. MMooddiiffiieerr llee nnooyyaauu Si vous pouvez configurer votre systeme sans toucher au code source du noyau, nous vous recommandons fortement de faire ainsi (cf. supra). Il est difficile de garder une trace d'une modification apportee au code source et cela complique grandement les mises a jour du noyau. Toutefois, cela s'impose dans les situations suivantes : +o lorsque vous avez besoin de plus de quatre cartes (seules eth0 a eth3 sont definies dans le source drivers/net/Space.c) ; +o vous devez resteindre les types de peripheriques recherches a un sous-ensemble precis de types de cartes quand, par exemple, le mecanisme de detection confond des types de cartes differents ; +o quand vous voulez utiliser un nom de peripherique different de eth_x. 55.. NNootteess ssuurr llaa ddeetteeccttiioonn ddee qquueellqquueess ccaarrtteess ppaarrttiiccuulliieerreess 55..11.. CCaarrtteess LLaannccee//PPCCNNEETT Le pilote Lance a besoin de tampons DMA en memoire basse, ce qui fait que la procedure de detection des cartes Lance est specifique a ce type de cartes, et effectuee avant la detection des autres peripheriques reseaux. L'avantage est que les cartes Lance multiples sont automatiquement detectees par cette procedure, l'inconvenient est que le pilote Lance ignore (pour le moment) les parametres _L_i_l_o telle l'IRQ. 55..22.. LLaa 33CC550099 eenn mmooddee IISSAA La 3C509 presente la caracteristique unique de permettre une detection vraiment sure par le bus ISA. C'est une caracteristique interessante, mais malheureusement pour les situations qui nous interessent ici, cela ne fait pas tres bon menage avec les autres mecanismes de detection. Le probleme le plus important est qu'il est difficile de savoir quelle carte sera reconnue en premier, l'ordre dependant de l'adresse Ethernet des cartes. Cela signifie que la carte avec l'adresse la plus basse se verra affectee a eth0, et ainsi de suite. Si la carte correspondant a eth0 est retiree, toutes les autres cartes voient leur nom de peripherique decale d'une unite vers eth0. Un probleme lie est qu'il n'est pas possible de laisser une premiere carte inactive, ou une carte active a une adresse ou a une IRQ differentes de celles indiquees dans l'EEPROM, ou encore de configurer une carte a une adresse specifique. 55..33.. LLaa 33CC557799 EEIISSAA eett llaa 33CC550099 eenn mmooddee EEIISSAA Les noyaux de version anterieure a la 1.1.25 ne detecteront pas correctement les cartes multiples en mode EISA. Si plusieurs peripheriques eth_x sont indiques, la _m_e_m_e carte 3C509 sera detectee plusieurs fois. La solution est de specifier l'adresse d'entree/sortie directement. Les noyaux de version ulterieure detecteront correctement plusieurs cartes en mode EISA, et detecteront aussi des cartes en mode ISA supplementaires, une fois toutes les adresses potentielles de cartes en mode EISA testees. Don Becker, becker@cesdis.gsfc.nasa.gov .