Looking for Computer Science & Information Technology online
courses ?
Check my new web site: https://www.yesik.it !
Techniquement, il est possible d'installer un système Debian sur une clé USB, et de s'en servir comme s'il s'agissait d'un disque dur. Mais c'est sans compter qu'une mémoire flash (comme celle qui équipe les clés USB) a un nombre de cycles de lecture/écriture limité. Or, en fonctionnement normal, un système Unix sollicite beaucoup le disque. Bref, ce n'est pas l'idéal pour la durée de vie de votre clé.
Face à ce problème, quand on désire disposer d'un Linux bootable sur une clé, une approche plus viable consiste à appliquer la même technique que pour un Live CD. A savoir faire une installation capable de fonctionner en sollicitant au minimum le média contenant le système – et surtout sans requérir la possibilité d'y écrire. Une installation Live atteint ce but en utilisant un RAM disk, souvent couplé à un système de fichiers Copy on Write comme AuFS ou UnionFS, afin de simuler l'existence d'un média disponible en écriture. Le corollaire étant que, dans ce mode de fonctionnement, toutes les modifications effectuées sur un système Live sont perdues à l'arrêt de ce système. Ce qui peut aussi être vu comme un avantage, puisqu'ainsi on peut raisonnablement supposer qu'à chaque démarrage le système est propre et non compromis. Par contre, dans un contexte où la sécurité est importante, on veillera quand même à utiliser un média Write Once Read Many ou équipé d'un dispositif physique pour prévenir l'écriture sur celui-ci. Mais ce n'est pas mon contexte ici...
D'un point de vue pratique, faire une installation Live CD – ou dans notre cas Live USB – est une tâche relativement fastidieuse. Mais Debian Lenny nous facilite le travail grâce à l'outil live-helper(7), dont je vais maintenant me servir pour installer Debian Live sur une clé USB.
Sommaire
Configurer l'environnement de travail

Installation
Sous Debian vous aurez besoin des paquets live-helper et debootstrap pour ce qui suit. Si ces logiciels ne sont pas déjà sur votre machine utilisez le gestionnaire de paquets de votre distribution pour procéder à l'installation.
sh# apt-get install live-helper sh# apt-get install debootstrap
Pour commencer, nous allons tout d'abord créer notre environnement de travail. Un grand mot pour essentiellement dire un dossier dans lequel nous allons construire notre système Live. Nous utiliserons lh_config(1) pour initialiser cet environnement:
sh$ mkdir DEBIAN-LIVE-USB sh$ cd DEBIAN-LIVE-USB # Initialise l'environnement pour la création d'un live sur support USB ou disque dur sh$ lh config -b usb-hdd sh$ ls -la total 36 drwxr-xr-x 5 sylvain sylvain 4096 2010-08-13 20:40 . drwxr-xr-x 99 sylvain sylvain 20480 2010-08-13 20:31 .. drwxr-xr-x 22 sylvain sylvain 4096 2010-08-13 20:40 config drwxr-xr-x 2 sylvain sylvain 4096 2010-08-13 20:40 scripts drwxr-xr-x 2 sylvain sylvain 4096 2010-08-13 20:40 .stage
Comme vous le constatez, la commande lh_config(1) a créé un certain nombre de dossiers et fichiers. Ceux-ci seront utilisés par lh (live-helper) tout au long de son travail. Les fichiers de configuration sont modifiables directement – bien que la procédure recommandée soit de passer plutôt par lh_config(1), comme nous allons le voir dans un instant.

Note:
Vous remarquerez tout au long de cet article – et lors de votre utilisation de live-helper – que les commandes sont écrites tantôt avec un souligné (lh_config), tantôt sans (lh config).
En fait, la vraie commande s'écrit avec un souligné. Mais live-helper fournit aussi une commande générique (lh(1)) qui sert de wrapper pour invoquer les différentes sous-commandes.
Si vous examinez le script /usr/bin/lh vous verrez qu'en l'état actuel des choses, utiliser l'une ou l'autre est surtout une question de préférence...
Personnaliser la configuration
Configurer les miroirs des dépôts
Live-helper télécharge de nombreux paquets pour créer l'image Debian Live. Cela va consommer énormément de bande passante sur votre accès internet. C'est un problème si comme moi vous avez un accès bas débit. Mais même dans le cas contraire, c'est tout de même dommage de télécharger encore et toujours les mêmes paquets si vous êtes amenés à créer plusieurs Live différents. Ou tout simplement si vous vous y reprenez en plusieurs fois pour créer votre distribution idéale.
Pour limiter ce problème, par défaut, live-helper garde en cache dans le répertoire de travail une copie des paquets téléchargés. Ça n'est pas nécessairement la meilleure solution: en effet, la contrepartie est une consommation disque importante en local. D'autant plus, si vous créez plusieurs Live dans des dossiers différents: en effet le cache n'est pas mutualisé.
Dans mon cas, et comme j'ai déjà installé un cache APT sur mon réseau, une solution plus efficace est de solliciter mon proxy APT pour les téléchargements plutôt que les dépôts officiels:
sh$ lh config --mirror-bootstrap http://10.129.36.102:9999/ftp.de.debian.org/debian/ \ --mirror-chroot http://10.129.36.102:9999/ftp.de.debian.org/debian/ \ --mirror-chroot-security http://10.129.36.102:9999/security.debian.org \ --mirror-binary http://10.129.36.102:9999/ftp.de.debian.org/debian/ \ --mirror-binary-security http://10.129.36.102:9999/security.debian.org

--mirror-binary et --mirror-binary-security
Les miroirs configurés avec --mirror-binary et --mirror-binary-security sont ceux qui seront configurés dans le fichier /etc/apt/sources.list du système Live. Et en théorie ils ne devraient pas intervenir lors de la création de cette installation. Pourtant, sur mon système, si!?! C'est pourquoi je les ai configurés aussi avec l'adresse de mon cache APT...
Enfin, comme avec cette configuration la récupération des paquets sur le réseau local est relativement performante, je n'ai plus besoin de garder les paquets en cache sur ma machine:
sh$ lh config --cache-packages disabled
Configurer le clavier et la langue
Après ces modifications somme toute spécifique à ma configuration, voici quelque-chose qui devrait concerner tout utilisateur francophone: Configurer la langue par défaut du système Debian Live – sans oublier de configurer également notre bon vieux clavier AZERTY français. Ces deux opérations se font grâce à l'option --bootappend-live qui permet de spécifier les paramètres de boot qui seront utilisés lors du démarrage du Debian Live:
sh$ lh_config --bootappend-live "locale=fr_FR.UTF-8 keyb=fr"

Piège:
Vous ne pouvez pas configurer les paramètres de boot en plusieurs fois:
# ATTENTION: CECI NE FAIT PAS CE QUE VOUS VOULEZ!!! sh$ lh_config --bootappend-live "locale=fr_FR.UTF-8" sh$ lh_config --bootappend-live "keyb=fr"
En effet, chaque appel à lh_config --bootappend-live ... remplace les paramètres de boot par ceux que vous précisez. Autrement dit, lors de deux appels consécutifs, les paramètres ne sont pas concaténés: les derniers écrasent purement et simplement les premiers.
C'est aussi le comportement des autres options de la commande lh_config.
Ajouter individuellement des paquets
Il est temps maintenant de choisir quels paquets installer sur votre système Live. Plusieurs techniques sont possibles – et vous pouvez même les combiner.
Ainsi, si vous avez des paquets individuels à rajouter, vous pouvez les indiquer dans le fichier config/chroot. Cherchez les lignes suivantes, et indiquez dans LH_PACKAGES les différents paquets qui vous intéressent:
# $LH_PACKAGES: set packages to install
# (Default: empty)
LH_PACKAGES="filezilla iceweasel"

Piège:
La technique officielle consiste à utiliser lh config --packages ...:
sh$ lh config --packages "gdm iceweasel"
Mais il semblerait que dans la version dont je dispose (lh_config version 1.0.3-2), cette commande ne prenne en compte que le premier paquet de la liste spécifiée...
Par ailleurs, live-helper est livré avec un certain nombre de configurations prédéfinies. Celles-ci sont dans /usr/share/live-helper/lists/:
sh$ ls /usr/share/live-helper/lists/ devel-live gnome-junior kde-core lxde standard studio-kde gnome gnustep kde-extra minimal standard-x11 studio-xfce gnome-core junior-pkgs kde-full rescue studio xfce gnome-full kde kde-junior science studio-gnome xfce-junior
Imaginons que je souhaite utiliser mon Debian Live pour faire de l'analyse forensic. La configuration rescue contient (entre autres) les paquets nécesssaires. Si en plus, je ne veux pas me passer de mon environnement graphique Gnome, j'aurais aussi besoin de gnome-core. Pour indiquer que je veux les paquets de ces deux jeux, il faut modifier LH_PACKAGES_LISTS dans le fichier config/chroot:
# $LH_PACKAGES_LISTS: set package list to install
# (Default: rescue)
LH_PACKAGES_LISTS="rescue gnome-core"

Piège:
Ici encore, la technique officielle qui utilise la commande lh config --packages-lists ... ne permet pas d'indiquer plusieurs listes de paquets, c'est pourquoi je modifie le fichier à la main.
Construire l'image
Une fois toutes les opérations de configuration effectuées, reste à construire l'image. Deux techniques sont possibles. Tout-en-un. Ou étape par étape.
Tout-en-un
La construction de l'image Live se fait en quatre étapes. Live-helper fournit la commande lh_build(1) pour les enchaîner automatiquement. C'est donc le moyen le plus simple de procéder quand vous n'avez pas besoin d'intervenir au cours du processus (par exemple, pour changer manuellement un fichier de configuration):
sh$ sudo lh build

Remarque:
lh build monte l'image comme un périphérique loop. C'est pourquoi cette commande requiert les privilèges root.
Après quelques minutes – voire quelques heures si vous téléchargez beaucoup de paquets – vous obtenez l'image de votre installation Live:
sh$ ls -ld binary*
drwxr-xr-x 6 root root 4096 2010-08-17 14:53 binary
-rw-r--r-- 1 root root 149946368 2010-08-17 14:53 binary.img
-rw-r--r-- 1 root root 2184 2010-08-17 14:53 binary.list
-rw-r--r-- 1 root root 15952 2010-08-17 14:53 binary.packages
Étape par étape
Si lh_build(1) enchaîne automatiquement les étapes, il est aussi possible de les exécuter manuellement les unes après les autres:
# Installe un système de base avec debootstrap(8) (ou cdebootstrap(1)). sh$ sudo lh bootstrap # Installe les paquets supplémentaires dans l'environnement chroot(8). sh$ sudo lh chroot # Construit l'image disque. sh$ sudo lh binary sh$ ls -ld binary* drwxr-xr-x 6 root root 4096 2010-08-17 14:27 binary -rw-r--r-- 1 root root 149946368 2010-08-17 14:27 binary.img -rw-r--r-- 1 root root 2184 2010-08-17 14:27 binary.list -rw-r--r-- 1 root root 15952 2010-08-17 14:27 binary.packages
# Étape optionnelle: Ajoute les sources de l'image dans le dossier chroot. # Pour faire quelque chose, cette étape nécessite que LH_SOURCE soit # définie à "enabled" dans le fichier "config/source". sh$ sudo lh source
Dans la pratique, décomposer les différents étapes ne semble réellement utile que si vous souhaiter intervenir sur l'installation (située dans le dossier chroot) au cours du processus. Ce que nous allons illustrer avant la fin de cet article...
Installation sur le média
Copier l'image
Nous voici avec une image toute propre, prête à être copiée sur clé USB. La procédure est simple, car l'image binary.img est une image disque complète. La commande dd(1) va donc être parfaitement suffisante. Mais cela nécessite de savoir à quel périphérique bloc votre clé USB est associée. Après l'avoir connectée à votre ordinateur, vous devriez pouvoir obtenir cette information en consultant dmesg(1):
sh$ sudo dmesg | grep sd | tail -6 sd 1:0:0:0: [sda] 15646720 512-byte hardware sectors (8011 MB) sd 1:0:0:0: [sda] Write Protect is off sd 1:0:0:0: [sda] Mode Sense: 23 00 00 00 sd 1:0:0:0: [sda] Assuming drive cache: write through sda: sda1 sd 1:0:0:0: [sda] Attached SCSI removable disk
Comme vous le constatez, je récupère un certain nombre d'informations intéressantes. Tout d'abord, visiblement le média que je viens d'introduire correspond au périphérique bloc /dev/sda (les périphériques USB sont des périphériques série – d'où sda). Par ailleurs, la taille du média confirme que c'est ma clé: 15646720 blocs × 512 octets/bloc = 8011120640 octets. Soit 8011 Mo.
Enfin, une information importante m'est donnée:
sda: sda1
Cela signifie que cette clé contient une partition accessible via /dev/sda1. Il faut démonter toutes les partitions de la clé avant de poursuivre. Donc, dans mon cas:
sh$ mount | grep sda /dev/sda1 on /media/MA_CLE type vfat (rw,nosuid,nodev,uhelper=hal,shortname=lower,uid=1000) sh$ sudo umount /dev/sda1
Maintenant que tout est prêt, passons à la copie. Mais avant un avertissement important: le contenu de la clé va être entièrement perdu lors de l'installation de l'image disque! Ok. Pas de regrets? Alors, allons-y:
sh$ sudo dd if=binary.img of=/dev/sda
292864+0 records in
292864+0 records out
149946368 bytes (150 MB) copied, 39.8048 s, 3.8 MB/s

Remarque:
Une fois l'installation terminée, plutôt que de rebooter tout de suite, vous pouvez tester votre Live USB à l'aide de votre outil de virtualisation préféré. Par exemple, avec QEMU:
sh$ qemu -hda /dev/sda
Ajouter une partition utilisateur
Donc, nous voici avec une image Live sur une clé USB. D'un autre côté, c'est peut-être dommage de ne pouvoir rien enregistrer d'une utilisation à l'autre alors que l'on dispose tout de même d'un média disponible en écriture.
Debian Live offre plusieurs options à cet effet. Ainsi, il est en théorie possible de monter automatiquement sur /home une partition à la simple condition qu'elle soit nommée home-rw. Dans la pratique, je n'y suis pas parvenu. Et les examens des scripts impliqués montrent qu'ils sont conçus pour monter la première partition ou image disque qui porte le nom adéquat. Ce qui me laisse un doute du point de vue de la sécurité: en effet, je veux être certain de monter la partition de ma clé. Pas une partition d'un disque attaché au système et qui par hasard posséderait le nom magique...
C'est donc l'occasion de voir que l'on peut customiser une installation live. Ici, je vais ajouter un script de démarrage pour monter la seconde partition de ma clé sur le répertoire /home/user. C'est un script de démarrage à installer dans DEBIAN-LIVE-USB/chroot/etc/init.d/:
sh$ cd chroot/etc/init.d sh$ cat > local-mount-home.sh << EOF #! /bin/sh ### BEGIN INIT INFO # Provides: local-mount-home # Required-Start: checkfs # Required-Stop: # Default-Start: S # Default-Stop: # Short-Description: Mount user file system # Description: ### END INIT INFO PATH=/sbin:/bin:/usr/bin . /lib/lsb/init-functions do_start() { # # Mount the second partition of the boot device on /home/user # # !!! This assume: # The live user name is 'user' # The live user uid is 1000 # The live user gid is 1000 # The boot partition is the first on the device # The 'user' partition is the second # Get the boot partition BOOT_PART=`mount | grep /live/image | cut -d ' ' -f 1` # Get the second paritition on the same device HOME_PART=`echo ${BOOT_PART} | sed 's/1$/2/'` # mount options for fat32 mount ${HOME_PART} /home/user -o rw,gid=1000,uid=1000,noatime } do_stop () { umount /home/user } case "$1" in start|"") do_start ;; restart|reload|force-reload) stop start ;; stop) stop ;; *) echo "Usage: local-mount-home.sh [start|stop]" >&2 exit 3 ;; esac EOF
Le script est long à cause de la plomberie inhérente à tout script de démarrage. Mais en réalité son fonctionnement se résume en trois lignes pour monter la seconde partition du disque contenant l'image de boot:
# ... BOOT_PART=`mount | grep /live/image | cut -d ' ' -f 1` HOME_PART=`echo ${BOOT_PART} | sed 's/1$/2/'` mount ${HOME_PART} /home/user -o rw,gid=1000,uid=1000,noatime

Remarque:
Ce script est adapté à ma configuration. Comme indiqué dans les commentaires, un certain nombre de conditions sont pré-supposées. Il faudra donc l'adapter si vous sortez du cadre strict décrit ici.
Ce script est à lancer au démarrage après mountall:
sh$ sudo ln -s S37local-mount-home.sh ../init.d/local-mount-home.sh
Voilà: j'ai modifié le système installé par live-helper dans le dossier chroot. Reste à reconstruire l'image disque. C'est l'étape binary dans live-helper. Avant de relancer une étape, il est nécessaire de demander à lh_clean de faire le ménage:
# On revient à la racine du répertoire d'installation sh$ cd ../../.. sh$ basename `pwd` DEBIAN-LIVE-USB # On 'efface' l'étape 'binary' sh$ sudo lh clean --binary # On relance l'étape 'binary' sh$ sudo lh binary
Une fois cela fait, il faut recopier la nouvelle image sur la clé (comme précédemment):
sh$ dd if=binary.img of=/dev/sda
Et enfin, je vais créer une seconde partition sur la clé pour qu'elle puisse être montée par mon script de démarrage. Ici, vous pouvez utiliser les outils classiques fdisk(8) et mkfs(8). Pour ma part, je vais plutôt utiliser parted(8) (la version texte de gparted(8)):
# Afficher la table des partitions de la clé sh$ /sbin/parted /dev/sda print WARNING: You are not superuser. Watch out for permissions. Model: Kingston DataTraveler G2 (scsi) Disk /dev/sda: 8011MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 512B 150MB 150MB primary fat16 boot
Voici donc la table des partitions de ma clé après installation de l'image Debian Live. Une seule partition de 150Mo. Beaucoup d'espace perdu sur une cla de 8Go! Créons donc une partition supplémentaire:
# Nouvelle partition primaire sur /dev/sda qui s'étend de la fin de # la partition 1 (voir résultat de "parted /dev/sda print") # jusqu'à la fin du disque (100%). La partition va être formatée # en "fat32" sh$ sudo parted /dev/sda mkpartfs primary fat32 150MB 100%

Piège:
Ici, j'utilise FAT32 pour pouvoir continuer à utiliser mon média comme une clé USB ordinaire sur la majorité des systèmes.
Mais, si vous préférez, vous pouvez utiliser un autre système de fichier comme ext2 par exemple. Par contre évitez ext3 ou tout autre système de fichiers journalisé. En effet, un tel système de fichier cause beaucoup (trop) d'écritures pour une utilisation avec une mémoire flash comme celle d'une clé USB.
Voilà: l'image est installée, et une seconde partition est disponible sur la clé. Je vous laisse rebooter pour constater que ça marche!

Attention:
Je le répète: à chaque réinstallation de l'image sur la clé, dd va écraser l'image et la table des partitions rendant les données stockées sur clé inaccessibles! Pensez à faire un backup de votre partition utilisateur lors de la mise à jour de votre système live. D'ailleurs, l'ensemble du processus gagnerait à être automatisé par script. Ce qui devrait être relativement aisé...
Conclusion
Au final, live-helper est un outil bien pratique pour créer un système live. En effet, malgré quelques bugs ou difficultés d'utilisation, il permet de produire un système Debian Live sans obstacle majeur. Et qui plus est, un live que vous pouvez adapter à votre besoin spécifique. La seule barrière à une adoption large est sans doute la documentation actuellement réduite. Mais en tout cas, j'espère que cet article vous donnera l'envie et les informations nécessaires pour pouvoir entreprendre la création de votre propre Live!