Recompiler un noyau PXE pour ajouter des drivers manquants
Lorsque l’on fait du déploiement de poste (ou de serveur) à grande échelle, un des moyen les plus simple est de mettre en place un serveur PXE. Je ne reviendrais pas ici sur la façon de configurer un tel serveur, le net fourmillant de tutoriaux expliquant comment les mettre en place. Cette méthode fonctionne dans beaucoup de cas, mais peut vite devenir galère lorsqu’on utilise des équipements qui ne sont pas standard, comme des cartes réseaux vmware (vmxnet) ou alors des cartes HBA pour installer son système sur une baie de disque fibre, ou bien tout autre périphérique que l’on souhaite utiliser durant l’installation du système.
Je vais prendre pour exemple dans cet article l’ajout de pilotes pour les cartes vmware, sur une distribution CentOS, mais cet exemple est facilement transposable à n’importe quel driver, et à n’importe quelle distribution.
Pour commencer, on va se mettre sur une machine déjà installée avec la distribution que l’on souhaite déployer et les drivers que l’on souhaite ajoutés installés sur le système.
Tout d’abord, il faut récupérer le fichier initrd.img, qui se trouve dans les fichiers liés au PXE sur le CD ou DVD de la distribution (ou sur le serveur PXE). dans le cas d’un DVD CentOS, le fichier se trouve dans “images/pxeboot”.
On va commencer par préparer notre espace de travail :
mkdir /tmp/pxe cd /tmp/pxe cp /mnt/dvd/images/pxeboot/initrd.img . mkdir initrd
Ensuite, on va décompresser le RAMDISK, afin d’avoir accès aux drivers.
cd initrd zcat ../initrd.img | cpio -id
Maintenant, il convient de repérer le code du périphérique :
$ lspci[...]03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
puis, pour repérer le code :
$ lspci -n[...]03:00.0 0200: 15ad:07b0 (rev 01)
on utilise donc le code 03:00.0 pour repérer le code du périphérique qui nous intéresse : 15ad:07b0
Après avoir gardé ce code en mémoire, on va maintenant décompresser l’archive des modules du noyau PXE :
mkdir /tmp/pxe/modules cd /tmp/pxe/modules zcat ../initrd/modules/modules.cgz | cpio -id
Puis, nous allons récupérer les drivers sur le système pour les inclure au module. Le chemin vers les drivers ainsi que celui du noyau PXE est à adapter en fonction de votre distribution et des drivers que vous souhaitez intégrer :
cd /tmp/pxe/modules/2.6.18-194.17.1.el5/x86_64 cp /lib/modules/2.6.18-194.el5/misc/vmxnet*.ko . chmod 744 vmxnet*
il faut maintenant recompresser l’archive des modules :
cd /tmp/pxe/modules find . | cpio -o -H crc | gzip -9 > /tmp/pxe/initrd/modules/modules.cgz
Puis, on édite le fichier des identifiants pci pour y ajouter nos modules :
cd /tmp/pxe/initrd/modulesvim pci.ids
et on cherche l’entrée correspondant au premier chiffre trouvé dans le lspci -n (ici 15ad pour vmware).
Si l’entrée n’existe pas, il faut la rajouter en lui donnant un nom. Puis, il faut rajouter une sous-entrée avec le deuxième chiffre. Dans mon cas, cela va donner ceci :
15ad VMware Inc 0405 Abstract SVGA II Adapter 0710 Abstract SVGA Adapter 07b0 VMware Adapter
ensuite, on édite le fichier modules-info afin de rajouter nos deux drivers, comme ceci :
vmxneteth"VMware vmxnet ethernet driver"vmxnet3eth"VMware vmxnet3 ethernet driver"
Puis, on rajoute les alias présent dans le système pour nos drivers au fichier modules.alias :
grep vmxnet /lib/modules/2.6.18-194.17.1.el5/modules.alias >> /tmp/pxe/initrd/modules/modules.alias
enfin, il ne reste plus qu’a ré-empaqueter le ramdisk :
cd /tmp/pxe/initrdfind . | cpio -o -H newc | gzip -9 > /tmp/pxe/initrd.img.vmxnet
et à le mettre sur le serveur PXE :
cp /tmp/work/initrd.img.vmxnet /tftpboot/centos/centos5.5/x86_64
Et voilà, le tour est joué. Dans ce cas précis, cela permet de déclarer directement des machines virtuelles avec des drivers vmxnet, au lieu de faire l’installation avec des drivers e1000, puis de modifier la carte réseau une fois le système installé.
Article original écrit par Mathieu Cron et publié sur matao.fr | ©Copyright - 2008 Toute reproduction interdite.
Recompiler un noyau PXE pour ajouter des drivers manquants