« Squashfs » : différence entre les versions
(Ajout de sources) |
(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) |
||
(4 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Category:pxe]] | [[Category:pxe]] | ||
[[Category:Systèmes de fichiers]] | [[Category:Systèmes de fichiers]] | ||
À 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#D.C3.A9marrage_sur_squashfs|Qemu]] pour démarrer sur cette image. | [https://fr.wikipedia.org/wiki/SquashFS Squashfs] est un système de fichier compressé en lecture seule et dé-dupliqué utilisé dans les [https://fr.wikipedia.org/wiki/Live_CD LiveCD]. Ils sont adaptés à l’exécution d'un système d'exploitation temporaire puisque ce dernier, couplé à [https://fr.wikipedia.org/wiki/OverlayFS 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 [https://fr.wikipedia.org/wiki/DD-WRT 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#D.C3.A9marrage_sur_squashfs|Qemu]] pour démarrer sur cette image. | |||
=Installation= | =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. | 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 | apt install xorriso live-build squashfs-tools debootstrap | ||
Fonction des outils proposés: | |||
* '''xorriso''': Permet de créer une image ISO adapté au | Fonction des outils proposés : | ||
* '''xorriso''': Permet de créer une image ''ISO'' adapté au démarrage ''USB'' (préparation avec la commande <syntaxhighlight lang="bash" inline>cp</syntaxhighlight>) | |||
* '''live-build''': Est une suite de scripts permettant l'automatisation de ce que nous allons faire à la main (non traité dans ce document) | * '''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 | * '''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) | * '''debootstrap''': Permet de récupérer une distribution ''Linux'' qui servira de base à notre image (une ''Debian Stretch'' dans ce document) | ||
=Préparation= | =Préparation= | ||
==Système hôte== | ==Système hôte== | ||
Les actions de cette section sont à effectuées sur votre machine physique (en opposition aux étapes qui | 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''' | '''Création de l'arborescence du projet''' | ||
mkdir -p ~/madistrib/{chroot,binary/{live,isolinux}} && cd ~/madistrib | mkdir -p ~/madistrib/{chroot,binary/{live,isolinux}} && cd ~/madistrib | ||
'''Installation du système de base''' | '''Installation du système de base''' | ||
debootstrap --arch amd64 stretch chroot http://ftp.fr.debian.org/debian | debootstrap --arch amd64 stretch chroot http://ftp.fr.debian.org/debian | ||
'''Entrer dans le système invité''' | '''Entrer dans le système invité''' | ||
chroot chroot | chroot chroot | ||
Ligne 27 : | Ligne 31 : | ||
==Système invité== | ==Système invité== | ||
===Installation=== | ===Installation=== | ||
Les actions de cette section sont à effectuer dans le système que l'on vient d'installer via la commande <syntaxhighlight lang="bash" inline>debootstrap</syntaxhighlight> | |||
'''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...'' | |||
''Vous comprendrez que c'est utile | |||
'''Montage des volumes spéciaux indispensable pour lancer des commandes tel que < | '''Montage des volumes spéciaux indispensable pour lancer des commandes tel que <syntaxhighlight lang="bash" inline>apt</syntaxhighlight>''' | ||
mount none -t proc /proc | mount none -t proc /proc | ||
mount none -t sysfs /sys | mount none -t sysfs /sys | ||
mount none -t devpts /dev/pts | mount none -t devpts /dev/pts | ||
'''Définition du répertoire personnel du root''' | '''Définition du répertoire personnel du root''' | ||
export HOME=/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...''' | '''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 update | ||
apt install dbus | apt install dbus | ||
dbus-uuidgen > /var/lib/dbus/machine-id | dbus-uuidgen > /var/lib/dbus/machine-id | ||
'''Installation de Linux ainsi que du module de fonctionnement en LiveCD''' | '''Installation de Linux ainsi que du module de fonctionnement en LiveCD''' | ||
apt install linux-image-amd64 live-boot | apt install linux-image-amd64 live-boot | ||
'''Ajout d'un mot de passe à root''' | '''Ajout d'un mot de passe à root''' | ||
passwd | passwd | ||
''Si vous êtes fans de < | |||
''Création d'un utilisateur'' | ''Si vous êtes fans de <syntaxhighlight lang="bash" inline>sudo</syntaxhighlight> (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 | adduser foo | ||
''Évidemment, ne le faîte pas si vous n'en avez pas besoin.'' | ''Évidemment, ne le faîte pas si vous n'en avez pas besoin.'' | ||
'''Configurer le fuseau horaire''' | '''Configurer le fuseau horaire''' | ||
dpkg-reconfigure tzdata | dpkg-reconfigure tzdata | ||
'''Configurer la console en Français UTF-8''' | '''Configurer la console en Français UTF-8''' | ||
apt install locales | apt install locales | ||
dpkg-reconfigure locales | dpkg-reconfigure locales | ||
''Cocher '''fr_FR.UTF-8 UTF-8''' et sélectionnez '''fr_FR.UTF''' | |||
''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 : | |||
<syntaxhighlight lang="bash"> | |||
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 | |||
</syntaxhighlight> | |||
}} | |||
'''Configurer le clavier en azerty''' | '''Configurer le clavier en azerty''' | ||
apt install console-data | apt install console-data | ||
''Sélectionner '''pc / azerty / French / Same as X11 (latin9) / Standard'''.'' | ''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''' | '''Et comme si ça ne suffisait pas, ces étapes supplémentaires, toujours pour le clavier en français''' | ||
apt install keyboard-configuration console-setup | apt install keyboard-configuration console-setup | ||
Le contenu de /etc/default/keyboard doit être le suivant: | ''Pour <syntaxhighlight lang="bash" inline>keyboard-configuration</syntaxhighlight>, sélectionnez '''Français - Français (variante obsolète)'''.'' | ||
< | |||
Le contenu de <syntaxhighlight lang="bash" inline>/etc/default/keyboard</syntaxhighlight> doit être le suivant : | |||
<syntaxhighlight lang="bash"> | |||
# KEYBOARD CONFIGURATION FILE | # KEYBOARD CONFIGURATION FILE | ||
Ligne 79 : | Ligne 105 : | ||
BACKSPACE="guess" | BACKSPACE="guess" | ||
</ | </syntaxhighlight> | ||
Le contenu de < | |||
< | Le contenu de <syntaxhighlight lang="bash" inline>/etc/default/console-setup</syntaxhighlight> doit être le suivant : | ||
<syntaxhighlight lang="bash"> | |||
# CONFIGURATION FILE FOR SETUPCON | # CONFIGURATION FILE FOR SETUPCON | ||
Ligne 98 : | Ligne 126 : | ||
# The following is an example how to use a braille font | # The following is an example how to use a braille font | ||
# FONT='lat9w-08.psf.gz brl-8x8.psf' | # FONT='lat9w-08.psf.gz brl-8x8.psf' | ||
</ | </syntaxhighlight> | ||
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. | 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'') : | {{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 < | # Copie du <syntaxhighlight lang="bash" inline>/root/.Xauthority</syntaxhighlight> de l'hôte dans <syntaxhighlight lang="bash" inline>/home/<UTILISATEUR>/.Xauthority</syntaxhighlight> du ''chroot'' et lui donner les droits de cet utilisateur | ||
# Depuis le compte root du ''chroot'', faire un < | # Depuis le compte ''root'' du ''chroot'', faire un <syntaxhighlight lang="bash" inline>su - <UTLISATEUR></syntaxhighlight> (on peut vérifier que le ''magic cookie'' est pris en compte grâce à la commande <syntaxhighlight lang="bash" inline>xauth list</syntaxhighlight>) | ||
# 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.}} | # 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=== | ===Nettoyage=== | ||
'''Vider le cache ''apt'' et l'historique ''bash''''' | '''Vider le cache ''apt'' et l'historique ''bash''''' | ||
apt-get clean | apt-get clean | ||
rm -rf /tmp/* | rm -rf /tmp/* | ||
rm /var/lib/dbus/machine-id | 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.'' | ''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''' | '''Démontage des systèmes de fichier spéciaux montés''' | ||
umount | umount /proc /sys /dev/pts | ||
''Si les systèmes de fichiers refusent de se démonter, il est possible d'utiliser les options <syntaxhighlight lang="bash" inline>-lf</syntaxhighlight> pour les démonter lorsque cela sera possible.'' | |||
'''Suppression de l'historique ''bash''''' | '''Suppression de l'historique ''bash''''' | ||
history -c | history -c | ||
{{Info|Bien que rare, si cette commande renvoi un message à la con du genre ''Ressources busy'' ou autre, taper < | {{Info|Bien que rare, si cette commande renvoi un message à la con du genre ''Ressources busy'' ou autre, taper <syntaxhighlight lang="bash" inline>exit</syntaxhighlight> et redémarrer la machine (car sinon l'étape de compilation va foirer et c'est juste une perte de temps).}} | ||
'''Quitter le chroot''' | '''Quitter le chroot''' | ||
Ligne 130 : | Ligne 161 : | ||
Se déplacer dans notre répertoire de travail | Se déplacer dans notre répertoire de travail | ||
cd ~/madistrib | cd ~/madistrib | ||
Compiler l'image | Compiler l'image | ||
mksquashfs chroot binary/live/stretch.squashfs -comp xz -e boot | mksquashfs chroot binary/live/stretch.squashfs -comp xz -e boot | ||
Paramètres: | |||
* '''chroot''': Le répertoire contenant le < | Paramètres : | ||
* '''binary/live/ | * '''chroot''': Le répertoire contenant le <syntaxhighlight lang="bash" inline>/</syntaxhighlight> du système d'exploitation | ||
* '''-comp xz''': définit l’algorithme de compressions. Les valeurs possibles sont gzip (défaut), lzo, xz et bientôt zstd | * '''binary/live/système de fichier.squashfs''': emplacement de destination de l'image | ||
* '''-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 < | * '''-comp xz''': définit l’algorithme de compressions. Les valeurs possibles sont ''gzip'' (défaut), ''lzo'', ''xz'' et bientôt ''zstd'' | ||
{{Attention|Je vous conseil de supprimer votre ancienne image squashfs avant d'en compiler une nouvelle pour la mettre à jour car sinon < | * '''-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 <syntaxhighlight lang="bash" inline>test -f</syntaxhighlight> sur ce répertoire. On peut berner cette détection comme expliqué dans la ligne 12 de mon script sur [[Astuces_-_systemd#Cr.C3.A9ation_du_script_du_service_2|cet article]] | ||
{{Attention|Je vous conseil de supprimer votre ancienne image ''squashfs'' avant d'en compiler une nouvelle pour la mettre à jour car sinon <syntaxhighlight lang="bash" inline>mksquashfs</syntaxhighlight> va y ajouter les nouveaux fichiers tout en conservant les anciens (ce qui y fou un bon gros bordel).}} | |||
=Usage= | =Usage= | ||
==Démarrage PXE== | ==Démarrage PXE== | ||
{{Info|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.}} | {{Info|Dans cette section, nous partons du principe qu'un serveur ''PXE'' à base de ''syslinux'' est déjà en place conformément à notre [[Serveur PXE UEFI|documentation]] sur le sujet.}} | ||
===Sur le serveur TFTP=== | ===Sur le serveur TFTP=== | ||
Ligne 150 : | Ligne 184 : | ||
===Sur la machine hôte=== | ===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 | Il va falloir transférer le noyau ''Linux'' et son ''Initrd'' sur le [[Tftp|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/vmlinuz* root@votreserveur:/srv/tftp/noyaux/stretch/ | ||
scp ~/madistrib/chroot/boot/initrd* root@votreserveur:/srv/tftp/noyaux/stretch/ | scp ~/madistrib/chroot/boot/initrd* root@votreserveur:/srv/tftp/noyaux/stretch/ | ||
'''Copie du système''' | '''Copie du système''' | ||
cp ~/madistrib/binary/live/stretch.squashfs root@votreserveur:/srv/tftp/images/stretch/ | cp ~/madistrib/binary/live/stretch.squashfs root@votreserveur:/srv/tftp/images/stretch/ | ||
'''Création d'une entrée dans le < | |||
< | '''Création d'une entrée dans le <syntaxhighlight lang="bash" inline>pxelinux.cfg/default</syntaxhighlight>''' | ||
<syntaxhighlight lang="bash"> | |||
LABEL Debian_Stretch | LABEL Debian_Stretch | ||
MENU LABEL Lancer Debian Stretch | MENU LABEL Lancer Debian Stretch | ||
LINUX http://votreserveur/noyaux/stretch/vmlinuz-4.13.0-custom quiet | 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 | 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 | ||
</ | </syntaxhighlight> | ||
Il ne vous reste plus qu'à démarrer votre machine sur le réseau pour exécuter votre système. | Il ne vous reste plus qu'à démarrer votre machine sur le réseau pour exécuter votre système. | ||
==Amorçage USB== | ==Amorçage USB== | ||
Dans cette section, nous allons voir comment mettre notre système sur une clé USB afin de démarrer dessus. | 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''' | '''Téléchargement de syslinux''' | ||
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/Testing/6.04/syslinux-6.04-pre1.tar.gz | 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 [https://{{SERVERNAME}}/fichiers/amorçage/syslinux/syslinux-6.04-pre1.tar.gz ici].'' | |||
'''Extraction de l'archive''' | '''Extraction de l'archive''' | ||
tar xf syslinux-6.04-pre1.tar.gz | tar xf syslinux-6.04-pre1.tar.gz | ||
'''Copie des fichiers qui font que ça fonctionne''' | '''Copie des fichiers qui font que ça fonctionne''' | ||
cp ./syslinux/bios/core/isolinux.bin ~/madistrib/binary/isolinux/ | cp ./syslinux/bios/core/isolinux.bin ~/madistrib/binary/isolinux/ | ||
Ligne 180 : | Ligne 219 : | ||
cp ./syslinux/bios/com32/elflink/ldlinux/ldlinux.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/ | cp ./syslinux/bios/com32/libutil/libutil.c32 ~/madistrib/binary/isolinux/ | ||
'''Copie du noyau et de l'initrd''' | '''Copie du noyau et de l'initrd''' | ||
cp ~/madistrib/chroot/boot/vmlinuz* ~/madistrib/binary/live/vmlinuz | cp ~/madistrib/chroot/boot/vmlinuz* ~/madistrib/binary/live/vmlinuz | ||
cp ~/madistrib/chroot/boot/initrd* ~/madistrib/binary/live/initrd | cp ~/madistrib/chroot/boot/initrd* ~/madistrib/binary/live/initrd | ||
'''Création du menu de démarrage''' | '''Création du menu de démarrage''' | ||
< | vim ~/madistrib/binary/isolinux/isolinux.cfg | ||
<syntaxhighlight lang="bash"> | |||
ui menu.c32 | ui menu.c32 | ||
prompt 0 | prompt 0 | ||
Ligne 195 : | Ligne 238 : | ||
linux /live/vmlinuz | linux /live/vmlinuz | ||
append initrd=/live/initrd boot=live persistence quiet | append initrd=/live/initrd boot=live persistence quiet | ||
</ | </syntaxhighlight> | ||
Paramètres intéressants à ajouter : | |||
* '''toram :''' Copie l'intégralité du système en [https://fr.wikipedia.org/wiki/Ubuntu_casper#Interventions_possibles_au_moment_du_d%C3%A9marrage RAM], permettant de retirer le support amovible de démarrage | |||
* '''net.ifnames=0 :''' Désactive les ''[[Paramètres_linux#Nom_des_interfaces_r.C3.A9seaux|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''' | '''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 | 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''' | '''Copier l'ISO sur la clé USB''' | ||
cp ~/debian-stretch-perso.iso /dev/sdb && sync | cp ~/debian-stretch-perso.iso /dev/sdb && sync | ||
''Bien entendu j’admets que ma clé USB se trouve dans < | |||
''Bien entendu j’admets que ma clé USB se trouve dans <syntaxhighlight lang="bash" inline>/dev/sdb</syntaxhighlight>. 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== | ==Exécution Qemu== |
Dernière version du 17 août 2022 à 17:16
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) :- 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 /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, 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/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 sinonmksquashfs
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.