Squashfs
Squashfs est un système de fichier compressé en lecture seule et dé-dupliqué utilisé dans les LiveCD. Ils sont adaptés à l’exécution d'un système d'exploitation temporaire puisque ce dernier, couplé à Overlayfs, exploitera la RAM de la machine hôte pour permettre une écriture éphémère non destructrice (on peut tout casser, il suffit de redémarrer pour retrouver un système fonctionnel). Je l'utilise personnellement pour effectuer mes tests et réaliser les documentations de ce site sans me faire chier à installer un Debian vierge à chaque fois (imaginez un peu la galère si je faisais ça ! Le clair de mon temps serai occupés aux installations). On peut le retrouver également dans des distributions dédiés au monde de l'embarqué comme DD-WRT.
À la fin de cette documentation, nous aurons un fichier image unique (notre squashfs) ainsi qu'un noyau Linux et son Initrd. Nous pourrons alors utiliser un serveur PXE, une clé USB ou directement Qemu pour démarrer sur cette image.
Installation
Notez que l'ensemble des outils que je vous proposes n'est pas indispensable pour créer un squashfs. J'y reviens après.
apt install xorriso live-build squashfs-tools debootstrap
Fonction des outils proposés:
- xorriso: Permet de créer une image ISO adapté au boot USB (préparation avec la commande cp)
- live-build: Est une suite de scripts permettant l'automatisation de ce que nous allons faire à la main (non traité dans ce document)
- squashfs-tools: Outil de création de l'image squashfs
- debootstrap: Permet de récupérer une distribution Linux qui servira de base à notre image (une Debian Stretch dans ce document)
Préparation
Système hôte
Les actions de cette section sont à effectuées sur votre machine physique (en opposition aux étapes qui serons à effectuées dans le chroot de notre image)
Création de l'arborescence du projet
mkdir -p ~/madistrib/{chroot,binary/{live,isolinux}} && cd ~/madistrib
Installation du système de base
debootstrap --arch amd64 stretch chroot http://ftp.fr.debian.org/debian
Entrer dans le système invité
chroot chroot
Système invité
Installation
Les actions de cette section sont à effectuer dans le système que l'on vient d'installer via la commande debootstrap
"Changement temporaire de l'apparence du prompt
export PS1="\e[01;31m(live):\W \$ \e[00m"
Vous comprendrez que c'est utile quand vous avez plusieurs consoles root ouvertes avec le même prompte partout et que vous faites une commande irréversible sur la mauvaise machine...
Montage des volumes spéciaux indispensable pour lancer des commandes tel que apt
mount none -t proc /proc mount none -t sysfs /sys mount none -t devpts /dev/pts
Définition du répertoire personnel du root
export HOME=/root
Franchement je ne sais pas si ce truck sert à quelque chose vu qu'on ne trouve aucune infos compréhensibles sur le net...
apt update apt install dbus dbus-uuidgen > /var/lib/dbus/machine-id
Installation de Linux ainsi que du module de fonctionnement en LiveCD
apt install linux-image-amd64 live-boot
Ajout d'un mot de passe à root
passwd
Si vous êtes fans de sudo
(le masochisme n'est pas répressible donc faîtes-vous plaisir), ne faites pas cette étape et utilisez la configuration de sudo dont vous avez l'habitude.
Création d'un utilisateur
adduser foo
Évidemment, ne le faîte pas si vous n'en avez pas besoin.
Configurer le fuseau horaire
dpkg-reconfigure tzdata
Configurer la console en Français UTF-8
apt install locales dpkg-reconfigure locales
Cocher fr_FR.UTF-8 UTF-8 et sélectionnez fr_FR.UTF-8 sur l'écran suivant.
Configurer le clavier en azerty
apt install console-data
Sélectionner pc / azerty / French / Same as X11 (latin9) / Standard. Et comme si ça ne suffisait pas, ces étapes supplémentaires, toujours pour le clavier en français
apt install keyboard-configuration console-setup
Pour keyboard-configuration
, sélectionnez Français - Français (variante obsolète).
Le contenu de /etc/default/keyboard doit être le suivant:
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT="latin9"
XKBOPTIONS=""
BACKSPACE="guess"
Le contenu de /etc/default/console-setup
doit être le suivant:
# CONFIGURATION FILE FOR SETUPCON
# Consult the console-setup(5) manual page.
ACTIVE_CONSOLES="/dev/tty[1-6]"
CHARMAP="UTF-8"
CODESET="Lat15"
FONTFACE="Fixed"
FONTSIZE="8x16"
VIDEOMODE=
# The following is an example how to use a braille font
# FONT='lat9w-08.psf.gz brl-8x8.psf'
Vous pouvez installer les paquets et faire les modifications de votre choix à ce stade. Lorsque vous aurez terminé, passez à l'étape suivante pour nettoyer votre installation.
ASTUCE
Si on veux modifier une application graphique (installer Steam par exemple), il faut faire du X11 forwarding sur le serveur hôte et effectuer ces opérations sur le chroot (après le montage de /proc /sys /dev/pts) :- Copie du
/root/.Xauthority
de l'hôte dans/home/<UTILISATEUR>/.Xauthority
du chroot et lui donner les droits de cet utilisateur - Depuis le compte root du chroot, faire un
su - <UTLISATEUR>
(on peut vérifier que le magic cookie est pris en compte grâce à la commandexauth list
) - Exécuter l'application en tapant son nom en ligne de commande et l'affichage est renvoyé sur votre PC (le paquet xterm est nécessaire). À la fin des modifications, il suffis de supprimer le .Xauthority de chaque utilisateur pour rendre tout ça propre.
Nettoyage
Vider le cache apt et l'historique bash
apt-get clean rm -rf /tmp/* rm /var/lib/dbus/machine-id
Il faut bien comprendre que tout les fichiers du système seront montés en RAM. Il faut donc virer un maximum de merdes inutiles.
Démontage des systèmes de fichier spéciaux montés
umount -lf /proc /sys /dev/pts
Suppression de l'historique bash
history -c
INFORMATION
Bien que rare, si cette commande renvoi un message à la con du genre Ressources busy ou autre, taperexit
et redémarrer la machine (car sinon l'étape de compilation va foirer et c'est juste une perte de temps).Quitter le chroot
ctrl+d
ou
exit
Création du squashfs
Se déplacer dans notre répertoire de travail
cd ~/madistrib
Compiler l'image
mksquashfs chroot binary/live/stretch.squashfs -comp xz -e boot
Paramètres:
- chroot: Le répertoire contenant le
/
du système d'exploitation - binary/live/filesystem.squashfs: emplacement de destination de l'image
- -comp xz: définit l’algorithme de compressions. Les valeurs possibles sont gzip (défaut), lzo, xz et bientôt zstd
- -e boot: Exclut le répertoire /boot de l'image. Je vous recommande cependant de le faire avec parcimonie car certain paquets (notamment Gnome) font un
test -f
sur ce répertoire. On peut berner cette détection comme expliqué dans la ligne 12 de mon script sur cet article
ATTENTION
Je vous conseil de supprimer votre ancienne image squashfs avant d'en compiler une nouvelle pour la mettre à jour car sinonmksquashfs
il va ajouter les nouveaux fichiers tout en conservant les anciens (ce qui alourdi l'image inutilement).Usage
Démarrage PXE
INFORMATION
Dans cette section, nous partons du principe qu'un serveur PXE à base de syslinux est déjà en place conformément à notre documentation sur le sujet.Sur le serveur TFTP
Création de l'arborescence PXE
mkdir -p /srv/tftp/{images,noyaux}/stretch
Sur la machine hôte
Il va falloir transférer le noyau Linux et son Initrd sur le serveur TFTP afin de permettre l'amorçage du système par le réseau. Nous utiliserons le protocole SFTP pour ce faire.
scp ~/madistrib/chroot/boot/vmlinuz* root@votreserveur:/srv/tftp/noyaux/stretch/ scp ~/madistrib/chroot/boot/initrd* root@votreserveur:/srv/tftp/noyaux/stretch/
Copie du système
cp ~/madistrib/binary/live/stretch.squashfs root@votreserveur:/srv/tftp/images/stretch/
Création d'une entrée dans le pxelinux.cfg/default
LABEL Debian_Stretch
MENU LABEL Lancer Debian Stretch
LINUX http://votreserveur/noyaux/stretch/vmlinuz-4.13.0-custom quiet
APPEND initrd=http://votreserveur/noyaux/stretch/initrd.img-4.13.0-custom boot=live vga=792 config noswap noprompt fetch=http://votreserveur/images/stretch.squashfs ramdisk_size=6666 root=/dev/ram0 rw net.ifnames=0 showmounts toram quickreboot
À faire, détailler les options
Il ne vous reste plus qu'à démarrer votre machine sur le réseau pour exécuter votre système.
Amorçage USB
Dans cette section, nous allons voir comment mettre notre système sur une clé USB afin de démarrer dessus.
Téléchargement de syslinux
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/Testing/6.04/syslinux-6.04-pre1.tar.gz
Si le lien venait à mourir, Syslinux est téléchargeable ici.
Extraction de l'archive
tar xf syslinux-6.04-pre1.tar.gz
Copie des fichiers qui font que ça fonctionne
cp ./syslinux/bios/core/isolinux.bin ~/madistrib/binary/isolinux/ cp ./syslinux/bios/com32/menu/menu.c32 ~/madistrib/binary/isolinux/ cp ./syslinux/bios/com32/hdt/hdt.c32 ~/madistrib/binary/isolinux/ cp ./syslinux/bios/com32/elflink/ldlinux/ldlinux.c32 ~/madistrib/binary/isolinux/ cp ./syslinux/bios/com32/libutil/libutil.c32 ~/madistrib/binary/isolinux/
Copie du noyau et de l'initrd
cp ~/madistrib/chroot/boot/vmlinuz* ~/madistrib/binary/live/vmlinuz cp ~/madistrib/chroot/boot/initrd* ~/madistrib/binary/live/initrd
Création du menu de démarrage
ui menu.c32
prompt 0
menu title Boot Menu
timeout 30
label Debian-stretch
menu label ^Debian Stretch
menu default
linux /live/vmlinuz
append initrd=/live/initrd boot=live persistence quiet
Construction de l'ISO
xorriso -as mkisofs -r -J -joliet-long -l -cache-inodes -isohybrid-mbr /root/syslinux/bios/mbr/isohdpfx.bin -partition_offset 16 -A "Debian Stretch" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ~/debian-stretch-perso.iso ~/madistrib/binary
Copier l'ISO sur la clé USB
cp ~/debian-stretch-perso.iso /dev/sdb && sync
Bien entendu j’admets que ma clé USB se trouve dans /dev/sdb
. Il est évident que vous vérifierez si c'est le cas pour vous avant de faire LA grosse connerie du jour hein...
Exécution Qemu
Pour cette partie je vous renvoi vers la section dédié à ce sujet.