Version 0.0.3, 31 octobre 2002.
1. Introduction
2. Programmes requis
3. Préparation de l'image iso
4. Créer l'image ISO et graver
5. Le fichier de configuration isolinux.cfg
6. Documentation
Qui d'entre nous n'a pas eu un jour besoin de booter sur une disquette de secours (du type tomsrtbt) pour réparer un système défaillant ou pour intervenir sur la partition / de son système Linux ? Avec la démocratisation des graveurs de cdrom et la disparition programmée des bonnes vieilles disquettes, le besoin de créer des cdrom de secours devient de plus en plus d'actualité. Ce document est né d'une tentative de l'auteur pour comprendre les arcanes du mécanisme de boot sur cdrom. J'espère partager ici mes expériences en la matière et vous faire entrevoir les nombreuses possibilités qu'offre le support cdrom.
L'intérêt du cdrom par rapport au support disquette est indéniable. Du fait de l'espace disponible, on peut y inclure tous les outils dont on a besoin (même un environnement X si on ne peut pas se passer de la souris :)), les documentations (man, /usr/doc, HowTo etc), disposer d'une connexion internet ou réseau local. Notons aussi que certains ordinateurs portables sont d'ores et déjà dépourvus de lecteur de disquette. En outre, un cdrom est plus robuste qu'une disquette, et beaucoup plus rapide. Subjectivement, avec une machine récente, un système Linux qui tourne entièrement sur cdrom a un temps de réponse équivalent à un Pentium classique avec disque dur en Pio4. On peut donc disposer sur un cdrom d'un système Linux très complet qui fonctionne de façon autonome sans toucher au disque dur (c'est le principe de Demolinux). Par ailleurs, le fait qu'un cdrom soit protégé en écriture offre une protection efficace contre des effacements/modifications involontaires ou mal-intentionnés. C'est un aspect intéressant pour la sécurité.
Bien sûr, la possibilité de créer des cdrom comme nous venons de voir existe depuis plusieurs années. Les cdrom des distributions offrent généralement un mode de secours. Il existe aussi des projets spécifiques de création de cdrom que nous ne détaillerons pas ici. Le but de cet article n'est pas de proposer une image ISO à télécharger, mais d'expliquer comment fabriquer votre propre cdrom avec le contenu qui vous convient.
Pour la création de l'image ISO et sa gravure, on a besoin de mkisofs et de cdrecord. Ces deux programmes sont dans le package cdrtools-1.x.tar.gz. Pour installer un chargeur de boot sur cdrom, on aura besoin de syslinux. La version actuelle est la 1.76. Il est très probable que vous ayez déjà les deux premiers programmes et même xcdroast qui est une interface graphique pour cdrecord. En ce qui concerne syslinux, sa compilation requiert l'installation préalable de l'assembleur nasm. En fait, pour ce que nous allons faire ici, on n'a besoin que du fichier isolinux.bin (12 ko) que je peux envoyer par email sur simple demande. Mais récupérez quand même le package les sources de syslinux pour sa documentation (syslinux.doc et isolinux.doc). Les sources de ces programmes sont respectivement ici (l'URL est un peu longue) et sur syslinux.zytor.com. La compilation/installation de cdrtools se fait (après désarchivages des sources) avec
Celle de syslinux est encore plus simple:$ ./Gmake && su -c 'make install'
(vous devez cependant disposer de nasm). La dernière version de syslinux est 2.00 à l'heure où j'écris. Il est recommandé de mettre à jour la vôtre le cas échéant. Il y a en effet quelques petits bugs qui ont été corrigés.$ make && su -c 'make install'
Côté noyau, il est souhaitable de compiler en dur le support de votre lecteur de cdrom qui servira à booter, et "loop", de "RAM disk" et "initrd (Initial RAM disk)" (aller dans la section "Block devices" du menu de configuration du noyau). Dans l'un des exemples plus loin, on a aussi besoin du "Virtual memory file system support", alias tmpfs (section "File systems").
[Sommaire]Le principe général est assez simple. Il faut d'abord créer un répertoire contenant tout ce que l'on veut installer sur le cdrom (comprendre: les fichiers qui seront visibles au point de montage du cdrom), y copier les images noyau à booter, créer un sous-répertoire isolinux/ contenant isolinux.bin, éditer un fichier de configuration isolinux.cfg, et créer éventuellement des images initrd.
Les bzImage* sont des images noyau, isolinux.bin est le chargeur de boot. Le fichier fr.ktl c'est pour avoir le clavier français au prompt de syslinux. Il peut se créer avec# mkdir /var/tmp/bootcd/isolinux # cp /boot/vmlinuz-2.4.19 /var/tmp/bootcd/isolinux/bzImage # cp /boot/vmlinuz-2.2.22 /var/tmp/bootcd/isolinux/bzImage2 # cp /usr/lib/syslinux/isolinux.bin /var/tmp/bootcd/isolinux # cp /boot/fr.ktl /var/tmp/bootcd/isolinux
Il faudra créer un fichier /var/tmp/bootcd/isolinux/isolinux.cfg dont voici un premier exemple:# keytab-lilo.pl fr-latin1 > /boot/fr.ktl
Nous verrons plus loin quelques détails de la configuraion de isolinux. Dans cet exemple, on a plusieurs possibilités de boot. Avec le premier label, on démarre avec le noyau isolinux/bzImage2 et /dev/hda7 comme partition racine. Le deuxième label utilise le noyau isolinux/bzImage, et charge le contenu d'initrd.img dans un ramdisk de 32 Mo. Le troisième label est similaire au label linux1, sauf que la partition / sera sur le cdrom. Dans ce qui suit, nous allons détailler la préparation de l'image ISO pour chacun des labels.----------------------------------------- prompt 1 timeout 100 kbdmap fr.ktl label linux1 kernel bzImage2 append ro root=/dev/hda7 idebus=33 label linux2 kernel bzImage append initrd=/initrd.img load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=32768 ro root=/dev/ram0 label linux3 kernel bzImage append root=/dev/scd0 ----------------------------------------
Il n'y a rien de plus à copier dans /var/tmp/bootcd/. L'utilisation correspond au label linux1 ci-dessus.
Cet exemple correspond au label linux2 plus haut.
Copier /usr
En fait il faudra trier auparavant dans /usr ce que l'on veut copier car probablement tout ne rentrera pas et ne sera pas utile sur le cdrom. Le plus simple serait d'avoir une partition libre, d'y installer une distribution en mode minimale, monter cette partition /mnt/distro et copier /mnt/distro/usr au lieu de /usr. De même pour / ci-dessous. Il faut maintenant créer l'initrd.img.# cp -a /usr/* /var/tmp/bootcd
Créer un initrd qui contiendra / sauf /usr
Il faut d'abord évaluer la taille de / moins /usr. On ne mettra
pas le contenu de /home.
(on copie des fichiers dans /var/tmp/cdrootfs).# mkdir /var/tmp/cdrootfs # (tar cfp - /bin /boot/System.map* /dev /etc /lib /root /sbin /var) | (cd /var/tmp/cdrootfs/; tar xfp -)
(on crée des répertoires qui n'ont pas été copiés)# cd /var/tmp/cdrootfs # mkdir proc tmp usr # chmod 1777 tmp
Le principe de syslinux est d'exécuter le fichier /linuxrc à la fin du chargement de l'initrd. Ce qui explique la dernière ligne ci-dessus. Dans notre cas précis, l'existence de linuxrc n'est probablement pas indispensable. Supprimons des choses qui ne sont pas d'une utilité fondamentale de prime abord:# ln -s sbin/init linuxrc
(on a enlevé les lib*.a et les symboles dans les binaires de bin/ et de sbin/). Ne pas oublier de vérifier que vos programmes favoris (les outils nécessaires en cas de panne) sont dans bin/ ou sbin/. On laissera disons 32 Mo pour /. Notons que si on veut gagner de la place, on peut installer Busybox, un programme d'une centaine de Ko qui émule la plupart des programmes de manipulation de fichiers (fileutils).# rm -f lib/*.a # strip bin/* sbin/* # du -sh . 19M .
Adaptation de quelques fichiers de etc/
Enfin, un dernier réglage avant de créer l'initrd. Il faut modifier
etc/fstab pour qu'il ressemble à
Le /dev/scd0 est à adapter selon la situation. L'idéal serait d'écrire un script qui détecte le lecteur qui contient CDROM. On fera ça dans une version antérieure de la doc. Une autre manip utile:/dev/ram0 / ext2 defaults 1 1 /dev/scd0 /usr iso9660 defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0
C'est important si votre mtab contient déjà une des entrées ci-dessus.# cd etc # ln -sf ../proc/mounts mtab
Vous aurez compris que initrd.img est l'image compressée d'un système de fichier (ext2 ici). Résulta final# cd /var/tmp # dd if=/dev/zero of=initrd bs=1M count=32 # mke2fs -m0 -F initrd # mount -o loop initrd /mnt # rsync -a /var/tmp/cdrootfs/* /mnt/ # umount /mnt # gzip -S .img initrd # mv initrd.img /var/tmp/bootcd/
# ls /var/tmp/bootcd X11@ bin/ i386-slackware-linux/ initrd.img libexec/ sbin/ src/ X11R6/ dict/ include/ isolinux/ local/ share/ tmp@ adm@ etc/ info/ lib/ man/ spool@ # ls /var/tmp/bootcd/isolinux bzImage bzImage2 isolinux.bin isolinux.cfg
Ça va râler un peu au démarrage (encore plus si on ne boot pas en single).
Un système qui démarre normalement va créer et modifier certains fichiers: /dev/log, /etc/{mtab, ld.so.cache, ld.so.cache~, ssh/key*}, /var/{log, run}... Par ailleurs, si on veut faire tourner le cdrom dans une machine avec accès public, le problème de sécurité se pose car tout ce qui est gravé sur le cdrom est en lecture pour tout le monde (ou à personne sauf root, ce qui n'est pas très intéressant pour une machine publique), le pauvre système de fichiers iso9660 ne gère pas autant de permissions que nos autres systèmes de fichiers habituels. D'où la nécessité de mettre des fichiers sensibles sur un ext2 monté dans un ramdisk.
[Sommaire]C'est très simple:
On vérifie que tout est bon:# cd /var/tmp # mkisofs -o bootcd.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table -r -l -L bootcd/
(il doit exister un fichier /mnt/isolinux/boot.cat à ce stade là).# mount -o loop bootcd.iso /mnt # ls /mnt /mnt/isolinux/
Allons-y pour la gravure:# umount /mnt
Adaptez l'option dev= à votre configuration (cdrecord -scanbus) ! Pour les premiers essais, on a intérêt à utiliser des CD réinscriptibles. [Sommaire]# cdrecord -v dev=0,1,0 driveropts=burnfree bootcd.iso
Messages d'accueil et aide en ligne
Attention, au prompt de syslinux, s'il faut rentrer un choix de boot avec option, il faut taper :
nom-du-noyau options-noyauet non label options-noyau.
Section inachevée.
[Sommaire]Section inachevée.