まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Live Build : créer une distribution GNU/Linux à base Debian

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 :

MakotoNoAkedo01.png 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 :
splash.png 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 :

splash01.png 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 :

splash03.png splash02.png 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

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet