« Créer un CD root and boot » : différence entre les versions
(balises code) |
m (Lea a déplacé la page Créer un CDrom root and boot vers Créer un CD root and boot) |
(Aucune différence)
|
Dernière version du 11 décembre 2023 à 10:24
Créer un CDrom root and boot
Introduction
Un CDrtbt (j'utiliserai parfois cette abréviation en hommage à la célèbre Tomsrtbt) est un CD incluant la racine (root) d'un système et donc son arborescence et ses fichiers. Il est de plus doté d'un programme d'amorçage (boot) comparable à celui des CDs d'installation des distributions. Il fonctionne entièrement en RAM et sur lui-même, comme le font beaucoup de distributions liveCD comme la très actuelle Knoppix. Une fois en fonctionnement votre "système" aura schématiquement la structure suivante, la racine étant en RAM et le répertoire /usr/ restant sur le CD (les + signifient que je coupe un peu pour simplifier) :
/bin/
/boot/
+
/opt/
/proc/
/root/
/tmp/
|/bin/
/usr/--CD--|/doc/
|/games/
/var/ |+
On peut imaginer différentes méthodes pour créer un CDrtbt ; je n'en présenterai ici qu'une seule, la seule d'ailleurs que j'ai utilisée lors de mes premiers essais. Attention vous ne créerez pas ainsi une Demolinux ou autre, mais vous le ferez vous-même et c'est beaucoup... Par honnêteté je dois signaler dès ici l'article de Qing LIU (que j'ai par ailleurs contacté) qui est à l'origine de mes propres essais : Créer son propre système root/boot sur cdrom. Vous pouvez bien sûr le lire, mais je vous déconseille fortement d'essayer de construire un CD en piochant alternativement dans un article puis dans l'autre, du moins sans avoir auparavant bien compris la méthode. En effet si les articles possèdent forcément des points communs, ils diffèrent sous de nombreux aspects (heureusement d'ailleurs) ce qui pourrait vous induire en erreur.
J'ai utilisé lors de mes essais une Debian pour construire un CDrtbt Debian (stable - main ; pour être précis) assez proche de l'original une fois installé. Ceci influe forcément un peu sur quelques détails de cet article. Par exemple la Debian possède un répertoire /cdrom/ et un /floppy/ alors que d'autres distributions possèdent un /mnt/cdrom/ et un /mnt/floppy/. Comme vous le voyez ce n'est pas grand chose, vous pourrez aisément modifier ces détails si vous le souhaitez, et si vous ne le faites pas cela sera sans conséquences fâcheuses. De toute façon le plus important ici est de comprendre la méthode afin de pouvoir l'adapter à ses besoins.
Pré requis
Vous devez bien sûr être sous GNU/Linux, disposer d'un graveur, d'un programme vous permettant de graver des isos et d'au moins un CD-RW de préférence. Votre distribution possède sans doute déjà toutes les commandes qui vous seront nécessaires (vérifiez à tout hasard mkisofs) mais il vous manque peut-être le programme isolinux.bin. Sous Debian celui-ci est inclus dans le paquet syslinux : apt-get install syslinux. Le fichier isolinux.bin se trouve maintenant dans le répertoire /usr/lib/syslinux/. Ce programme est indispensable puisque c'est grâce à lui que le CD est amorçable.
Ceci fait il vous faut disposer d'une partition libre d'environ 1 Go (ou beaucoup plus que vous n'utiliserez pas) dans laquelle vous installez la distribution qui représentera 99% de votre CDrtbt. Bien que cette étape ne constitue pas le coeur de cet article, nous touchons en réalité ici au point le plus important. En effet la qualité de votre CD dépendra du soin que vous prendrez à installer et à configurer cette distribution. Voici quelques conseils (ce ne sont que des idées, non des vérités):
- Réfléchissez à votre cible. Votre CD sera-t-il destiné à un usage purement privé ou public? Devra-t-il tourner sur un seul PC, sur quelques PCs similaires (de bureau par exemple) sur tout PC (bureau, portable, etc)? Des réponses à ces questions dépendront les fichiers et programmes constituant la base indispensable et la façon dont vous les configurerez.
- Choisissez un objectif assez précis. Souhaitez-vous créer un CD de secours ou orienté réseau ou bureautique ou que sais-je? De cette orientation générale dépendront les programmes que vous ajouterez à la base. Prenez le temps de choisir et ne centrez pas tout sur des programmes réputés être lourds (KDE, Mozilla...) prévoyez leur pour le moins des alternatives (wmaker, fluxbox, dillo, links...) et vous obtiendrez ainsi des performances correctes.
- Optez pour une distribution que vous connaissez bien. Celle-ci peut être la même que votre distribution habituelle ou être différente. Même si toute distribution doit pouvoir convenir, certaines sont sans doute plus adaptées que d'autres à ce genre de projet. Parmi celles que je connais le mieux je mettrais en tête la Slackware même si j'ai choisi la Debian. En fait ce point dépend aussi de vos connaissances générales de GNU/Linux et de l'objectif que vous vous êtes fixé.
- Si vous êtes pressés de faire un premier essai, passez par-dessus les conseils précédents, installez en vitesse une base texte et une base graphique, copiez / collez toutes les commandes proposées, rebootez et cela devrait fonctionner. Vous reviendrez alors sans doute sur ces points un peu plus tard.
Notez ici que l'on pourrait imaginer une autre méthode de création d'un CDrtbt qui n'utiliserait pas une distribution spécialement installée à cet effet mais simplement votre distribution habituelle et ne nécessiterait donc pas de partition libre. Je pense cependant que bien souvent cette méthode serait beaucoup plus ardue, à moins que vous n'utilisiez au quotidien une distribution relativement minimale, car elle demanderait de faire constamment le tri (notamment en /usr) entre ce qui doit être conservé et ce qui ne doit pas l'être, ce serait un gros travail sans doute bien plus astreignant que d'installer une petite distribution. De plus rien ne vous assurerait, tant que vous n'auriez pas essayé de booter votre CD, que cette distribution est réellement fonctionnelle.
Important : Dans tout ce qui suit j'ai essayé d'être simultanément le plus simple et le plus précis possible. En effet toutes les manipulations sont à faire en root (ce qui est symbolisé par un # devant les lignes de commandes) et portent sur l'ensemble des fichiers d'une distribution, y compris les plus sensibles. J'ai donc préféré la sécurité de votre système au risque de donner ici des lignes de commandes que l'on pourrait juger maladroites ou peu optimisées. Par exemple:
# nano prepa/fstab
ne fait courir aucun risque à votre fichier /etc/fstab ce qui ne serait pas forcément le cas de :
# nano fstab
Pour information, nano est un petit éditeur de texte en standard sous Debian ; si vous ne le possédez pas ou ne l'aimez pas, remplacez nano par vi ou autre.
Préparation ou /var/tmp/prepa/
Commencez par créer quelques répertoires. Un répertoire /mnt/disk/ où nous monterez la distribution du CDrtbt ainsi qu'un répertoire /mnt/loop/ qui vous servira lors de la construction de l'initrd. Comme notre répertoire de base de travail sera /var/tmp/, créez dans celui-ci : le répertoire prepa/ qui servira à préparer quelques fichiers ; les répertoires cdrom/ et cdrom/isolinux/ qui contiendront ce qui sera au final le CD et enfin le répertoire ramcd/ qui contiendra la partie RAM de ce CD c'est-à-dire l'initrd.
# mkdir /var/tmp/prepa /var/tmp/ramcd
# mkdir /var/tmp/cdrom /var/tmp/cdrom/isolinux
Ceci fait, commençons par remplir un peu notre répertoire prepa/ en y créant au moins trois fichiers indispensables: isolinux.cfg ; isolinux.txt et fstab. J'utilise ici l'éditeur nano, utilisez celui que vous voulez.
# nano prepa/isolinux.cfg
prompt 1
timeout 0
display isolinux.txt
label linux
kernel vmlinuz
append root=/dev/ram0 ro initrd=initrd.img ramdisk_size=65536
Le fichier isolinux.cfg est assez proche d'un lilo.conf ; quelques explications :
prompt 1 : demande d'afficher un prompt.
timeout 0 : demande d'attendre une réponse à l'infini. Si vous le souhaitez, vous pouvez à la place indiquer un temps d'attente en dixièmes de secondes (timeout 100 pour 10 secondes donc) au bout duquel isolinux cherchera à charger le noyau correspondant au label "linux". Si ce label n'existe pas, ceci engendrera un message d'erreur.
display isolinux.txt : affiche le message du fichier isolinux.txt, message que vous créerez par la suite.
label linux : un nom doit correspondre à chaque possibilité de boot, ici il n'y en a qu'une nommée "linux" ce qui permet d'avoir éventuellement un amorçage automatique. Bien sûr ceci peut se changer, pensez toutefois que vous serez à ce moment en clavier qwerty. Mes essais pour des claviers azerty n'ont pas été concluants à 100%, j'ai donc éliminé cette possibilité.
kernel vmlinuz : il s'agit du nom du noyau à booter pour ce label. Ce noyau doit avoir été compilé avec le support ramdisk et initrd en dur, ainsi qu'avec le support du système de fichiers iso9660 des CDs.
append root=/dev/ram0 ro initrd=initrd.img ramdisk_size=65536 : ce sont les options à passer au noyau lors du boot soit la racine du système de fichier, la façon dont elle doit être montée, le nom du fichier initrd et la taille maximale autorisée pour le ramdisk. Notez ici que nous autorisons un ramdisk maximum de 64 Mo, ce qui est beaucoup. Vous pourrez sans doute descendre assez facilement à un ramdisk de 48 Mo voire même de 32 Mo. Pour le savoir, il vous suffira de faire un du -sh ramcd/ une fois ce répertoire rempli (je vous le rappellerai en temps utile, mais vous aviez certainement anticipé en faisant régulièrement des du -sh /* sur votre distribution lors de sa construction pour être sûr de ne pas avoir de mauvaises surprises ultérieurement). Enfin, si vous souhaitez des exemples de fichiers isolinux.cfg plus élaborés, consultez ceux des CDs de votre distribution, nombreuses sont celles à utiliser ce système.
Pour commencer entrez: linux [options]
Le fichier isolinux.txt sera affiché par isolinux au moment du boot, vous pouvez bien sûr y écrire ce que vous voulez. Notez au passage que l'on peut, comme avec lilo, passer des paramètres au noyau lors du boot. Ainsi par exemple : linux vga=771 permet d'obtenir une console en 800x600 si le support framebuffer est bien inclus dans le noyau et si la carte graphique le supporte. Attention tout de même pour ce message, les caractères accentués et autres bizarreries spécifiques à notre langue ne seront pas supportés, donc n'en mettez pas.
/dev/ram0 / ext2 defaults 1 1
/dev/hdc /usr iso9660 defaults 0 0
proc /proc proc defaults 0 0
Dans ce fstab /dev/ram0 est monté en / au format ext2 et /dev/hdc en /usr au format iso9660. Vous noterez ici un des gros défauts de ce fichier : il suppose que notre CDrtbt sera dans le lecteur /dev/hdc (seconde nappe IDE, premier contrôleur). Certes beaucoup de PCs possèdent un tel lecteur, mais pas tous... Ne sachant pas comment faire autrement, je ne puis vous proposer mieux. Adaptez donc à vos besoin si nécessaire et, si vous le souhaitez, ajoutez des lignes pour les ports usb ou autres comme pour n'importe quel fichier fstab.
Tous les fichiers nécessaires ont été créés, mais rien ne vous empêche d'en éditer d'autres, de l'ordre de l'optionnel. Je mets par exemple des fichiers .profile, .bashrc et .bash_logout pour le futur /root/ afin d'avoir un environnement plus convivial. Faites simplement comme bon vous semble. J'indiquerai ultérieurement un moment adéquat pour copier ces fichiers facultatifs, si vous en créez.
Remplissage du CDrtbt ou /var/tmp/cdrom/
Vous allez maintenant remplir votre CDrtbt, il ne restera ensuite qu'à lui ajouter l'initrd pour qu'il soit vraiment complet. Commencez par monter la distribution placée dans cet exemple en /dev/hdb7 (corrigez donc cette ligne pour l'adapter) :
Placez-vous ensuite dans le répertoire /var/tmp/ pour mettre les fichiers vmlinuz (le noyau de votre distribution dont nous supposons ici qu'il porte ce nom et est en /boot/), isolinux.bin, isolinux.cfg et isolinux.txt dans le répertoire cdrom/isolinux/.
# cp /mnt/disk/boot/vmlinuz cdrom/isolinux/
# cp /usr/lib/syslinux/isolinux.bin cdrom/isolinux/
# cp prepa/isolinux.cfg cdrom/isolinux/
# cp prepa/isolinux.txt cdrom/isolinux/
Vérifiez que tout s'est passé comme prévu :
isolinux.bin isolinux.cfg isolinux.txt vmlinuz
Changez maintenant de répertoire afin de copier le /usr/ de votre distribution en /var/tmp/cdrom/ à l'aide de la commande tar... Soyez un peu patients. Notez que vous pouvez ajouter un v aux options de tar si vous souhaitez qu'elles soient volubiles.
# (tar cfp - *) | (cd /var/tmp/cdrom/; tar xfp -)
Vérifiez que tout est en ordre :
X11R6 bin doc games include info isolinux lib local sbin share src
Le résultat peut être un peu différent selon la distribution utilisée. Quoi qu'il en soit, il doit correspondre au répertoire /usr/ de celle-ci augmenté du répertoire isolinux/. Il ne vous reste plus maintenant qu'à créer l'initrd pour l'y ajouter.
Création de l'initrd ou /var/tmp/ramcd/
Placez-vous dans le répertoire où est montée votre distribution afin d'en copier les répertoires désirés, hormis /usr/ dont vous venez de faire la copie.
# (tar cfp - bin boot dev etc lib opt sbin var) | (cd /var/tmp/ramcd/; tar xfp -)
Comme vous le voyez, nous faisons ici une copie des répertoires /bin/, /boot/, /dev/, /etc/, /lib/, /opt/, /sbin/ et /var/ de la distribution. Vous pouvez également faire des choix quelques peu différents concernant les répertoires à copier ou non ; nous parlerons par exemple un peu plus loin d'éventuel(s) utilisateur(s) et du répertoire /home/ que j'ai volontairement omis ici. Notez d'autre part que nous avons utilisé la commande tar pour effectuer des copies comme expliqué dans le T&A : Copier (déplacer) son Linux sur DD. Si vous le préférez, vous pouvez utiliser à sa place la commande rsync comme expliqué dans ce T&A de Jonesy : Cloner son système. De toute façon il vous faut maintenant compléter votre image en y ajoutant ce que vous n'avez pas copié et en apportant quelques petites modifications.
Retournez au répertoire /var/tmp/ et créez les répertoires non copiés en leur donnant les permissions appropriées. Nous allons créer ici proc/, root/, tmp/, usr/ ainsi que les points de montage cdrom/ floppy/ et mnt/. Il est possible de modifier un peu ces choix, en fonction de ce que vous avez réellement copié précédemment et de la structure que vous souhaitez avoir.
# mkdir ramcd/proc ramcd/root ramcd/tmp ramcd/usr
# chmod 555 ramcd/proc
# chmod 750 ramcd/root/
# chmod 1777 ramcd/tmp
# mkdir ramcd/cdrom ramcd/floppy ramcd/mnt
Copiez maintenant le fichier fstab initialement préparé. Si vous avez préparé des fichiers optionnels, profitez-en pour les copier également :
Créez ensuite un fichier /etc/mtab vide :
Nous venons de créer un répertoire /root/ mais n'avons pas créé (ni copié) de répertoire /home/. Plusieurs possibilités sont ici envisageables, nous n'en verrons que trois.
1) Vous ne souhaitez pas a priori avoir d'utilisateur(s) pour votre CDrtbt, vous serez en root, inutile alors de faire un /home/ (sans compter que vous pourrez toujours en créer un lors de l'utilisation du CD). Vous n'avez alors rien de plus à faire concernant la copie ou la création de répertoire.
2) Vous n'avez pas créé d'utilisateur mais pensez avoir un utilisateur ou plus lors de l'utilisation du CD et n'en savez guère plus à ce stade. Vous pouvez alors préparer le terrain en créant un répertoire /home/ :
# mkdir ramcd/home
3) Vous avez créé un ou des utilisateur(s) et vous souhaitez pouvoir le(s) retrouver en utilisant le CD. Prenons ici l'exemple fictif de l'utilisateur user (uid 1000) du groupe users (gid 100). Pour qu'il figure sur le CD, il est possible d'ajouter simplement le répertoire /home/ à la liste des répertoires à copier par tar au moment de la création de l'initrd (voir la remarque faite plus haut à ce propos). Tout ce qu'il contient sera alors copié tel quel. Ce n'est sans doute pas une très bonne idée sauf si vous avez pris soin de bien faire le ménage en quittant la distribution. Pour repartir plus proprement, vous pouvez procéder de cette façon (ici vous devez bien sûr adapter en utilisant les véritables nom, uid et gid de votre(vos) utilisateur(s) pour tout ce qui concerne user, 1000 et 100) :
# mkdir ramcd/home ramcd/home/user
# cp ramcd/etc/skel/.* ramcd/home/user/
Vous créez ainsi les bons répertoires et y copiez les fichiers qui figurent "normalement" à la création d'un utilisateur. Ces fichiers étant des fichiers cachés, n'oubliez pas le "." devant le "*". Vous pouvez alors compléter avec, par exemple, des fichiers facultatifs du répertoire prepa/. Il ne vous reste plus ensuite qu'à rendre ceci à qui de droit et à mettre des permissions ad hoc :
# chmod 750 ramcd/home/user/
Que vous ayez ou non fait ce qui précède, vérifions maintenant que tout est en place [home] étant donc facultatif :
bin boot cdrom dev etc floppy [home] lib linuxrc mnt opt proc root sbin tmp usr var
Le répertoire ramcd/ contenant tout ce qu'il doit, il ne vous reste plus qu'à créer l'initrd.img. Je ne vais pas expliquer chacune des commandes et options correspondant à cette construction car ce serait un peu long (on peut d'ailleurs aussi très certainement procéder différemment). Notez toutefois que nous créons au départ un fichier initrd de 64 Mo (bs=1M count=64) en cdrom/isolinux/ et qu'il occupera donc approximativement cette place en mémoire. Ceci correspond à ce que nous avons mis dans le fichier isolinux.cfg (ramdisk_size=65536). Si vous avez opté pour un ramdisk plus petit (vérifiez la taille du répertoire ramcd/ avec du -sh /var/tmp/ramcd/ pour voir ce que vous pouvez faire), créez aussi un fichier initrd plus petit. En très bref : nous créons ensuite un système de fichier ext2, copions le répertoire ramcd/ puis gzipons le tout pour obtenir initrd.img.
# dd if=/dev/zero of=cdrom/isolinux/initrd bs=1M count=64
# mke2fs -m0 -F cdrom/isolinux/initrd
# mount -o loop cdrom/isolinux/initrd /mnt/loop/
# rsync -a /var/tmp/ramcd/* /mnt/loop/
# umount /mnt/loop/
# gzip -S .img cdrom/isolinux/initrd
Voilà nous avons presque terminé. Il ne reste en effet plus qu'à créer l'image iso et à graver. Donc avant cela il est prudent de procéder à quelques vérifications, au moins pour ce qui est de initrd.img que nous venons de créer:
initrd.img isolinux.bin isolinux.cfg isolinux.txt vmlinuz
Elle est bien là... Si tout le reste vous semble aussi correct, vous pouvez démonter la distribution :
Création du CDrtbt
Il existe sans doute de nombreuses possibilités concernant la création de l'image iso mais, mes connaissances en ce domaine étant assez limitées, je ne traiterai ici que du cas de l'extension Rock Ridge. Si vous avez créé un(des) utilisateur(s) ou pensez que lors de l'utilisation du CDrtbt il y aura peut-être des utilisateurs (autres que root) vous devez utiliser l'option -R. Sinon vous pouvez utiliser l'option -r plus "propre" car elle crée des CDs où aucun fichier n'a de permission en écriture, où tous appartiennent à 0.0 (root.root)... Dans le doute, utilisez -R. Attention tout ce qui suit mkisofs correspond à une seule et même ligne de commande.
Pour des CDs proprets root :
# mkisofs -o cdrom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -l -L cdrom/
Pour des CDs utilisateurs ou dans le doute :
# mkisofs -o cdrom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -l -L cdrom/
Une fois ceci fait, vous disposez du fichier cdrom.iso en /var/tmp/. Vérifiez que tout s'est bien passé, et notamment qu'un fichier boot.cat est apparu dans le répertoire isolinux/. Notez d'autre part qu'il est possible qu'un répertoire rr_moved/ soit apparu, ceci est dû à l'utilisation de l'extension Rock Ridge et importe peu ici.
# ls /mnt/loop/
X11R6 bin doc games include info isolinux lib local [rr_moved] sbin share src
# ls /mnt/loop/isolinux/
boot.cat initrd.img isolinux.bin isolinux.cfg isolinux.txt vmlinuz
# umount /mnt/loop/
Il ne reste plus qu'à graver et à rebooter. Pour ce qui est de la gravure, vous pouvez utiliser cdrecord et éventuellement, comme moi-même, son frontend eclipt roaster. Si vous préférez procéder en ligne de commande et que vous ne savez comment faire, lisez donc cet article de Pascal : La gravure en ligne de commandes.
Conclusion
Malgré ses lacunes j'espère que cet article permettra à certains d'entre vous de faire facilement leurs premiers essais en évitant autant que possible les no kernel found, kernel panic et autres joyeusetés. Notez cependant que si la méthode présentée ci-dessus a l'avantage de la simplicité (elle peut être facilement expliquée et réalisée et convient donc bien à un article) elle manque cruellement de souplesse : lors de l'utilisation le répertoire /usr/ est sur le CD et tout le reste en RAM, un point c'est tout. Pour ceux qui aimeraient aller plus loin, une organisation similaire à ce qui suit permet de remédier à cette rigidité au prix d'une complexité accrue (les + signifient que je coupe un peu pour simplifier).
/.cdrtbt/--CD--|/linux/-------|/opt/
|/isolinux/ |/usr/
+ |/var/--|/cache/apt/
/bin/ |/lib/apt/
/boot/
+
/opt/ = lien vers /.cdrtbt/linux/opt/
/proc/
/root/
/tmp/
/usr/ = lien vers /.cdrtbt/linux/usr/
/var/--|/backups/
|/cache/apt/ = lien vers /.cdrtbt/linux/var/cache/apt/
|+
|/lib/apt/ = lien vers /.cdrtbt/linux/var/lib/apt/
|+
En simplifiant, le CD est monté dans un répertoire caché /.cdrtbt/. Il contient à sa racine deux répertoires isolinux/ et linux/. Ce dernier répertoire contenant à son tour l'arborescence nécessaire pour y placer "tout ce que l'on veut" (dans cet exemple /opt/, /usr/, /var/cache/apt/ et /var/lib/apt/). Dans l'arborescence des liens pointent vers les fichiers qui ont été placés sur le CD. Cette méthode permet de faire plus ou moins ce que l'on veut mais elle est difficile à présenter in extenso puisque l'on ne peut savoir à l'avance ce que les uns ou les autres souhaitent faire et, même dans ce cas, cela risquerait d'être long et fastidieux pour vous comme pour moi. Par exemple, nous pourrions déjà noter que le répertoire linux/ est en fait totalement facultatif mais que personnellement je préfère le créer quand même, etc, etc.
Si vous avez des idées, des propositions ou des critiques constructives, n'hésitez pas à me contacter.
Merci à Léa de publier cet article, merci à vous de l'avoir lu.
@ Retour à la rubrique Logiciels
Copyright
Copyright © 02/10/2003, Marc
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique, Contexte non commercial 2.0 : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ |