Créer son propre système root/boot sur cdrom

Qing LIU (qliu arobase club-internet.fr)

Version 0.0.3, 31 octobre 2002.


Ce document a pour but d'expliquer la création d'un système Linux bootable sur cdrom. La version la plus récente de ce document se trouve sur http://qliu.free.fr/Linux/bootcd.html. Merci de m'envoyer vos critiques par email.

Sommaire

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

1. Introduction

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.


2. Programmes requis

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

$ ./Gmake && su -c 'make install'
Celle de syslinux est encore plus simple:
$ make && 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.

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]

3. Préparation de l'image ISO

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.

3.1 Les fichiers de base

Commençons par le plus simple.
# 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
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
# keytab-lilo.pl fr-latin1 > /boot/fr.ktl
Il faudra créer un fichier /var/tmp/bootcd/isolinux/isolinux.cfg dont voici un premier exemple:
-----------------------------------------
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

----------------------------------------
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.

3.2. Label 1: Le cdrom ne sert qu'à booter sur le disque dur

Il n'y a rien de plus à copier dans /var/tmp/bootcd/. L'utilisation correspond au label linux1 ci-dessus.

3.3. Label 2: Le cdrom contient /usr, le reste est dans un ramdisk

Cet exemple correspond au label linux2 plus haut.

Copier /usr

# cp -a /usr/* /var/tmp/bootcd
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.

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.

# mkdir /var/tmp/cdrootfs
# (tar cfp - /bin /boot/System.map* /dev /etc /lib /root /sbin /var) | (cd /var/tmp/cdrootfs/; tar xfp -)
(on copie des fichiers dans /var/tmp/cdrootfs).
# cd /var/tmp/cdrootfs # mkdir proc tmp usr # chmod 1777 tmp
(on crée des répertoires qui n'ont pas été copiés)
# ln -s sbin/init linuxrc
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:
# rm -f lib/*.a
# strip bin/* sbin/* 
# du -sh . 
19M . 
(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).

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 à

/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
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:
# cd etc
# ln -sf ../proc/mounts mtab
C'est important si votre mtab contient déjà une des entrées ci-dessus.
# 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/ 
Vous aurez compris que initrd.img est l'image compressée d'un système de fichier (ext2 ici).

Résulta final
# 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

3.4. Label 3: Tout sur le cdrom

Ça va râler un peu au démarrage (encore plus si on ne boot pas en single).

3.5. Label 4: Tout sur le cdrom sauf certains fichiers systèmes

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]

4. Créer l'image ISO et graver

C'est très simple:

# 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/
On vérifie que tout est bon:
# mount -o loop bootcd.iso /mnt
# ls /mnt /mnt/isolinux/ 
(il doit exister un fichier /mnt/isolinux/boot.cat à ce stade là).
# umount /mnt
Allons-y pour la gravure:
# cdrecord -v dev=0,1,0 driveropts=burnfree bootcd.iso
Adaptez l'option dev= à votre configuration (cdrecord -scanbus) ! Pour les premiers essais, on a intérêt à utiliser des CD réinscriptibles.

[Sommaire]

5. Le fichier de configuration isolinux.cfg

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-noyau
et non label options-noyau.

Section inachevée.

[Sommaire]


6. Documentation

Remarque. Beaucoup de ce qui est raconté ici est valable uniquement pour les PC, en particulier syslinux.

Section inachevée.


[Sommaire]