Aller au contenu | Aller au menu | Aller à la recherche

Personnalisation d'Anaconda

Logo Red HatDans le cadre de mon travail, j'ai un besoin impérieux d'installer des machines Linux rapidement.

Pour ce faire, quand je dois installer des serveurs Red Hat, j'utilise KickStart. A l'instar de Preseed, il s'agit basiquement d'un fichier de réponse qui permet donc l'automatisation de l'installation. Actuellement très abouti, cette solution permet même l'execution de scripts de pre- et de post-install, en environnement chrooté ou non. Ainsi, une fois le fichier soumi à Anaconda, l'installation se déroule sans aucun intervention humaine, ce qui est bien pratique. Le fichier KickStart peut être soumis de plusieurs façons telles que sur une disquette ou un CD mais, dans un environnement connecté d'entreprise, la solution envisagé est souvent la soumission par réseau (FTP ou HTTP). C'est là où tout se complique car la ligne de commande à saisir au boot pour lancer une installation par KickStart via le réseau est la suivante.

linux ip=192.168.0.1 netmask=255.255.255.0 gateway=192.168.0.254 ksdevice=eth0 ks=http://192.168.0.10/ks/fichier_ks.cfg

Pas vraiment pratique, n'est-ce pas ? (Surtout si on le tape avec un Key-mapper en QWERTY sur un clavier AZERTY :caca: )

La faute en revient à Anaconda qui ne gère que deux formats de saisie réseau :

  • Format Anaconda : ip=192.168.0.1 netmask=255.255.255.0 gateway=192.168.0.254
  • Format PXELinux : ip=192.168.0.1:192.168.0.10:192.168.0.254:255.255.255.0

Bref, dans les cas, c'est plutôt horrible à taper. D'autant que, saisir d'une part l'IP, le Netmask et la Gateway, c'est trois fois plus de chances de se tromper d'un chiffre et de planter son install. Alors que, pourtant, il existe un format plus court et moins source d'erreur !! Le format Bitcount !!

linux ip=192.168.0.1/24 ksdevice=eth0 ks=http://192.168.0.10/ks/fichier_ks.cfg

La ligne précédente a quand même plus de gueule, non ? :-D
A partir de la notation 192.168.0.1/24, on détermine le Network, le Netmask et la Gateway ; que demande le peuple ?? Malheureusement, Anaconda ne le gère pas en natif... C'est pour cela que j'ai écrit un patch pour Anaconda pour que l'ISO de boot comprenne cette notation.

La convention utilisé à mon travail consiste à prendre pour Gateway, la dernière IP du sous-réseau (avant le Broadcast). Le patch a été écrit en ce sens et il faut le modifier dans les autres cas. Pour les réseaux où la Gateway est toujours la première adresse du sous-réseau, il faut modifier la ligne
uint32_t gw = (netw | ( (~ mask) & mask32) ) - 1;
En effet il faut la remplacer par :
uint32_t gw = netw + 1;

Le HOWTO ci-dessus a été écrit et testé initialement sur Red Hat 5.x, puis complété pour Red Hat 6.x. Néanmoins, Anaconda ayant pas mal changé entre les deux, le patch a été réécrit pour Red Hat 6.x. Tous les fichiers évoqués (patch et packages RPM sont fournis, attachés à ce billet).

Comme on parle ici de patcher Anaconda, il faut comprendre qu'on va devoir récupérer les sources de l'installeur Red Hat pour pouvoir les recompiler après modifier. Il faut donc, avant toutes choses, installer les packages de développement nécessaires à la compilation

# yum install anaconda yum-utils gcc make dbus-glib-devel syslinux
# yum info anaconda | grep Version

La commande yum info anaconda renvoie un numéro de version. Celle-ci est importante car il s'agit de la version correspondant au système installé. Il faut alors télécharger les sources de Anaconda correspondant à la version installé.

Le nom du fichier recherché ressemble à anaconda-xx.x.x.x-x.src.rpm.

Dans le cas d'une recompilation avec RedHat 6, des dépendances nécessitent l'installation de paquetages supplémentaires, à savoir :

  • iscsi-initiator-utils-devel,
  • newt-devel, slang-devel,
  • NetworkManager-devel,
  • NetworkManager-glib-devel,
  • device-mapper-devel,
  • libudev-devel,
  • libarchive-devel,
  • isomd5sum-src

Tous ces paquetages sont, pour plus de commodités, attachés à ce mail (de plus, il sera plus aisé de les obtenir d'ici quelques années). Une fois tous les paquetages téléchargés, ne pas oublier de compiler isomd5sum.

# cd /usr/src/redhat/SOURCES
#tar xfj isomd5sum-*.tar.bz2
# cd isomd5sum-*/
# make
# make install

On comment par installer les pré-requis pour Anaconda puis les sources qu'on décompresse (sur RH6, les sources se trouve dans /root/rpmbuild/SOURCES)

# yum-builddep anaconda-*.src.rpm
# rpm -ivh anaconda-*.src.rpm
# cd /usr/src/redhat/SOURCES
# tar xjf anaconda-*.tar.bz2
# cd anaconda-*/ 

Il ne reste plus qu'à patcher le fichier loader (Pour cela, il faut au préalable avoir télécharger le patch unified pour Anaconda à partir de la liste des fichiers attachés à ce post.

# patch -p1 < /chemin/vers/patch
# ./configure
# make

Pas la peine de faire make install ! On a juste besoin des binaires loader et init, pas d'un machine de développement pour Anaconda ;-) Pour ceux qui ont la flemme ou ceux qui ignore ce qu'est une compilation, un fichier tar.gz contenant les fichiers loader et init correspondant chacune des versions d'Anaconda. Merci qui ??? ;-)

Après avoir récupéré l'initrd à partir du CD d'install de Red Hat, il faut ouvrir cette image ramdisk pour remplacer les fichiers loader et init par ceux nouvellement compilés.

L'initrd pour RH6 est compressé en LZMA (via xz) alors que celui pour RH5 est en BZip2

# mv initrd.img initrd.img.xz
# xz --format=lzma initrd.img.xz --decompress
# mkdir initrd && cd initrd
# cpio -ivdum < ../initrd.img
# cp /usr/src/redhat/SOURCES/anaconda-*/loader/loader bin/loader
# find . -print |cpio -o -H newc | xz --format=lzma > ../initrd.img

Voilà ! Dorénavant, Anaconda comprend les commandes de type linux ip=x.y.z.w/n au boot !! Y'a plus qu'à replacer ce nouveau initrd dans le répertoire isolinux/ de la bonne distribution puis de créer l'ISO bootable qui va bien et hop, ça fait des Chocapic :-D

QR code
Jean-Baptiste Langlois

Auteur: Jean-Baptiste Langlois

Restez au courant de l'actualité et abonnez-vous au Flux RSS de cette catégorie

Commentaires (0)

Soyez le premier à réagir sur cet article

Ajouter un commentaire Fil des commentaires de ce billet

:-) ;-) :-/ :mdr: :-D :-( :-C 8-) :-O :-s :siffle: :-P :love: :oops: :money: :caca:


À voir également

Icinga avec LDAPS

Connexion en LDAPS avec Icinga

Authentification sur Icinga via un serveur LDAP nécessitant un certificat

Lire la suite

icinga-api-2.PNG

Remonter les checks Icinga grâce à Ruby

Classe Ruby permettant de remonter des informations grâce à l'interface REST de Icinga-Web

Lire la suite