URL: https://linuxfr.org/users/freem/journaux/creation-d-un-systeme-live-cd-base-sur-debian Title: Création d'un système live-CD basé sur Debian Authors: freem Date: 2019年11月14日T13:20:19+01:00 License: CC By-SA Tags: debian, iso, live et runit Score: 20 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](https://linuxfr.org/users/freem/liens/anglais-comment-debian-genere-ses-fichiers-iso-et-comment-forker-la-methode) 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): ```sh 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: ```syslinux.cfg 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: ```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" 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` dans `1`, 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): ```fstab 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 ou `SVDIR` 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: ```etc/runit/2 ... 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: ```sh chpasswd -R $PWD/iso_dir <&1 | grep -vi 'WARNING.*Symlinks' ```

AltStyle によって変換されたページ (->オリジナル) /