Live Build : créer une distribution GNU/Linux à base Debian
Par makoto doushite le mercredi, 24 août 2016, 18:15 - GNU/Linux - Lien permanent
L'idée est ici de retranscrire les étapes qui m'ont permises de créer l'image ISO de mon système Arcade, à partir de ce qui est décrit dans mon dernier script d'installation du bartop.
Mis à jour le 11 Mai 2018 (Debian 9 Stretch), avec ma config lb en pièce jointe.
1 - Installation de Live-Build et des outils :
apt-get install live-build live-manual live-tools
- Créer un dossier de travail et s'y rendre :
mkdir livearcade cd livearcade
- Lancer la config afin de créer l'arborescence de travail :
lb config
Les dossiers auto, .build, config et local ont donc été ajouté.
2 - Préparation de la session Live :
Il s'agit ici de créer ou d'amender un certains nombre de fichiers qui vont permettre de personnaliser la distribution GNU/Linux Live qui sera générée à l'issue du build.
2.1 - La configuration du build :
- Le fichier auto/config :
#!/bin/sh set -e lb config noauto \ --bootappend-live "boot=live persistence components locales=fr_FR.UTF-8 keyboard-layouts=fr username=arcade autologin hostname=Makoto-no-Akedo" \ --architectures amd64 \ --distribution stretch \ --debian-installer live \ --archive-areas "main contrib non-free" \ "${@}"
--bootappend-live "…", pour spécifier le type de clavier, le nom d'utilisateur et le login automatique de celui-ci. L'option « persistence » si vous souhaitez retrouvez vos données entre chaque démarrage (les données seront écrite sur la cléUSB, voir ce billet pour son exploitation)
--debian-installer live, pour spécifier qu'en cas d'installation, la session live est reproduite à d'identique sur le disque dur.
2.2 - Les packets logiciels qu'on désire proposer :
- Le fichier config/package-lists/arcade.list.chroot :
################################# # Liste des packets a installer # ################################# libsdl-ttf2.0-0 libgtk2.0-0 libqtgui4 libgconf-2-4 xserver-xorg-video-all xfonts-base xinit x11-xserver-utils alsa-base alsa-utils libsdl1.2debian sshfs acpid sudo firmware-linux-nonfree psmisc console-setup console-setup-linux
2.3 - Les fichiers du dossier personnel :
Il suffit de simplement copier le contenu du dossier /home/arcade dans le dossier /includes.chroot/etc/skel qu'on aura préalablement créé,
mkdir config/includes.chroot/etc mkdir config/includes.chroot/etc/skel
Donc j'ai déposé les fichiers et dossiers qui concernent l'émulation et les roms, à savoir .advance (dossier et sous-dossiers), usb (dossier vide), hiscore.dat et mame.ini.
Et les fichiers pour démarrer la session X et AdvanceMenu automatiquement :
- Le fichier config/includes.chroot/etc/skel/.profile :
# if running bash if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi tty=`tty` # Start X only if login in tty1 if [ $tty = '/dev/tty1' ]; then startx fi
- Le fichier config/includes.chroot/etc/skel/.xinitrc :
advmenu & xterm -maximized -bg black -fg grey75
2.4 - La customisation du système :
Ici j'ai besoin de xorg.conf pour régler l'affichage, et de fichiers systemd pour permettre le login automatique de la session live.
- Le fichier config/includes.chroot/etc/X11/xorg.conf
Section "Device" Identifier "Video" EndSection Section "Monitor" Identifier "Ecran" EndSection Section "Screen" Identifier "Default Screen" Device "Video" Monitor "Ecran" DefaultDepth 24 SubSection "Display" Depth 24 Modes "640x480" EndSubSection EndSection
- Le fichier config/includes.chroot/etc/systemd/system/getty.target.wants/getty@tty1.service
[Unit] Description=Getty on %I Documentation=man:agetty(8) man:systemd-getty-generator(8) Documentation=http://0pointer.de/blog/projects/serial-console.html After=systemd-user-sessions.service plymouth-quit-wait.service After=rc-local.service Before=getty.target IgnoreOnIsolate=yes ConditionPathExists=/dev/tty0 [Service] ExecStart=-/sbin/agetty -a arcade --noclear %I $TERM Type=idle Restart=always RestartSec=0 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes KillMode=process IgnoreSIGPIPE=no SendSIGHUP=yes Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION= [Install] WantedBy=getty.target DefaultInstance=tty1
- Le fichier config/includes.chroot/etc/systemd/system/getty@tty1.service.d/autologin.conf
[service] ExecStart= ExecStart=-/sbin/agetty --autologin arcade --noclear %I 38400 linux
- Le fichier config/includes.chroot/etc/sudoers
Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" root ALL=(ALL:ALL) ALL %sudo ALL=(ALL:ALL) ALL arcade ALL=NOPASSWD: /sbin/reboot, /bin/mount, /bin/umount
2.5 - Pour installer des packets logiciels tierce :
- Si un logiciel n'est pas dans les dépôts où qu'il a été compilé soit même, il faut juste les déposer dans le dossier config/packages.chroot/
J'y ai donc placé le packet advancemame_3.7-1_amd64.deb que j'ai préalablement généré depuis les sources.
2.6 - Installation automatique :
Si on ne fait rien, une fois l'image iso créée, elle proposera via son menu de boot, d'installer le système de manière interactive.
Il faudra donc répondre aux questions posées, comme je l'avais détaillé à l'époque par des photos d'écran.
C'est une opération fastidieuse pour l'utilisateur, et j'ai donc voulu rendre l'opération automatique.
Ça se passe en créant le fichier preseed.cfg où l'on va donc indiquer à l'installeur quoi répondre.
- Le fichier config/includes.installer/preseed.cfg :
#### Contents of the preconfiguration file (for stretch) # Configurer la locale permet aussi de configurer la langue et le pays de l'OS d-i debian-installer/language string fr d-i debian-installer/country string FR d-i debian-installer/locale string fr_FR.UTF-8 # Choix du clavier d-i keyboard-configuration/xkb-keymap select fr(latin9) ### Configuration Réseau # On désactive la configuration réseau d-i netcfg/enable boolean false # Mais on doit quand même configurer le nom de machine d-i netcfg/get_hostname string Makoto-no-Akedo # Ainsi que le domaine d-i netcfg/get_domain string Makoto-no-Akedo.com # Ici, on définit le nom local de la machine d-i netcfg/hostname string Makoto-no-Akedo ### Account setup # Root password, either in clear text d-i passwd/root-password password arcade d-i passwd/root-password-again password arcade # To create a normal user account. d-i passwd/user-fullname string arcade d-i passwd/username string arcade # Normal user's password, either in clear text d-i passwd/user-password password arcade d-i passwd/user-password-again password arcade ### Clock and time zone setup d-i clock-setup/utc boolean true d-i time/zone string Europe/Paris # On désactive l'utilisation de NTP pour configurer l'heure (le réseau n'est pas disponible) d-i clock-setup/ntp boolean false ### Partitionnement # Seul le premier disque est partionné d-i partman-auto/disk string /dev/sda # On partionne en "normal": pas de RAID ni de LVM d-i partman-auto/method string regular # Pour être sûr, on supprime une éventuelle configuration LVM d-i partman-lvm/device_remove_lvm boolean true # Même chose pour le RAID d-i partman-md/device_remove_md boolean true # Chaînes pour ne pas toucher la configuration LVM (donc pas de configuration) d-i partman-lvm/confirm boolean true d-i partman-lvm/confirm_nooverwrite boolean true # You can choose one of the three predefined partitioning recipes: # - atomic: all files in one partition # - home: separate /home partition # - multi: separate /home, /var, and /tmp partitions d-i partman-auto/choose_recipe select home # On valide sans confirmation utilisateur la configuration de partman d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true # fstab utilisera des UUID plutôt que des noms de périphériques d-i partman/mount_style select uuid ### Apt setup # You can choose to install non-free and contrib software. d-i apt-setup/non-free boolean true d-i apt-setup/contrib boolean true # if you don't want to use a network mirror. d-i apt-setup/use_mirror boolean false # On active les services security et updates d-i apt-setup/services-select multiselect security, updates d-i apt-setup/security_host string security.debian.org ### Configuration de GRUB # Seul Debian sera géré par GRUB d-i grub-installer/only_debian boolean true # Si on détecte un autre OS, on installera GRUB sur le MBR d-i grub-installer/with_other_os boolean true # On installe GRUB sur /dev/sda - commenter si la détection du disque dur n'est pas évidente (à cause de la cléUSB qui se mettrait en sda) d-i grub-installer/bootdev string /dev/sda
3 - Génération de l'image :
- Afin de prendre en compte toutes les modifications effectuées, il faut, depuis le dossier livearcade, lancer à nouveau la commande :
lb config
Et de vérifier qu'aucune erreur ne remonte…
- Ensuite on peut enfin lancer la construction de l'image iso :
lb build
Le processus est assez long, et il lui faudra entre 30 min et 1h pour s'achever suivant la puissance machine et le débit internet.
Si aucune erreur n'est survenue, une image iso est alors disponible dans le dossier livearcade
live-image-amd64.hybrid.iso
- Pour rendre une cléUSB bootable avec cette iso et alors tester le système live sur un ordi :
dd if=live-image-amd64.hybrid.iso of=/dev/sdb bs=4M; sync
- Insatisfait du résultat ? Pour modifier des trucs et relancer une génération de l'image iso, il faut nettoyer auparavant le dossier livearcade avec la commande :
lb clean
4 - Personnaliser l'écran d'accueil et son menu boot :
Une fois la session live testée, on se retrouve avec un écran d'accueil standard au casque de chantier et aux options de boot superflue pour notre usage.
On va donc amender Live Build pour intégrer une image de fond et customiser le menu.
4.1 - L'image de fond - splash screen :
C'est très simple, il s'agit ici de créer une image au format png et de la déposer dans le dossier config/includes.binary/isolinux qu'on aura pris soins de créer.
L'image doit être nommée splash.png et avoir une résolution de 640x480 pixels.
- Le fichier config/includes.binary/isolinux/splash.png — — — — — — — >
4.2 - customiser le menu[1] :
En montant d'image iso précédemment crée, on pourra récupérer à la racine le dossier isolinux contenant les fichiers standard afin de les modifier, pour enfin relancer la génération de l'image (chapitre 3 du billet).
Voici ceux que j'ai customisé :
- Le fichier config/includes.binary/isolinux/menu.cfg :
C'est l'index qui appelle les autres fichiers. Les deux premières lignes permettent de déterminer la position horizontale et la largeur du menu.
menu hshift 27 menu width 62 include stdmenu.cfg include live.cfg include install.cfg menu end menu clear
- Le fichier config/includes.binary/isolinux/stdmenu.cfg :
Il permet de configurer les couleurs et d'indiquer les commandes claviers standard (désactivées avec # en fin de fichier). menu vshift permet de positionner le menu verticalement.
menu background splash.png menu color title * #FFFFFFFF * menu color border * #00000000 #00000000 none menu color sel * #ffffffff #76a1d0ff * menu color hotsel 1;7;37;40 #ffffffff #76a1d0ff * menu color tabmsg * #ffffffff #00000000 * menu color help 37;40 #ffdddd00 #00000000 none menu vshift 1 menu rows 10 menu helpmsgrow 15 # The command line must be at least one line from the bottom. menu cmdlinerow 16 #menu timeoutrow 16 #menu tabmsgrow 18 #menu tabmsg Press ENTER to boot or TAB to edit a menu entry
- Le fichier config/includes.binary/isolinux/live.cfg :
Il s'agit de la première ligne du menu, pour initier la session live. Elle reprend les arguments --bootappend-live du chapitre 2.1 en début de billet.
label live-amd64 menu label Systeme Arcade ^Live Session (amd64) menu default linux /live/vmlinuz initrd /live/initrd.img append boot=live persistence components locales=fr_FR.UTF-8 keyboard-layouts=fr username=arcade autologin hostname=Makoto-no-Akedo
- Le fichier config/includes.binary/isolinux/install.cfg :
Il appelle un sous-menu qui propose deux choix, ceci afin de sécuriser un peu l'opération d'installation et de prévenir les frappes de claviers inopportunes.
MENU BEGIN Installer sur le Disque label Voulez-vous installer sur le disque ? TEXT HELP !! ATTENTION, CECI EFFACERA TOUT LE DISQUE DUR !! !! SANS DEMANDER CONFIRMATION !! ENDTEXT label install menu label ---> Oui... Le disque sera formate linux /install/vmlinuz initrd /install/initrd.gz append vga=788 --- quiet TEXT HELP !! ATTENTION, CECI EFFACERA TOUT LE DISQUE DUR !! !! SANS DEMANDER CONFIRMATION !! ENDTEXT label ---> Non ! MENU EXIT MENU END
Pour tester facilement les changements apportés au menu, on pourra monter l'image iso et la modifier directement plutôt que de la régénérer chaque fois avec Live Build, ce qui peut s’avérer hyper lourd pour une erreur de syntaxe, en suivant le tuto ici http://debian-facile.org/doc:install:preseed
En résumé :
mkdir isoorig isonew mount -o loop -t iso9660 debian-version-netinst.iso isoorig rsync -a -H –exclude=TRANS.TBL isoorig/ isonew
Modifier les fichiers de isonew, une fois les modifications terminées, reconstruire l'iso :
cd isonew md5sum `find -follow -type f` > md5sum.txt genisoimage -o ../custom_install.iso -r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat ../isonew
Pour tester vite fait, je fais booter l'iso dans VirtualBox.
5 - Notes, pour aller plus loin :
- Plutôt que de créer directement des fichiers système dans config/includes.chroot/etc/, comme je l'ai fait pour ces deux-ci :
config/includes.chroot/etc/systemd/system/getty.target.wants/getty@tty1.service
config/includes.chroot/etc/systemd/system/getty@tty1.service.d/autologin.conf
Il est possible d'écrire des scripts d'opérations qui font la même chose et de les déposer dans le dossier config/hooks :
- Le fichier config/hooks/live/autologin.chroot
#!/bin/sh set -e mkdir /etc/systemd/system/getty@tty1.service.d echo "[service]" > /etc/systemd/system/getty@tty1.service.d/autologin.conf echo "ExecStart=" >> /etc/systemd/system/getty@tty1.service.d/autologin.conf echo "ExecStart=-/sbin/agetty --autologin arcade --noclear %I 38400 linux" >> /etc/systemd/system/getty@tty1.service.d/autologin.conf sed -i -e "s/sbin\/agetty/sbin\/agetty -a arcade/g" /etc/systemd/system/getty.target.wants/getty@tty1.service
De même on peut customiser la console d’accueil avec ces quelques messages utiles :
- Le fichier config/hooks/live/accueil.hook.chroot :
#!/bin/sh set -e echo "**************************************" >> /etc/issue echo "* Bienvenue sur votre Borne d'Arcade *" >> /etc/issue echo "**************************************" >> /etc/issue echo "Utilisateur : arcade" >> /etc/issue echo "Mot de passe : arcade" >> /etc/issue echo "Pour les droits root dans la session live, utilisez sudo" >> /etc/issue echo "" >> /etc/issue echo "Pour les droits root avec le système arcade installé :" >> /etc/issue echo "Utilisateur : root" >> /etc/issue echo "Mot de passe : arcade" >> /etc/issue echo "" >> /etc/issue # Pour changer le mot de passe de la session LIVE # sans ces deux commandes, le mot de passe par défaut est : "live" adduser --disabled-password --gecos "" arcade echo "arcade:arcade" | chpasswd
- Il est aussi possible de différencier quelque peu la session live de la session installée !
Par exemple le fichier advmenu.rc contient des commandes utilisant le device sdb1, mais j'aurais besoin qu'en session live, cela soit sdc1.
Pour cela le dossier config/includes.chroot/lib/live/config/ exécute les scripts qu'il contient uniquement au démarrage de la session live.
Le script suivant, placé ce dossier et marqué exécutable va permettre de changer le contenu du fichier. Pour la session live on aura sdc1 (modifié au boot) et si on installe le système, on aura donc sdb1 (resté tel quel).
- config/includes.chroot/lib/live/config/9000-advmenu.chroot
#!/bin/sh set -e sed -i -e "s/sdb1/sdc1/g" /home/arcade/.advance/advmenu.rc
Si ça ne fonctionnait pas, on pourrait aller voir sur la session live, le log du démarrage de session dans /var/log/live.
Ressources :
http://www.yeuxdelibad.net/Logiciel-libre/Debian/Creer_sa_propre_distribution_avec_live-build.html
https://debian-facile.org/doc:install:live-build
https://debian-facile.org/utilisateurs:abdelqahar:tutos:live-build
https://debian-live.alioth.debian.org/live-manual/stable/manual/html/live-manual.en.html#630
http://complete.sisudoc.org/manual/html/live-manual/customizing-run-time-behaviours.fr.html
https://arpinux.org/public/doc_arp_pdf/
http://man.developpez.com/man7/live-config/
http://wiki.csnu.org/index.php/Debian_live
https://arpinux.developpez.com/construire-un-live-debian/#L12-1
https://www.syslinux.org/wiki/index.php?title=Menu#Introduction
http://debian-facile.org/doc:install:preseed
https://medspx.fr/blog/Debian/preseed_snippets/
https://debian-handbook.info/browse/fr-FR/stable/sect.automated-installation.html
https://www.debian.org/releases/stable/i386/apbs04.html.fr
https://www.debian.org/releases/stretch/example-preseed.txt
Note
[1] Attention, il semblerais que le menu ne fonctionne correctement que si la cléUSB démarre selon le bon mode du bios, à savoir Legacy sur mon PC… sinon essayer UEFI, sait-on jamais