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/modules
vim 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 :

vmxnet
      eth
      "VMware vmxnet ethernet driver"
vmxnet3
      eth
      "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/initrd
find . | 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é.