Création d'une image debian bootable (système de rescue, live system)
Manuel complet : https://live-team.pages.debian.net/live-manual/html/live-manual/index.en.html
Paquets nécessaires
aptitude install live-build
mkdir live-default && cd live-default
Préparation de l’environnement
Pour debian jessie :
lb config --distribution jessie --binary-images iso-hybrid --architectures amd64 --linux-flavours amd64 \ --archive-areas "main contrib non-free" --apt-indices false \ --memtest memtest86+ --security true --updates true --backports true \ --mirror-bootstrap http://ftp.fr.debian.org/debian/ --mirror-binary http://deb.debian.org/debian/ \ --bootappend-live "boot=live components timezone=Europe/Paris locales=en_US.UTF-8 keyboard-layouts=fr hostname=rescue \ username=user noprompt noeject autologin"
Pour debian stretch :
lb config --distribution stretch --binary-images iso-hybrid --architectures amd64 --linux-flavours amd64 \ --archive-areas "main contrib non-free" --apt-indices false \ --memtest memtest86+ --security true --updates true --backports true \ --mirror-bootstrap http://ftp.fr.debian.org/debian/ --mirror-binary http://deb.debian.org/debian/ \ --bootappend-live "boot=live components timezone=Europe/Paris locales=en_US.UTF-8 keyboard-layouts=fr hostname=rescue \ username=user noprompt noeject autologin"
Pour debian buster :
lb config --distribution buster --binary-images iso-hybrid --architectures amd64 --linux-flavours amd64 \ --archive-areas "main contrib non-free" --apt-indices false \ --memtest memtest86+ --security true --updates true --backports true \ --mirror-bootstrap http://ftp.fr.debian.org/debian/ --mirror-binary http://deb.debian.org/debian/ \ --bootappend-live "boot=live components timezone=Europe/Paris locales=en_US.UTF-8 keyboard-layouts=fr hostname=rescue \ username=user noprompt noeject autologin"
Tunning
Notes générales
Bugfix
Autologin fix pour debian jessie uniquement
Pour debian jessie avec systemd, afin d'activer l'autologin, il faut créer un script personnalisé dans config/hooks/live/autologin.hook.chroot
:
cat > config/hooks/live/autologin.hook.chroot << EOF #!/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 "root" %I" >> /etc/systemd/system/getty@tty1.service.d/autologin.conf EOF
Ce fichier sera exécuté au moment de la création de notre image.
keymap fix debian stretch/buster
Un bug empêche debian stretch/buster de démarrer avec la keymap que vous avez défini lors de l'étape de configuration.
Pour le régler ce problème, nous allons créer un fichier exécutable qui sera lancé par live-config lors du démarrage de l'iso et qui va charger la bonne keymap :
mkdir -p config/includes.chroot/lib/live/config/ chmod 755 config/includes.chroot/lib/ config/includes.chroot/lib/live/ config/includes.chroot/lib/live/config/ cat > config/includes.chroot/lib/live/config/9999-fix-keymap << EOF #!/bin/sh #/etc/init.d/console-setup restart /bin/setupcon EOF chmod 755 config/includes.chroot/lib/live/config/9999-fix-keymap
Minimiser la taille de l'image
Vous pouvez ajouter l'option --debootstrap-options "--variant=minbase"
à lb config
pour réduire la taille de l'iso généré. Cela désactivera entre autre les fonctionnalités réseaux et crontab.
Notez que pour qu'une telle image soit bootable, il faut ajouter les paquets init
et systemd-sysv
en les énumérant par exemple dans le fichier config/package-lists/mandatory.list.chroot
MOTD au shell
Un peu de tunning : config/hooks/live/motd.hook.chroot
:
cat > config/hooks/live/motd.hook.chroot << EOF #!/bin/sh set -e echo "Default user: user" >> /etc/issue echo "Default pass: live" >> /etc/issue echo "You can get root by using sudo su" >> /etc/issue echo "" >> /etc/issue EOF
Notez qu'on utilise un hook lancé durant la construction de notre image, technique qui a l'avantage de préserver le contenu d'origine du fichier /etc/issue
installé par debian (généralement, la version de la distribution, qui change donc selon votre configuration à lb config
).
Une alternative, quoi que parfois moins fiable, et ne permettant pas de conserver le contenu du fichier d'origine, aurait été de créer un fichier config/includes.chroot_after_packages/etc/issue
contenant directement le motd.
keymap du clavier et configuration de l'utilisateur
Pour avoir la console en keymap française et assurer la création de l'utilisateur live, ajoutez les paquets console-data console-setup console-setup-linux user-setup
dans la liste des paquets a installer
echo console-data console-setup console-setup-linux user-setup >> config/package-lists/keymap.list.chroot
Liste personnalisée de packages
Pour installer une liste personnalisée de package, créez un fichier mespackets.list.chroot
dans config/package-lists
:
echo whois dnsutils htop jnettop tcpdump mtr telnet git iperf iperf3 wget curl rsync screen patch aptitude lm-sensors lshw \ parted nmap binutils lsof dosfstools ntfs-3g debootstrap pciutils usbutils lsb-release debian-goodies fancontrol \ zerofree ethtool net-tools testdisk gddrescue smartmontools hdparm lvm2 psmisc freeipmi ipmitool openipmi gdisk bzip2 zsync > config/package-lists/mypackage.list.chroot
Pour installer un package depuis les dépots backports (sous réserve que vous ayez activez ces dépots à l'opération lb config
:
echo "smartmontools/bullseye-backports" > config/package-lists/mypackage-bpo.list.chroot
Pinner un package depuis les dépots backports
Pendant le chroot uniquement :
cat >> config/archives/backports.pref.chroot << EOF Package: smartmontools Pin: release a=bullseye-backports Pin-Priority: 600 EOF
Dans l'image définitive :
cat >> config/archives/backports.pref.binary << EOF Package: smartmontools Pin: release a=bullseye-backports Pin-Priority: 600 EOF
Ajouter un dépôt personnalisé
Pour que le dépôt soit accessible durant la création de l'image (permettant donc d'installer un paquet sur l'image) :
echo "deb http://mirror/debian/ sid main" > config/archives/sid.list.chroot
Pour que le dépôt soit accessible sur le système définitif créé (après avoir booté l'iso) :
echo "deb http://mirror/debian/ sid main" > config/archives/sid.list.binary
Si ce dépôt requiert une clé gpg, déposez sa version texte (armored) dans config/archives/sid.key.chroot
et/ou config/archives/sid.key.binary
Modification du boot
Les différents bootloaders utilisés sont situés dans /usr/share/live/build/bootloaders/
Vous pouvez les copier intégralement ou partiellement dans config/bootloaders/
Par défaut, pour les images iso et iso-hybrid, c'est isolinux qui est utilisé, agrémenté en supplément des fichiers situés dans le dossier syslinux_common
boot automatique isolinux
Pour ajouter un boot automatique au bout de 30secondes :
mkdir config/bootloaders/ cp -R /usr/share/live/build/bootloaders/isolinux/ config/bootloaders/isolinux/ sed -i "s/timeout 0/timeout 300/g" config/bootloaders/isolinux/isolinux.cfg
Un timeout de 0 signifie infini, les unités sont des dixièmes de secondes.
Modifier les entrées du boot isolinux
mkdir config/bootloaders/ cp -R /usr/share/live/build/bootloaders/syslinux_common/ config/bootloaders/syslinux_common/
Puis éditez le fichier config/bootloaders/syslinux_common/live.cfg.in
openssh
On peut ajouter des clés ssh de la même manière :
cat > config/hooks/live/addsshkey.hook.chroot << EOF #!/bin/sh set -e mkdir /root/.ssh/ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG0Z4ITNfoPG0+L5UMyY253C5CA8JQcWZHb9Hd/nuWaj pfoo@laptop" > /root/.ssh/authorized_keys sed -i "s/PermitRootLogin no/PermitRootLogin without-password/g" /etc/ssh/sshd_config EOF
Notez qu'on modifie en même temps la configuration du serveur openssh afin d'autoriser la connexion root avec des clés.
Tout celà n'a d'intérêt que si on installe aussi openssh :
echo openssh-server >> config/package-lists/ssh.list.chroot
Les clés serveurs openssh seront automatiquement supprimés après l'installation par le fichier config/hooks/0160-remove-openssh-server-host-keys.hook.chroot
, puis régénéré lors du boot par live-config.
Dans le cas ou vous installez un serveur ssh, il peut être préférable de changer le mot-de-passe utilisateur. Vous pouvez vous inspirer du fichier /usr/share/doc/live-config/examples/hooks/passwd
pour créer une hook réalisant cela.
Notez tout de même que par défaut, au démarrage de l'iso, le login password ssh est désactivé (fichier /lib/live/config/1160-openssh-server
)
Note :
- Pour l'ajout de la clé ssh, nous aurions aussi pu créer un fichier
config/includes.chroot_after_packages/root/.ssh/authorized_keys
- Néanmoins, pour exécuter la commande sed qui modifie la configuration openssh, nous sommes obligé de passer par une hook/live afin d'éditer la configuration après que le système du chroot ait été installé (et donc après que openssh soit installé et configuré).
- Alternativement, il serait également possible d'utiliser le dossier
config/includes.chroot_after_packages/
afin de remplacer totalement la configuration de openssh (ce qui implique également que vous assumiez totalement les mises à jour de la configuration de openssh de version en version de debian)
Un petit README pour terminer ?
Les dossiers config/includes.chroot_after_packages/
et config/includes.chroot_before_packages/
permettent d'ajouter des dossiers et fichiers qui sont incorporés au système de fichier créé. Ces fichiers sont transférés soit avant l'installation des paquets, soit après.
mkdir config/includes.chroot_after_packages/root/ chmod 750 config/includes.chroot_after_packages/root/ cat > config/includes.chroot_after_packages/root/README << EOF Vous pouvez créer les fichiers que vous voulez de cette manière afin de les inclures dans le système de fichier de linux EOF
Attention, ces fichiers écrasent les fichiers pré-existant installés automatiquement par debian !
Un petit README a la root de l'iso ?
Le dossier config/includes.binary/README
permet de créer des fichiers ou dossier à la racine de l'iso (ils seront donc accessible même si vous branchez votre future clé usb / cdrom sous windows par exemple)
cat > config/includes.binary/README << EOF Vous pouvez créer les fichiers que vous voulez de cette manière, ils seront situés directement à la racine de l'iso EOF
Executer des hooks personnalisée lors du boot
Il faut créer des fichiers exécutables dans config/includes.chroot/lib/live/config/
Ces fichiers seront exécutés lors du démarrage de l'iso, juste avant que vous obteniez un prompt.
Création de l'image
Enfin, pour lancer la création de l'image :
lb build
ajouter memtest : méthode manuelle
Notez que si vous avez suivi ce wiki, vous devriez déjà avoir memtest installé (--memtest memtest86+
), vous n'avez donc rien à faire. Memtest se situ dans le menu advanced au boot.
cd binary/live/ wget http://www.memtest.org/download/5.01/memtest86+-5.01.bin.gz gunzip memtest86+-5.01.bin.gz mv memtest86+-5.01.bin memtest cd ../../ lb binary_iso --force
image usb uniquement
Par défaut, la configuration utilisée dans ce wiki créé une image hybrid, capable de booter sur un cd ou une clé usb. Si vous souhaitez ne permettre que le boot usb de vos images il faut modifier la directive binary-images
:
--binary-images hdd
Créer un stockage persistant sur une clé usb
Le début de la procédure est le même que pour le reste : créez votre image, en ajoutant l'option persistence a la directive --bootappend-live :
lb config --distribution jessie --binary-images hdd --architectures amd64 --linux-flavours amd64 \ --archive-areas "main contrib non-free" --apt-indices false \ --memtest memtest86+ --updates true --backports true \ --mirror-bootstrap http://deb.debian.org/debian/ --mirror-binary http://deb.debian.org/debian/ \ --bootappend-live "boot=live persistence components locales=en_US.UTF-8 keyboard-layouts=fr hostname=rescue \ username=user noprompt noeject autologin"
Continuez la création de l'image comme avant, puis écrivez la sur une clé usb de taille suffisante :
dd if=votre_image.iso of=/dev/your_usb_device
Il faut ensuite créer une nouvelle partition avec parted, fdisk, cfdisk, comme vous voulez, sur la clé usb
Une fois la partition créée, il faut y écrire un système de fichier ext4 qui aura comme label "persistence" (obligatoire, sinon ça ne marchera pas). Si votre partition est sdb2, on arrive a ça :
mkfs.ext4 -L persistence /dev/sdb2 mount -t ext4 /dev/sdb2 /mnt echo "/home" >> /mnt/persistence.conf umount /mnt
Vous ainsi un dossier /home persistant qui survivra aux reboots sur la clé usb. Si vous souhaitez conserver plus de fichiers, comme par exemple des programmes installés par la suite, le fichier persistence.conf ressemblera à ça :
/usr union /home /var/cache/apt
Si on vous tout simplement garder la totalité des donnée sur le stockage persistant :
/ union
Modifier une iso déjà préparée
aptitude install genisoimage squashfs-tools
mount /var/lib/vz/templates/iso/rescue_amd64.iso /mnt/01 -o loop cp -a 01/* 02/
mount /mnt/01/live/filesystem.squashfs /mnt/03/ -o loop cp -a 03/* 04/
04 : a modifier pour debian 02 : a modifier pour le cd
Pour modifier les fichiers debian, le mieux est de
chroot /mnt/04
Vous pouvez par exemple rajouter des paquets que vous auriez oublié (dnsutils, ntfsprogs, dosfstools ...), en reconfigurer certains (locales, console-data)
Une fois 04 modifié :
cd /mnt rm 04/root/.*_history mksquashfs 04/ blah.squashfs mv blah.squashfs 02/live/filesystem.squashfs chmod 444 02/live/filesystem.squashfs sha256sum
Vous pouvez ensuite modifier 02 : par exemple, ajouter dans 02/isolinux/isolinux.cfg : timeout 1
genisoimage -J -r -v -o test.iso -V rescue \ -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table 02/