Création d’un système Gnu/Linux live personnalisé

Publié par cpb
Sep 02 2011

Je vais être amené à présenter très prochainement une session de formation professionnelle sur Linux temps-réel et embarqué dans une entreprise où l’administrateur système ne veut pas installer Gnu/Linux sur les postes de formation ! N’ayant pas les compétences pour installer une partition Linux, il ne tolère que le boot sur systèmes live (CD ou Clé USB).

Il existe de nombreuses distributions qui proposent des systèmes live préconfigurés et opérationnels, toutefois plusieurs problèmes se posent dans ce cas particulier

  • J’ai besoin de la toolchain Gnu complète (gcc, gdb, gprof, gcov, g++, etc.) rarement présente sur les systèmes live.
  • Une partie importante de ma présentation est orientée sur l’environnement Eclipse, qui est absent des systèmes préconfigurés.
  • Je fournis aux participants de nombreux exemples et fichiers de configuration qui doivent être rajoutés dans les répertoires de travail. Habituellement je fournis ces éléments sur CD-Rom, mais si nous démarrons sur un CD live, le lecteur sera déjà occupé !
  • En outre, nous devons télécharger et compiler de nombreux packages (Buildroot, Busybox, le kernel Linux lui-même, Xenomai, Dropbear, etc.) L’utilisation du réseau et l’accès Internet depuis les salles de formation étant souvent problématique – d’autant plus depuis un système live – je voudrais pré-télécharger les archives.

Au vu de ces points, il apparaît qu’il faut pouvoir construire un système Linux live personnalisé. A nouveau, il existe plusieurs projets – plus ou moins aboutis – qui permettent d’ajuster le système live. Après plusieurs expérimentations, j’ai choisi d’utiliser le projet “Debian Live Build” et son utilitaire lb (Live Build) pour lequel il existe de très bonnes documentations sur le web, et je récapitulerai simplement ici les opérations nécessaires dans mon cas, dans l’espoir que cela puisse être utile à d’autres.

Principe

Le principe est relativement simple. Je pars d’une distribution Debian ou Ubuntu fraichement installée avec les options par défaut.

Je ne fais preuve d’aucun sectarisme entre les principales distributions Linux, j’utilise régulièrement des Debian, Fedora, Ubuntu, Centos, RHEL et autres Gentoo. J’ai peut-être une meilleure connaissance des Fedora, mais j’apprécie les avantages de chacune des autres. Pour le propos de cet article, le système Live Build de Debian est supérieur aux autres environnements du même genre.

Certaines opérations nécessitent obligatoirement les privilèges root, d’autres peuvent sûrement être effectuées avec les droits d’un utilisateur normal, mais j’ai réalisé l’ensemble des manipulations avec un shell root (en utilisant sudo -i).

[~]# apt-get install -y live-build

On crée un répertoire de travail (livekey dans mon cas) puis on y exécute la configuration de Live Build :

[~] # mkdir livekey 
[~] # cd livekey 
[livekey]# lb config options...

Les options serons détaillées plus bas et :

[livekey]# lb build

En sortie, nous obtenons une image prête à être gravée sur CD/DVD ou transférée sur une clé USB.

La complexité va venir des options à passer à lb config pour ajuster le système live et préinstaller les fichiers que l’on veut fournir aux futurs utilisateurs.

Script de création

Dès que je dois répéter à plusieurs reprises les mêmes opérations – pour ajuster mon système en l’occurrence – je les regroupe toujours dans un script shell. C’est ce que je ferai ici.

La première version (script-livekey-1.sh) est très simple

#! /bin/sh
rm -rf config/
lb clean

lb config 
   --distribution   "squeeze"           
   --archive-areas  "main contrib"      
   --packages-lists "gnome-desktop"     
   --packages "gcc gdb gedit g++ make"  
   --clean                              
   --memtest none                       
   --syslinux-timeout 20                
   --interactive true                   

lb build

Les répertoires config, cache et chroot sont créés pendant la phase lb build. J’efface systématiquement le répertoire config au démarrage du script pour éviter les incohérences entre plusieurs exécutions successives. De même la commande lb clean sert-elle à “faire le ménage” dans les fichiers générés précédemment.

Voici la signification des options ajoutées à “lb config

  • --distribution squeeze : il s’agit de la distribution Debian stable actuelle, ce que l’on peut naturellement modifier au besoin ;
  • --archive-areas "main contrib" : les sources de paquets, en fonction de leur licences,
  • --packages-lists "gnome-desktop" : il s’agit d’une liste préconfigurée de packages permettant de configurer une station graphique avec environnement Gnome. Il est évidemment possible de préférer kde-desktop ou xfce-desktop.
  • --packages "..." : la liste des packages supplémentaires que je souhaite installer. Nous en reparlerons plus bas, j’ai simplement indiqué ici les éléments essentiels de la toolchain Gnu.
  • --clean : effacer les sous-répertoires inutiles dans config/ et chroot/,
  • --memtest none : ne pas proposer d’option de vérification de la mémoire dans le menu de démarrage de Grub ;
  • --syslinux-timeout 20 : Démarrer sur l’image par défaut après 20 secondes d’affichage du menu Grub ;
  • --interactive true : pour la mise au point, ceci nous permet d’accéder temporairement au futur environnement live (par le biais d’un chroot) pour vérifier son bon état. Cette option est supprimée après la mise au point.

 

 

Lançons notre script :

[livekey]# chmod 755 script-livekey-1.sh 
[livekey]# ./script-livekey-1.sh 
P: Cleaning chroot
P: Considering defaults defined in /etc/live/build.conf
P: Creating config tree
P: Setting up cleanup function
P: Begin caching bootstrap stage...
P: Begin bootstrapping system...
P: If the following stage fails, the most likely cause of the problem is with your mirror configuration or a caching proxy.
P: Running debootstrap (download-only)...
I: Retrieving Release
[...]

Après quelques (dizaines de) minutes de téléchargement et préparation des packages, la construction s’interrompt avec un shell chrooté (c’est-à-dire qui s’exécute dans une sous-arborescence du système de fichiers de l’hôte). Nous pouvons alors avoir une idée des commandes disponibles sur le futur système live. Par exemple, je vais vérifier le fonctionnement de GCC.

update-initramfs: Generating /boot/initrd.img-2.6.32-5-686
update-initramfs: Generating /boot/initrd.img-2.6.32-5-486
P: Begin interactive build...
P: Pausing build: starting interactive shell...
(live)root@SRVR:/# gcc --version
gcc (Debian 4.4.5-8) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
(live)root@SRVR:/#

C’est le moment adéquat pour vérifier s’il manque des commandes pour le futur système, et modifier en conséquence le script de construction. En ce qui me concerne, j’ai modifié la ligne packages du script (script-livekey-2.sh) ainsi :

    --packages "bison eclipse exuberant-ctags flex gcc gdb gedit gettext g++ qemu libncurses5-dev make minicom vim"  

Nous pouvons quitter ce shell “chrooté” pour continuer la construction de l’image.

(live)root@SRVR:/# exit
logout
P: Deconfiguring file /etc/kernel-img.conf
P: Deconfiguring file /etc/apt/sources.list
[...]
Building dependency tree
Reading state information... Done
P: Deconfiguring file /etc/hostname
P: Deconfiguring file /bin/hostname
P: Deconfiguring file /etc/resolv.conf
P: Deconfiguring file /etc/hosts
P: Begin unmounting filesystems...
[livekey]# ls -l
total 1105980
drwxr-xr-x  6 root root       4096 2011-09-02 12:17 binary
-rw-r--r--  1 root root 1132462080 2011-09-02 12:18 binary-hybrid.iso
-rw-r--r--  1 root root       2162 2011-09-02 12:17 binary.list
-rw-r--r--  1 root root      31490 2011-09-02 12:17 binary.packages
drwxr-xr-x  6 root root       4096 2011-09-02 12:17 cache
drwxr-xr-x 20 root root       4096 2011-09-02 12:18 chroot
drwxr-xr-x  2 root root       4096 2011-09-02 11:14 config
-rwxr-xr-x  1 root root        396 2011-09-02 11:13 script-livekey-1.sh
[livekey]#

Une fois la construction terminée, nous obtenons un fichier image binary-hybrid.iso que l’on peut soit graver un DVD, soit transférer sur une clé USB. C’est cette dernière option que je choisis pendant la mise au point. J’insère donc une clé USB de 8Go, dont la partition /dev/sdg1 se trouve montée automatiquement. Avant d’écrire sur la clé, il faut donc démonter cette partition, puis nous effectuons un transfert direct sur le périphérique bloc représentant la clé (/dev/sdg chez moi). Attention à bien vérifier le nom du périphérique sur votre système.

[livekey]# umount /dev/sdg1
[livekey]# dd if=binary-hybrid.iso of=/dev/sdg bs=4M
270+0 enregistrements lus
270+0 enregistrements écrits
1132462080 octets (1,1 GB) copiés, 236,551 s, 4,8 MB/s
[livekey]#

On peut alors insérer la clé sur une machine de test, et démarrer dessus. Plusieurs points posent problème, que je vais aborder l’un après l’autre :

  • Par défaut la localisation est américaine avec un clavier Qwerty, je désire disposer d’une disposition Azerty du clavier.
  • Il faut que je place quelque part sur mon système live les archives pré-téléchargées des packages à compiler durant la session de formation.
  • L’environnement Eclipse fonctionne, mais il n’y a pas le plug-in CDT (C/C++ Development Tool) pour la programmation en C. Le package eclipse-cdt qui implémente ce plug-in n’existe pas dans la version Debian Squeeze mais seulement dans Sid.
  • Les modifications apportées par l’utilisateur à son environnement ou aux fichiers de son répertoire personnel ne perdurent pas d’une exécution à l’autre.

 

Localisation et clavier

Pour gérer la localisation et la configuration du clavier, il suffit d’indiquer les valeurs voulues sur la ligne de commande du kernel, avec les options locales et keyboard-layouts.

Ceci s’obtient facilement en ajoutant la ligne suivante dans les arguments de lb config :

   --bootappend-live "locales=fr_FR.UTF-8 keyboard-layouts=fr"  

Après construction et redémarrage, l’interface utilisateur de Gnome est bien en français et le clavier est configuré en disposition Azerty.

Fichiers supplémentaires dans le système

Je souhaite ajouter quelques archives pré-téléchargées dans le répertoire /usr/local/src du système live. Pour cela il faut les copier dans le répertoire :

~/livekey/config/chroot_local-includes/usr/local/src/

Ceci sera réalisé dans la première partie de mon script, avant la commande lb config.

Packages Debian supplémentaires

Pour ajouter un package ne se trouvant dans la distribution Squeeze, il faut le télécharger au préalable et le placer dans le répertoire

~/livekey/config/chroot_local-packages/

C’est ce que j’ai fait avec le package eclipse-cdt_6.0.2-1_i386.deb téléchargé depuis le dépot Sid.

Après reconstruction et démarrage, l’environnement Eclipse de mon système live est bien doté du plug-in CDT.

Persistance des données utilisateur

Pour que la configuration et les données de l’utilisateur soient conservées d’une session à l’autre, il faut les sauvegarder sur la clé USB que nous avons utilisé pour démarrer. Plusieurs solutions s’offrent à nous, mais je trouve que la plus simple est de disposer d’une partition dédiée sur la même clé, qui sera montée en guise de répertoire /home. L’avantage est que cette méthode est prévue d’avance et bien intégrée dans Live Build.

Le principe consiste à créer une seconde partition derrière la première, qui sera formattée avec un nom de volume home-rw. D’autre part, l’argument persistant sera ajouté sur la ligne de commande du noyau. Lors du démarrage, la partition sera identifiée par son nom, et montée automatiquement dans le répertoire /home.

Nous modifions donc la ligne boot-append-live de lb config pour ajouter le mot-clé persistent ainsi :

   --bootappend-live "locales=fr_FR.UTF-8 keyboard-layouts=fr persistent" 

Un problème se pose toutefois : les images ISO hybrides (susceptibles d’être gravées sur CD/DVD ou transférées sur clé USB) ne contiennent pas de table de partition valide (elle sont indiquées comme récursives). Aussi n’est-il pas possible de rajouter correctement de seconde partition. Pour que notre méthode fonctionne, il faut modifier le format de l’image, qui ne sera plus ISO (donc pas gravable sur DVD) mais compatible avec une image de disque dur (USB-HDD). On ajoute encore une ligne d’option à lb config :

   --binary-images "usb-hdd"      

Au final, mon script (script-livekey-3.sh) devient :

#! /bin/sh

rm -rf config

# Copier les archives pre-telechargees
mkdir -p config/chroot_local-includes/usr/local/src/
cp  linux-3.0.tar.bz2  config/chroot_local-includes/usr/local/src/
# ...

# Copier les packages supplementaires
mkdir -p config/chroot_local-packages/
cp   eclipse-cdt_6.0.2-1_i386.deb   config/chroot_local-packages/
# ...

lb clean

lb config  
   --binary-images "usb-hdd"            
   --distribution "squeeze"             
   --archive-areas "main contrib"       
   --bootappend-live "locales=fr_FR.UTF-8 keyboard-layouts=fr persistent" 
   --packages-lists "gnome-desktop"       
   --packages "bison eclipse exuberant-ctags flex gcc gdb gedit gettext g++ qemu libncurses5-dev make minicom vim"    
   --clean                              
   --memtest "none"                     
   --syslinux-timeout 20                
   --interactive "false"                

lb build

On notera au passage que l’option --interactive est maintenant à false, car une fois la configuration au point, il n’est plus besoin de faire de pause dans un shell chrooté.

 

Exécutons le script, à nouveau :

[livekey]# ./script-livekey-3.sh
P: Cleaning chroot
P: Considering defaults defined in /etc/live/build.conf
P: Updating config tree
P: Setting up cleanup function
P: Begin caching bootstrap stage...
P: Begin bootstrapping system...
W: skipping bootstrap
P: Begin caching bootstrap stage...
P: Begin unmounting filesystems...
P: Setting up cleanup function
P: Begin caching chroot stage...
P: Begin mounting /dev/pts...
[...]
P: Deconfiguring file /bin/hostname
P: Deconfiguring file /etc/resolv.conf
P: Deconfiguring file /etc/hosts
P: Begin unmounting filesystems...
[livekey]# ls -l 
total 1777476
drwxr-xr-x  6 root root       4096 2011-09-02 13:50 binary
-rw-r--r--  1 root root 1875902464 2011-09-02 13:53 binary.img
-rw-r--r--  1 root root       2162 2011-09-02 13:50 binary.list
-rw-r--r--  1 root root      33566 2011-09-02 13:49 binary.packages
drwxr-xr-x  6 root root       4096 2011-09-02 13:16 cache
[...]
[livekey]#

Cette fois, l’image est dans le fichier binary.img. Transférons-la sur la clé (attention à nouveau au nom du périphérique bloc !).

[livekey]# dd if=binary.img of=/dev/sdg bs=4M
447+1 enregistrements lus
447+1 enregistrements écrits
1875902464 octets (1,9 GB) copiés, 421,45 s, 4,5 MB/s

Puis ajoutons une partition à la suite. J’utilise pour cela fdisk, mais un résultat similaire serait obtenu avec parted ou gparted.

[livekey]# fdisk /dev/sdg
GNU Fdisk 1.2.4
Copyright (C) 1998 - 2006 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
[...]
Using /dev/sdg
Command (m for help): p

Disk /dev/sdg: 7 GB, 7929169920 bytes
255 heads, 63 sectors/track, 964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1   *           1         229     1839411   83  Linux
Warning: Partition 1 does not end on cylinder boundary.
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 0cyl): 230
Last cylinder or +size or +sizeMB or +sizeKB  (default 963cyl): (Entrée)
Command (m for help): p                                     

Disk /dev/sdg: 7 GB, 7929169920 bytes
255 heads, 63 sectors/track, 964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1   *           1         229     1839411   83  Linux
Warning: Partition 1 does not end on cylinder boundary.
/dev/sdg2             230         964     5895855   83  Linux
Command (m for help): w
Information: Don't forget to update /etc/fstab, if necessary.
Writing all changes to /dev/sdg.
[livekey]#

Enfin formattons notre nouvelle partition. Le système de fichier ext2 est très bien adapté pour les clés USB ; il faut penser à nommer la partition formattée home-rw.

[livekey]# mkfs.ext2 /dev/sdg2 -L home-rw
mke2fs 1.41.14 (22-Dec-2010)
Étiquette de système de fichiers=home-rw
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
[...]
Le système de fichiers sera automatiquement vérifié tous les 30 montages ou
après 180 jours, selon la première éventualité. Utiliser tune2fs -c ou -i
pour écraser la valeur.
[livekey]#

Après redémarrage, on peut modifier certains paramètres de configuration du système (fond d’écran, etc.) et d’ajouter des fichiers dans notre répertoire personnel. Ces éléments seront persistants d’une exécution à l’autre.

Conclusion

Il est facile de disposer avec Debian Live Build d’un environnement de travail ajusté et persistant sans toucher aux disques durs des systèmes sur lesquels on l’exécute. Ceci permet bien sûr de disposer d’un poste de travail mobile et autonome, mais permet également de palier les contraintes d’administration lorsqu’on intervient dans une entreprise extérieure sans apporter de matériel (session de formation, réunion improvisée, démonstration chez un client, etc.)

8 Réponses

  1. assidu dit :

    Excellent tutorial, merci beaucoup pour l’astuce qui permet de chrooter l’image pendant sa construction et d’en faire un peu plus ce que l’on veut !

  2. Heero_Yuy dit :

    Super travail.
    Dès que j’ai un moment, je teste. Ca peut effectivement toujours servir 😉

  3. Caliman dit :

    Bonjour Christrophe,
    C’est pile le tutorial que je cherchais !
    merci, il est excellent !
    salu2 😉

  4. Bruneau dit :

    Bonjour,

    J’en profite pour te remercier pour ton site qui m’a bien souvent aider et toujours intéressé.

    A la lecture de cet article il y a un truc que je ne comprend pas. Pour moi une distribution live a vocation à fonctionner sur de très nombreuses variétés de machine avec des proc et autres chips particuliers. D’où j’en conclue qu’a la différence de la même distribution installée une live lors du boot reconnaît les spécificités de la machine et adapte les prog qu’elle y installe.

    Or tu précise en début que tu pars d’une distribution fraîchement installée donc spécifique à ta machine … sachant la position de l’admin ce n’est pas sur une de ses machine donc ou je n’ai rien compris ou un préalable n’est-il pas d’avoir la même machine d’installation que d’utilisation ?

    J’espère avoir été clair.

    • cpb dit :

      Bonjour,

      Pour ce cas particulier, j’avais besoin d’un ensemble bien précis d’applications (compilateur, etc.) que je pouvais préparer à l’avance. Outre le fait que l’administrateur ne voulait pas installer une distribution Linux complète, j’ai profité de la version Debian Live car son noyau est conçu pour booter sur la plupart des PC. C’est le kernel Linux qui est compilé de la manière la plus modulaire et adaptable possible. Les applications de l’espace utilisateur et les bibliothèques sont les mêmes pour tous les types de PC.

      Donc le noyau pouvait booter sur (à peu près) n’importe quel PC, et les applications étaient identiques à celles de ma machine initiale.

      Cordialement.

  5. Bruneau dit :

    Ben ça alors, j’ignorais cette polyvalence de linux. Je vais essayer.
    Ton article en est d’autant plus intéressant 🙂

    Ça ouvre des perspectives …

    Encore merci.

  6. phil dit :

    Bonjour,
    Je voudrais mettre qqs bemols sur ce tuto ..
    ca fait qqs temps (2 a 3 semaines) que je me prend la tete avec live build (3.0~a51-1)
    et j’ai qqs doute sur ton script:
    l’option “–packages-lists” ne semble pas exister mais plutot –package-lists
    –binary-images ne prend pas “usb-hdd” comme argument mais “hdd”
    Je crois me souvenir qu’on se fait jeter avec “–syslinux-timeout” j’ai fait tellment de test que je m’en souvient plus.
    Pour ce qui est de la persistence ce n’est plus “persistent” mais “persistence” qui doit etre mis sur la ligne de boot et la partition doit s’appeler persistence !!! et plus home-rw ou live-rw.
    J’ai deja un cle usb avec grub2 et qqs iso de depannage et une xubuntu avec une partition home-rw persistente. une autre que j’ai appelle live-rw pour tester avec live build (suivant qqs forums) et j’ai cree une partition nommée “persistence” .. a ce moment la tout est monte …mais sans partition nommé “persistence” rien ne se monte !!
    Bref pas tres au point la persistence. j’ai contourné le probleme en rajoutant un script dans le repertoire “config/includes.chroot/lib/live/config/” et ca roule !!!
    D’autre part si qqun a reussi a construire une image avec le debian-installer .. je suis preneur. au moment de l’installation de l’installer il y a conflit entre grub-pc et grub-legacy ….
    Pour rajouter des depots c’est aussi le parcours du combattant !! meme pour ajouter le depot multimedia officiel (pour avidemux et autres) impossible a cause des signature … un moyen de contourner ca rajouter l’options a lb config
    –apt-options “–yes –allow-unauthenticated”
    c’est pas tres propre ….mais ca marche !!!

    Bref que du bonheur ..et chaque fois il faut recommencer a zero !!
    Je vous conseille plutot de recuperer “xubuntu-12.04-desktop-i386.iso”
    et de suivre le tutoriel “http://doc.ubuntu-fr.org/personnalise_livecd”
    je me suis ainsi fait une xubuntu live au petit ognions (1,6 Go l’image iso) avec la persistence que je met a jour regulierment tres facilement et rapidement pas obligé de recommencer a chaque fois j’ai juste qu’a copier l’iso ensuite sur ma cle usb

    En conclusion : assez demoralisant live-build !!

    Cordialement

URL de trackback pour cette page