Noyau Linux, modules, et initrd

Transcription

Noyau Linux, modules, et initrd
Noyau
Linux,
modules,
et
initrd
Ce document regroupe un ensemble de connaissances et de constatations provenant d’expérimentations, relatifs au
chargement du noyau Linux, à l’utilisation des modules, et à l’activation ou la détection de certains matériels.
I – Explorer le fichier Initrd
Le fichier initrd (système racine initial en RAM, traduit soit Init Root Device (système racine initial), soit Init
RAM Disk (disque virtuel initial)) est un simple périphérique loop, contenant un système de fichier EXT2 et
compressé avec
gzip -9. Pour explorer un système racine initial il faut :
1 – renommer le fichier
initrd avec une extension .gz :
mv initrd-2.4.20-28.8 initrd.gz
2 – décompresser le fichier
intrd.gz afin d’obtenir le fichier initrd initial :
gzip –d initrd.gz
3 – mounter le fichier
automatiquement) :
initrd en tant que périphérique loop (le système de fichier EXT2 est détecté
mount –o loop initrd /mnt/initrd
On obtient alors le système racine initial dans le répertoire /mnt/initrd. A la racine de cette arborescence se
trouve le fichier linuxrc : il s’agit du premier script shell exécuté par le noyau. Ce script charge les pilotes primitifs indispensables (accès au système de fichier, aux disques SCSI, à la carte réseau, etc.) se trouvant sous forme
de modules dans le répertoire /lib de l’arborescence initrd. Pour plus d’informations sur la manière de créer
un fichier initrd, on pourra aller voir le fichier Documentation/initrd.txt dans les sources du noyau.
La séquence d'amorçage de Linux utilisant un disque virtuel initial
initrd est la suivante :
1 – Le noyau est chargé en mémoire, ceci est effectué par le chargeur de démarrage (Grub, LILO, LOADLIN,
SysLinux, ISOLinux, PXELinux, etc.). On peut voir le message Loading... pendant que ceci arrive.
2 – L'image initrd du disque virtuel est chargée en mémoire, à nouveau ceci est réalisé par le chargeur de
démarrage. On peut voir le message Loading à nouveau quand ceci arrive.
3 – Le noyau est initialisé, y compris la lecture des options de ligne de commande et le montage du disque virtuel en
tant que racine.
4 – Le programme /linuxrc est lancé sur le disque virtuel initial.
5 – Grâce à pivot_root le périphérique racine est changé pour celui spécifié dans les paramètres du noyau.
6 – Le programme /etc/init est lancé, et va exécuter la séquence de démarrage paramétrable par l'utilisateur.
II – Pilote NE2000 pour le carte réseau ISA RealTek 8019
Faut-il forcément recompiler le noyau pour disposer du pilote NE2000 ? Le cas concret où le besoin d’intégrer un
pilote dans le noyau concerne la carte réseau ISA RealTek 8019 sur l’ordinateur Opsi. Cette carte Plug & Play à
l’origine, est accessible par le pilote NE2000 de Linux (module ne). Or, la norme NE2000 est justement
incompatible avec le Plug & Play. Il en résulte l’obligation de désactiver la fonction Plug & Play de la carte RTL 8019
en utilisant l’utilitaire DOS livré avec la carte, et la nécessité de renseigner le module ne sur l’adresse d’E/S et l’IRQ
utilisées par la carte. La ligne suivante charge manuellement le module ne en indiquant les 2 paramètres de la carte :
modprobe ne io=0x280 irq=9
Pour automatiser le chargement et le paramétrage du pilote ne sur l’ordinateur Opsi, il faut ajouter les 2 lignes
suivantes dans le fichier /etc/modules.conf :
alias eth0 ne
options ne io=0x280 irq=9
Noyau Linux, modules, et initrd avec Red Hat 8.0
www.gecif.net - Novembre 2005
Page 1 / 2
Malheureusement ce principe ne permet pas d’installer Linux par le réseau sur Opsi, puisque la carte réseau RealTek
8019 ne sera reconnue qu’une fois que le système racine réel sera correctement chargé. Pour activer la carte ISA
RTL 8019 dès le chargement du noyau et de l’initrd, il y a 2 solutions :
Soit intégrer le pilote NE2000 « en dur » dans le noyau Linux
Soit enrichir le fichier initrd en y ajoutant le module ne (qui doit se trouver sur la disquette
drvnet.img)
III – Intégration de pilotes réseau dans le noyau
Pour intégrer le pilote NE2000 dans le noyau il faut le recompiler en choisissant NE2000/NE1000 support
dans Network device support Ethernet (10 or 100Mbit) (programme make menuconfig).
Une fois recompilé, on dispose bien d’un noyau possédant le pilote NE2000 permettant d’accéder à la carte ISA
RealTek 8019, mais comment lui indiquer manuellement l’adresse d’E/S et l’IRQ de la carte ? Pour cela on va utiliser
le paramètre ether à passer au noyau dès son chargement. Le format du paramètre ether est le suivant :
ether=irq,adresse,nom
Dans le cas de la carte RealTek 8019 sur Opsi il faudra passer au noyau le paramètre suivant :
ether=9,0x280,eth0
Remarques :
dans le cas où l’irq et l’adresse valent zéro, cela oblige Linux à détecter une nouvelle carte réseau. Ce principe est
utilisé si on possède 2 cartes réseau alors que linux n’en détecte qu’une seule automatiquement :
ether=0,0,eth1
certains pilotes ont besoin d’autres paramètres en plus de l’irq et de l’adresse de port. Ces paramètres
supplémentaires (DMA, plage d’adresse, etc.) se place entre l’adresse et le nom lors du passage du paramètre
ether au noyau. La syntaxe complète du paramètre ether du noyau est alors la suivante :
ether=irq,adresse,[param 1,param 2,param 3,etc.,]nom
IV – Tentative d’installation de Red Hat 8.0 par le réseau sur Opsi
Malheureusement le fait de rajouter le pilote NE2000 dans le noyau ne suffit apparemment pas pour pouvoir installer
Linux sur Opsi par le réseau. La carte RealTek 8019 est très bien détectée au démarrage, sans même ajouter le
paramètre ether au noyau (l’adresse 0x280 a été visiblement « marquée en dur » dans le noyau).
Quel initrd utiliser ? Celui du CD-ROM n°1 bootable de Red Hat 8 ou celui de la disquette
Dans les 2 cas l’installation ne marche pas :
bootnet.img ?
le système boote sans problème (pas de kernel panic) et demande la méthode d’installation (NFS, FTP ou
http)
NFS ne fonctionne pas, même si on intègre le système de fichier NFS dans le noyau (il est en module par défaut).
L’erreur « Impossible de monter ce répertoire sur le serveur » persiste alors que le serveur est correct
FTP ou http semble mieux fonctionner, l’image d’installation netstg1.img commence à ce télécharger du serveur vers Opsi, puis l’erreur « Impossible de charger la première image d’installation » vient tout arrêter
Peut-être Opsi manque-t-il de place sur son RAM disk au démarrage pour y placer l’image netstg1.img. Si
on augmente la taille du disque virtuel en ajoutant ramdisk_size=10000 (10 Mo) par exemple comme
nouveau paramètre du noyau au boot, une autre erreur indiquant qu’il est impossible de mounter le périphérique
/dev/loop0 vers /mnt/runtime arrive brutalement après le téléchargement de l’image
netstg1.img, et le système doit rebooter. Le répertoire /mnt/runtime existe-t-il dans l’arborescence
initrd ? C’est ce qui reste à vérifier …
La dernière piste à explorer est l’enrichissement de l’initrd de la disquette bootnet.img de Red Hat 8.0 en
y ajoutant le module ne. Le module ne doit se trouver sur la disquette drvnet.img de Red Hat 8 (ou
drivers.img de Red Hat 7) sous forme d’un fichier objet avec l’extension .o, et la liste des modules à charger
par insmod après le chargement du noyau est dans le fichier linuxrc à la racine de l’initrd.
Noyau Linux, modules, et initrd avec Red Hat 8.0
www.gecif.net - Novembre 2005
Page 2 / 2

Documents pareils