Squashfs

De Wiki doc

Révision datée du 17 août 2022 à 17:16 par Ycharbi (discussion | contributions) (Remplacement des balises sources obsolètes par syntaxhighlight + correction d'un lien cassé + aération du code + ajout d'une astuce permettant la non interactivité de DPKG avec le paquet "locales" + mise en italiques de certains mots non français)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)


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 GNU/Linux 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 démarrage 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 seront à 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 lorsque 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.

ASTUCE

Il est également possible de le faire de façon non interactive comme suit :
sed -i -e 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' -e 's/# en_GB.UTF-8 UTF-8/en_GB.UTF-8 UTF-8/' /etc/locale.gen
locale-gen --purge "fr_FR.UTF-8"
dpkg-reconfigure -f noninteractive locales

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) :
  1.  Copie du /root/.Xauthority de l'hôte dans /home/<UTILISATEUR>/.Xauthority du chroot et lui donner les droits de cet utilisateur
  2. 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 commande xauth list)
  3. 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 /proc /sys /dev/pts

Si les systèmes de fichiers refusent de se démonter, il est possible d'utiliser les options -lf pour les démonter lorsque cela sera possible.

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, taper exit 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/système de fichier.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 sinon mksquashfs va y ajouter les nouveaux fichiers tout en conservant les anciens (ce qui y fou un bon gros bordel).

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 SCP 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

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

vim ~/madistrib/binary/isolinux/isolinux.cfg
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

Paramètres intéressants à ajouter :

  • toram : Copie l'intégralité du système en RAM, permettant de retirer le support amovible de démarrage
  • net.ifnames=0 : Désactive les Predictable Network Interface Names pour remettre les noms des interfaces réseaux en eth0, wlan0...
  • console=ttyS0,115200n8 console=tty0 : Permet d'avoir un TTY sur un port console en plus de la sortie vidéo

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 ~/madistrib/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.

Sources