Création d'un système live-CD basé sur Debian
-
Salut.
En début de semaine, je me suis mis en tête de créer ma propre iso bootable, basée
sur Debian Buster tant qu’à faire (parce que c’est le système que je connais le
mieux, et de très loin).
Mon objectif ici est de m’amuser et d’apprendre, donc pas la peine de chercher
une raison pragmatique: si je voulais juste un live, j’irai en chercher un directement.Au niveau du système, je vais me baser sur:
- virtualbox pour les essais, config bios, parce que c’est plus facile;
- [iso|sys]linux(-efi) pour gérer le boot: je n’ai jamais vraiment aimé grub (question de goût), lilo est manifestement obsolète, syslinux supporte pas mal de trucs, dont le démarrage EFI, semble être la référence pour les iso, et je l’utilise sur tous mes systèmes avec grand bonheur: que ce soit du pxe, du boot par BIOS, de l’UEFI, et maintenant de l’iso, j’aime vraiment ce logiciel;
- runit-init, qui depuis Buster fait partie des alternatives officielles à systemd-sysv et sysvinit-core, bien qu’il ne dispose de quasi aucune intégration, et que franchement, quand il y a des scripts présents, j’ai tendance à les refaire (entre mon NIH et la simplicité de la tâche, dur de résister);
- busybox, dans un 1er temps ce paquet apportera pas mal de doublons, mais par la suite je vais essayer de supprimer les paquets debian qui apportent des binaires déjà présents dans bb (awk, sed, grep, dash/bash, find, etc). Je sens que ça va pas être simple, mais ça sera fun;
J’ai utilisé ce lien comme base pour l’invocation de xorriso, il en résulte cette commande après quelques modifications (pour essayer de réduire un peu, même si c’est moyennement utile et que j’ai probablement cassé pleins de fonctionnalités de l’iso au passage):
xorriso -as mkisofs \ -r -V 'CUSTOM_ISO_AMD64' \ -o custom.iso \ -J -joliet-long \ -isohybrid-gpt-basdat \ -isohybrid-mbr iso_dir/usr/lib/ISOLINUX/isohdpfx.bin \ -boot-load-size 4 -boot-info-table -eltorito-alt-boot -b usr/lib/ISOLINUX/isolinux.bin \ -no-emul-boot \ iso_dir \ 2>&1 | grep -v 'WARNING.*Symlinks'
Contrairement à la méthode indiquée dans le lien, je n’ai utilisé aucune iso pour me fournir des données.
Pour isolinux, il semble qu’il suffise de créer un dossier syslinux a la racine de l’iso. Compte tenu du fait que ce dossier est relativement statique, j’ai préféré le créer à la racine du projet, mon script de build se contente de le copier dans l’iso (après suppression, histoire de pas garder de traces des essais précédents).
Ce dossier doit contenir (dans mon cas, j’utilise le menu vesa, selon la configuration souhaitée, les fichiers nécessaires ne sont pas les mêmes):- ldlinux.c32;
- syslinux.cfg;
- libcom32.c32;
- libutil.c32;
- vesamenu.c32;
Vu que je pars sur un boostrap classique, mon fichier syslinux.cfg ressemble à ça:
prompt 0 timeout 50 default live ui vesamenu.c32 menu title custom live boot label live linux ../boot/vmlinuz-4.19.0-6-amd64 initrd ../boot/initrd.img-4.19.0-6-amd64 append ro root=/dev/sr0
Le
/dev/ro
est hard-codé, c’est gênant (risque de ne pas retrouver le point de montage s’il y a d’autres CDs de montés, je pense), mais on verra pour améliorer ça plus tard.Pour installer un système Debian strictement minimal,
debootstrap
intervient.
Compte tenu de mes choix et habitudes, la commande que j’ai utilisée est celle-ci:PKG_LIST="${PKG_LIST}isolinux,syslinux-common,syslinux,syslinux-efi," PKG_LIST="${PKG_LIST}busybox," PKG_LIST="${PKG_LIST}linux-image-amd64," PKG_LIST="${PKG_LIST}runit-init," PKG_LIST="${PKG_LIST}udhcpc," PKG_LIST="${PKG_LIST}lynx," PKG_LIST="${PKG_LIST}dialog," PKG_LIST="${PKG_LIST}kbd,console-data," PKG_LIST="${PKG_LIST}ntpdate," PKG_LIST="${PKG_LIST}dropbear-bin" PKG_LIST="${PKG_LIST}debootstrap" debootstrap --no-merged-usr --variant=minbase "--include=$PKG_LIST" buster iso_dir
Pour découper:
- –no-merged-usr: dans le doute, je préfère éviter les liens symboliques, mais je doute que ça change grand chose pour le cas présent;
- –variant=minbase: en gros, juste le nécessaire pour avoir un apt fonctionnel, je sélectionne le reste moi-même de toute façon;
- –include=
- isolinux,syslinux-common,syslinux,syslinux-efi: histoire de pouvoir (re-)construire des systèmes viables depuis le live;
- busybox: contiens pléthore d’utilitaires tous plus utiles les uns que les autres, même si le build Debian n’inclue pas tout;
- linux-image-amd64: le live ne démarrera que sur des machines amd64, mais ça doit représenter la plupart des machines type intel de toute façon;
- runit-init: parce qu’il faut bien un init, sinon on ne va pas aller bien loin;
- udhcpc: contiens juste les scipts nécessaires afin d’utiliser le client dhcp de busybox sans se prendre la tête, c’est un candidat à la suppression;
- lynx: un navigateur internet, ça peut toujours servir;
- dialog: bien pratique pour faire des scripts interactifs, même si je trouve qu’il est franchement pénible à utiliser (impossible de capturer les valeurs saisies par l’utilisateur dans une variable, il faut passer par un temporaire)…
- kbd,console-data: histoire de pouvoir sélectionner un clavier autre que qwerty;
- ntpdate: mettre à l’heure le système, peut servir;
- dropbear-bin: contiens un client et un serveur ssh, même s’il n’implémente pas sftp (pour scp… je ne suis jamais sûr du nom du protocole);
- debootstrap: histoire de pouvoir bootstrapper une machine, tant qu’à faire;
- buster: la version de Debian voulue;
- iso_dir: le dossier qui va contenir l’install;
- $MIRROR: un éventuel mirroir, peut servir si un apt-cacher traîne sur le lan;
Après un 1er essai, on a une iso, qui boot dans Virtualbox, même si le système est évidemment incomplet:
- password de l’utilisateur root non défini et pas d’autres utilisateurs;
- pas de réseau (genre, même pas de localhost): les paquets de gestion réseau traditionnels de Debian n’ont pas été installés;
- pas de getty. Je m’attendais à des dysfonctionnements de ce côté vu que le dossier
service
se situe dans/etc
et est en lecture seule, mais je ne pensais pas que ça gèlerai les gettys pour autant. - un hostname qui correspond à la machine qui a construit l’iso;
- “quelques” warnings, causés par le fait que Debian n’est pas faite pour fonctionner sur un système en lecture seule (mais ça, ça peut s’arranger)…
- probablement d’autres problèmes que l’on rencontrera plus tard;
Le plus facile, c’est la configuration de l’hostname: il suffit de créer un fichier
iso_dir/etc/hostname
, dans mon cas je vais mettre une valeur bidon:foobar
.Pour pouvoir utiliser le système cible, on va devoir monter un système de fichiers en RAM, histoire que le /var puisse être peuplé, /var qui contiendra notamment les dossiers dans lesquels runit supervisera les éléments du système.
Runit fonctionne avec un dossier /etc/runit qui contiens 3 fichiers exécutables, on va utiliser ceux de Debian que l’on modifiera juste assez pour avoir un truc simple qui marche:
- 1: script qui initialise le système;
- 2: script qui lance le superviseur
runsvdir
, principalement; - 3: script qui éteint le système proprement;
Debian a déjà implémenté le support du tradictionnel
/etc/fstab
dans1
, donc on va se contenter de créer ce fameux fichier (il manque plein de lignes, mais je veux juste un starter pour aujourd’hui):tmpfs /var tmpfs defaults 0 0
Il faut ensuite modifier
2
afin de définir les répertoires contenant les services à superviser dans un endroit où runit pourra écrire, dans mon cas, j’ai utilisé/var/lib/runit/service
.
Pour cela, il suffit de modifier la ligne ouSVDIR
est définie (par défaut/etc/service
), de créer le-dit dossier (puisque l’on vient tout juste de créer le point de montage/var
, celui-ci est vide) et y copier les services dont on à besoin:... SVDIR=/var/lib/runit/service mkdir -p /var/log $SVDIR find /etc/service/ -type l -execdir cp -r -L -t $SVDIR {} \+ ...
À partir de ce point, le système devrais démarrer les getty, mais il sera impossible de se connecter, faute de mot de passe défini.
On modifie donc le script de création d’iso en y ajoutant:chpasswd -R $PWD/iso_dir <<EOF root:toor EOF
La commande
chpasswd
permets de définir les couples login/password d’un chroot, en texte. Pas sécurisé, certes, mais scriptable très facilement puisque récupère les infos sur stdin.Juste avant de créer l’iso, on va faire un coup de ménage, quand même, parce que debootstrap a laissé toutes les archives dans le /var de l’iso, pas très utile.
Il y a aussi d’autres données un peu volumineuses liées à apt, et quelques trucs légers liés à dpkg et pam.
Vu que l’idée est d’avoir un truc qui marche dans un premier temps, je fais le bourrin:rm -r iso_dir/var/*
.Une fois l’iso générée, on dispose d’un liveCD de 442Mio (chez moi, mais en vrai j’ai rajouté l’install de debootstrap lors du copiage de mes notes ici) qui démarre, en tout cas sur une VM virtualbox.
Il reste pas mal de boulot pour faire un vrai live CD qui marche et qui s’éteint proprement, peut-être que j’écrirai a ce sujet un autre jour (quand j’aurai assez joué de mon côté).
À titre d’info, voici à quoi ressemble mon script mkiso.sh:
#!/bin/sh PKG_LIST="${PKG_LIST}isolinux,syslinux-common,syslinux,syslinux-efi," PKG_LIST="${PKG_LIST}busybox," PKG_LIST="${PKG_LIST}linux-image-amd64," PKG_LIST="${PKG_LIST}runit-init," PKG_LIST="${PKG_LIST}udhcpc," PKG_LIST="${PKG_LIST}lynx," PKG_LIST="${PKG_LIST}dialog," PKG_LIST="${PKG_LIST}kbd,console-data," PKG_LIST="${PKG_LIST}ntpdate," PKG_LIST="${PKG_LIST}dropbear-bin" PKG_LIST="${PKG_LIST}debootstrap" rm -r iso_dir/* debootstrap --no-merged-usr --variant=minbase "--include=$PKG_LIST" buster iso_dir cp -ar syslinux iso_dir cp -ar etc/* iso_dir/etc chpasswd -R $(pwd)/iso_dir <<EOF root:toor EOF rm -r iso_dir/var/* xorriso -as mkisofs \ -r -V 'CUSTOM_ISO_AMD64' \ -o custom.iso \ -J -joliet-long \ -isohybrid-gpt-basdat \ -isohybrid-mbr iso_dir/usr/lib/ISOLINUX/isohdpfx.bin \ -boot-load-size 4 -boot-info-table -eltorito-alt-boot -b usr/lib/ISOLINUX/isolinux.bin \ -no-emul-boot \ iso_dir \ 2>&1 | grep -vi 'WARNING.*Symlinks'
Télécharger ce contenu au format Epub
Commentaires : voir le flux atom ouvrir dans le navigateur
https://linuxfr.org/users/freem/journaux/creation-d-un-systeme-live-cd-base-sur-debian
Sauf mention contraire, le site est placé sous double licence Creative Commons BY-SA et GNU Free Documentation License propulsé par NodeBB