« Squashfs » : différence entre les versions

De Wiki doc

(Correction de la mise en gras d'un titre + mise en option des arguments affectés au démontages des systèmes de fichiers avant la création d'une image + correction de la phrase comprise dans le modèle attention relatif à la commande "mksquashfs".)
(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)
 
Ligne 1 : Ligne 1 :
[[Category:pxe]]
[[Category:pxe]]
[[Category:Systèmes de fichiers]]
[[Category:Systèmes de fichiers]]
[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 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.
[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 boot USB (préparation avec la commande ''cp'')
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=
Ligne 20 : Ligne 22 :
'''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>
Les actions de cette section sont à effectuer dans le système que l'on vient d'installer via la commande <source lang="bash" inline>debootstrap</source>


'''Changement temporaire de l'apparence du prompt'''
'''Changement temporaire de l'apparence du prompt'''
  export PS1="\e[01;31m(live):\W \$ \e[00m"
  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 <source lang="bash" inline>apt</source>'''
''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 <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 <source lang="bash" inline>sudo</source> (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.''
 
''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'''
'''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-8''' sur l'écran suivant.''
''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
''Pour <source lang="bash" inline>keyboard-configuration</source>, sélectionnez '''Français - Français (variante obsolète)'''.''


Le contenu de <source lang="bash" inline>/etc/default/keyboard</source> doit être le suivant:
''Pour <syntaxhighlight lang="bash" inline>keyboard-configuration</syntaxhighlight>, sélectionnez '''Français - Français (variante obsolète)'''.''
<source lang="bash">
 
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 80 : Ligne 105 :


BACKSPACE="guess"
BACKSPACE="guess"
</source>
</syntaxhighlight>
Le contenu de <source lang="bash" inline>/etc/default/console-setup</source> doit être le suivant:
 
<source lang="bash">
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 99 : 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'
</source>
</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 <source lang="bash" inline>/root/.Xauthority</source> de l'hôte dans <source lang="bash" inline>/home/<UTILISATEUR>/.Xauthority</source> du ''chroot'' et lui donner les droits de cet utilisateur
# 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 <source lang="bash" inline>su - <UTLISATEUR></source> (on peut vérifier que le ''magic cookie'' est pris en compte grâce à la commande <source lang="bash" inline>xauth list</source>)
# 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.''


Ligne 119 : Ligne 146 :
  umount /proc /sys /dev/pts
  umount /proc /sys /dev/pts


''Si les systèmes de fichiers refusent de se démonter, il est possible d'utiliser les options <source lang="bash" inline>-lf</source> pour les démonter lorsque cela sera possible.''
''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 <source lang="bash" inline>exit</source> et redémarrer la machine (car sinon l'étape de compilation va foirer et c'est juste une perte de temps).}}
{{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 134 : 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 <source lang="bash" inline>/</source> du système d'exploitation
Paramètres :
* '''chroot''': Le répertoire contenant le <syntaxhighlight lang="bash" inline>/</syntaxhighlight> du système d'exploitation
* '''binary/live/système de fichier.squashfs''': emplacement de destination de l'image
* '''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
* '''-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 <source lang="bash" inline>test -f</source> sur ce répertoire. On peut berner cette détection comme expliqué dans la ligne 12 de mon script sur [[Systemd#Cr.C3.A9ation_du_script_du_service_2|cet article]]
* '''-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 <source lang="bash" inline>mksquashfs</source> va y ajouter les nouveaux fichiers tout en conservant les anciens (ce qui y fou un bon gros bordel).}}
{{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 155 : 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 SFTP pour ce faire.
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 <source lang="bash" inline>pxelinux.cfg/default</source>'''
 
<source lang="bash">
'''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
</source>
</syntaxhighlight>
 
''À 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.
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].''
''Si le lien venait à mourir, Syslinux est téléchargeable [https://{{SERVERNAME}}/fichiers/amorçage/syslinux/syslinux-6.04-pre1.tar.gz ici].''


Ligne 196 : Ligne 227 :
  vim ~/madistrib/binary/isolinux/isolinux.cfg
  vim ~/madistrib/binary/isolinux/isolinux.cfg


<source lang="bash">
<syntaxhighlight lang="bash">
ui menu.c32
ui menu.c32
prompt 0
prompt 0
Ligne 207 : Ligne 238 :
linux /live/vmlinuz
linux /live/vmlinuz
append initrd=/live/initrd boot=live persistence quiet
append initrd=/live/initrd boot=live persistence quiet
</source>
</syntaxhighlight>
 
Paramètres intéressants à ajouter :
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
* '''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...''
* '''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
* '''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'''
Ligne 219 : Ligne 251 :
  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 <source lang="bash" inline>/dev/sdb</source>. Il est évident que vous vérifierez si c'est le cas pour vous avant de faire '''LA''' grosse connerie du jour hein...''
''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 à 18: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) :
  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