Debian live personnalisée - Exemple

Mise à jour : Debian 10.5

L'objectif est ici de construire une clé USB "Debian live"personnalisée avec les caractéristiques suivantes :

La construction s'effectue à partir d'un système linux opérationnel sous Debian Buster, avec l'assistance du paquet live-build

Références :

Sommaire :

1 - Préalable

1.1 - Installation de live build

$ sudo aptitude install live-build
$ mkdir debian_live
$ cd debian_live
$ mkdir auto
$ cp /usr/share/doc/live-build/examples/auto/* auto/

1.2 - Installation de apt-cacher-ng (optionnel)

$ sudo aptitude install apt-cacher-ng
$ sudo systemctl status apt-cacher-ng.service
$ sudo lsof -i :3142 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apt-cache 947 apt-cacher-ng 5u IPv4 32816 0t0 TCP *:3142 (LISTEN)
apt-cache 947 apt-cacher-ng 6u IPv6 32817 0t0 TCP *:3142 (LISTEN)
$ export http_proxy=localhost:3142
$ printenv http_proxy
localhost:3142
$ wget http://deb.debian.org/debian//dists/buster/main/Contents-amd64.gz
....
Connexion à 127.0.0.1:3142… connecté.
requête Proxy transmise, en attente de la réponse… 200 OK
......
$ links2 -g http://127.0.0.1:3142/acng-report.html
--apt-http-proxy "http://127.0.0.1:3142"
$ ls /var/cache/apt-cacher-ng/debrep/pool/main/
a c e g i k liba libc libe libg libj libp libs libw m o r t w z
b d f h j l libb libd libf libi libl libr libt libx n p s u x
$ wget http://ftp.debian.org/debian/pool/main/f/fbi/fbi_2.09-1+b1_amd64.deb
$ wget http://localhost:3142/ftp.debian.org/debian/pool/main/f/fbi/fbi_2.09-1+b1_amd64.deb

ce qui permet d'utiliser apt-cacher-ng avec la commande debootstrap :

$ sudo debootstrap buster ./ http://localhost:3142/ftp.debian.org/debian

1.3 - Préférences apt pour l'installation des paquets backports

$ cat backports.pref.chroot
Package: intel-microcode
Pin: release a=buster-backports
Pin-Priority: 600

Package: linux-image-amd64
Pin: release a=buster-backports
Pin-Priority: 600

Package: firmware-*
Pin: release a=buster-backports
Pin-Priority: 600

Ce fichier sera utilisé par live build pendant le chroot. Il prend place dans le répertoire config/archives

$ mkdir -p config/archives
$ tree config/archives

1.4 - Préparation des listes de paquets

# Firmwares
$ pf="intel-microcode firmware-iwlwifi firmware-linux-free firmware-misc-nonfree firmware-realtek"

# Paquets de base console
$ pc="console-setup task-laptop command-not-found bash-completion tasksel cryptsetup links2"
# Paquets de base hardware console
$ pc1="sysfsutils pciutils lsscsi dmidecode pciutils nvme-cli hdparm smartmontools isenkram"
# Paquets pour le partitionnement et le formatage $ pc2="fdisk gdisk parted e2fsprogs dosfstools util-linux"

# Serveur graphque, bureau XFCE de base
$ pb="xorg xserver-xorg xserver-xorg-video-intel xserver-xorg-input-all xdg-utils \
lightdm xfce4 xfce4-terminal network-manager-gnome medit firefox-esr atril \
keepassxc debian-installer-launcher"
$ aptitude install $pf/buster-backports $pc $pc1 $pc2 $pb -s
$ echo "$pf" > firmware.list.chroot
$ echo "$pc" > console.list.chroot
$ echo "$pc1" > console1.list.chroot
$ echo "$pc2" > console2.list.chroot
$ echo "$pb" > bureau.list.chroot
$ tree config/package-lists/
../live_mini/config/package-lists/
└── live.list.chroot

0 directories, 1 file

1.5 - Scripts de test qemu (optionnel)

Afin de simplifier le test sous qemu, créer des scripts de test sous les différents amorçages prévus : voir en Annexe

2 - Configuration des options de lb_config

2.1 - Sélection des options

$ cat auto/config
#!/bin/sh

set -e

lb config noauto \
--apt-http-proxy "http://127.0.0.1:3142" \
--mode "debian" \
--system "live" \
--architecture "amd64" \
--distribution "buster" \
--parent-distribution "buster" \
--parent-debian-installer-distribution "buster" \
--apt "apt" \
--apt-recommends "true" \
--archive-areas "main" \
--apt-source-archives "false" \
--security "false" \
--update "false" \
--backports "false" \
--firmware-binary "false" \
--firmware-chroot "false" \
--binary-images "iso-hybrid" \
--binary-filesystem "fat32" \
--bootloaders "syslinux,grub-efi" \
--bootappend-live "boot=live" \
--debian-installer "live" \
--memtest "none" \
--uefi-secure-boot "enable" \
--cache-indices "false" \
--verbose \
--zsync false
"${@}"

2.2 - Test de l'image correspondante

$ sudo lb clean
$ lb config
$ sudo lb build

2.3 - Vérifications

# Le clavier n'est pas en français au démarrage - installer console-setup
$ sudo aptitude install console-setup

# Vérifier la version
$ cat /etc/debian_version
10.5

# Vérifier les sources
cat /etc/apt/sources.list
deb http://deb.debian.org/debian/ buster main non-free contrib
deb http://deb.debian.org/debian/ buster-updates main non-free contrib
deb http://deb.debian.org/debian/ buster-backports main non-free contrib
deb http://security.debian.org/debian-security buster/updates main contrib non-free

....

3 - Configuration finale

$ export http_proxy=localhost:3142
$ sudo lb clean
$ lb config
$ cp backports.pref.chroot config/archives/
$ cp *.list.chroot config/package-lists/
$ sudo lb build
# Vérifier la version du noyau (backports)
aptitude versions ~ilinux-image

# Vérifier les versions des firmwares (backports quand elles existent)
aptitude versions ~ifirmware

# Vérifier la présence des utilitaires : command-not-found bash-completion ...
$ sudo debian-installer-launcher

échoue avec Message : Les versions du noyau de la session live et de l'installateur doivent être identiques

Annexe 1 - Script Buster live - Version finale

#! /usr/bin/env bash

# http_proxy
# export http_proxy=localhost:3142
# export http_proxy=""
printenv http_proxy

# Firmwares
pf="intel-microcode firmware-iwlwifi firmware-linux-free firmware-misc-nonfree firmware-realtek"

# Paquets de base console
pc="console-setup task-laptop command-not-found bash-completion tasksel cryptsetup
links2"

# Paquets de base hardware console
pc1="sysfsutils pciutils lsscsi dmidecode pciutils nvme-cli hdparm smartmontools isenkram"

# Paquets pour le partitionnement et le formatage
pc2="fdisk gdisk parted e2fsprogs dosfstools util-linux"

# Serveur graphque, bureau XFCE de base
pb="xorg xserver-xorg xserver-xorg-video-intel xserver-xorg-input-all xdg-utils \
lightdm xfce4 xfce4-terminal network-manager-gnome medit firefox-esr atril \
keepassxc debian-installer-launcher"

# Fichiers liste
echo "$pf" > firmware.list.chroot
echo "$pc" > console.list.chroot
echo "$pc1" > console1.list.chroot
echo "$pc2" > console2.list.chroot
echo "$pb" > bureau.list.chroot

# Nettoyage
sudo lb clean

# Config
lb config

# Copie préférences backports
mkdir -p config/archives
cp backports.pref.chroot config/archives/

# Copie paquets
mkdir -p config/packages-lists
cp firmware.list.chroot config/package-lists

cp console.list.chroot config/package-lists
#cp console1.list.chroot config/package-lists
#cp console2.list.chroot config/package-lists
cp bureau.list.chroot config/package-lists

# Construction
sudo lb build

# Bilan
cat build.log |grep -E "W:|secure"
ls -l *iso

exit

Annexe 2 - Scripts qemu

$ cat test_bios
#! /usr/bin/env bash

qemu-img create -f qcow2 debian.qcow2 10G

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-drive media=disk,format=qcow2,file=debian.qcow2 \
-drive media=cdrom,format=raw,file=live-image-amd64.hybrid.iso -boot d
philippe@buster:~/soft/live_console
$ cat test_uefi
#! /usr/bin/env bash

qemu-img create -f qcow2 debian.qcow2 10G

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-drive media=cdrom,format=raw,file=live-image-amd64.hybrid.iso -boot d \
-bios /usr/share/ovmf/OVMF.fd \
-vga virtio

$ cat test_secboot
#! /usr/bin/env bash

qemu-img create -f qcow2 debian.qcow2 10G
cp /opt/suze/ovmf/OVMF_CODE.secboot.fd ./ && cp /opt/suze/ovmf/OVMF_VARS.secboot.fd ./

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-machine pc-q35-2.5 \
-drive if=pflash,format=raw,readonly,file=./OVMF_CODE.secboot.fd \
-drive if=pflash,format=raw,file=./OVMF_VARS.secboot.fd \
-drive format=raw,media=cdrom,file=live-image-amd64.hybrid.iso -boot d \
-vga virtio
$ cat run_bios
#! /usr/bin/env bash

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-drive media=disk,format=qcow2,file=debian.qcow2 -boot c
$ cat run_uefi 
#! /usr/bin/env bash

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-drive media=disk,format=qcow2,file=debian.qcow2 -boot c \
-bios /usr/share/ovmf/OVMF.fd
$ cat run_secboot 
#! /usr/bin/env bash

cp /opt/suze/ovmf/OVMF_CODE.secboot.fd ./ && cp /opt/suze/ovmf/OVMF_VARS.secboot.fd ./

qemu-system-x86_64 -enable-kvm -cpu host -m 2048 -smp 4 \
-machine pc-q35-2.5 \
-drive media=disk,format=qcow2,file=debian.qcow2 -boot c \
-drive if=pflash,format=raw,readonly,file=./OVMF_CODE.secboot.fd \
-drive if=pflash,format=raw,file=./OVMF_VARS.secboot.fd

Annexe 3 - Liste des options de configuration

$ for i in config/{bootstrap,chroot,binary,common}; \
do echo $i ; cat $i | grep -i -A1 "proxy" ;done

Annexe 4 - Configuration "allégée" pour construction rapide

$ cat auto/config 
#!/bin/sh

set -e

lb config noauto \
--apt-http-proxy "http://127.0.0.1:3142" \
--mode "debian" \
--system "live" \
--architecture "amd64" \
--distribution "buster" \
--parent-distribution "buster" \
--parent-debian-installer-distribution "buster" \
--apt "apt" \
--apt-recommends "true" \
--archive-areas "main" \
--apt-source-archives "false" \
--security "false" \
--update "false" \
--backports "false" \
--firmware-binary "false" \
--firmware-chroot "false" \
--binary-images "iso-hybrid" \
--binary-filesystem "fat32" \
--bootloaders "syslinux" \
--bootappend-live "boot=live" \
--debian-installer "false" \
--memtest "none" \
--uefi-secure-boot "false" \
--cache-indices "false" \
--verbose \
"${@}"
$ qemu-system-x86_64 -drive media=cdrom,format=raw,file=live-image-amd64.hybrid.iso -enable-kvm -cpu host -m 2048 -smp 4 -boot d