La clé USB est devenu un support très populaire de part sa très grande diffusion dans le monde de la bureautique, la vieille disquette 1.44 Mo étant devenue bien maigrichonne pour accueillir la plupart des fichiers actuels. Tous les utilisateurs de matériel informatique ont maintenant un clé USB dans la poche et on trouve même des couteaux suisses avec clé USB comme décrit sur la figure 4!

Figure 4: Couteau Suisse avec clé USB
Il est bien entendu possible de l'utiliser sous Linux et elle sera alors vue comme un disque SCSI. La plupart des distributions actuelles intègrent le support des clés USB en natif (dans le noyau livré) et l'insertion de la clé provoque l'affichage du message suivant dans les traces du système.
Sep 21 12:13:26 localhost kernel: hub.c: new USB device 00:07.2-1, assigned address 2 Sep 21 12:13:26 localhost kernel: usb.c: USB device 2 (vend/prod 0xea0/0x6803) is not claimed by any active driver. Sep 21 12:13:27 localhost kernel: SCSI subsystem driver Revision: 1.00 Sep 21 12:13:27 localhost kernel: Initializing USB Mass Storage driver... Sep 21 12:13:27 localhost kernel: usb.c: registered new driver usb-storage Sep 21 12:13:27 localhost kernel: scsi0 : SCSI emulation for USB Mass Storage devices Sep 21 12:13:27 localhost kernel: Vendor: OTi Model: Flash Disk Rev: 1.11 Sep 21 12:13:27 localhost kernel: Type: Direct-Access ANSI SCSI revision: 02 Sep 21 12:13:27 localhost kernel: USB Mass Storage support registered.
La clé est utilisable à travers le fichier spécial /dev/sda et l'on peut bien entendu la partitionner, formater, monter, etc. La clé suivante contient deux partitions de 16 Mo, l'une au format VFAT pour les transferts Windows, l'autre au format EXT3 contenant une mini-distribution Linux. L'existence de cette deuxième partition Linux ne trouble en rien l'utilisation de la clé sous Windows.
Le démarrage sur la clé pose quelques petits problèmes:
Le BIOS du PC doit permettre le démarrage sur support disque USB. C'est le cas de la majorité des PC spécialisés pour les applications embarquées (EDEN, LEX, etc.) mais ce n'est pas le cas des PC grand public.
La détection de la clé USB lors du démarrage du noyau Linux est asynchrone par rapport au montage du système de fichier principal (ou root filesystem). De ce fait, un noyau Linux standard ne pourra pas utiliser comme root filesystem une partition d'une clé USB. Cependant la modification à apporter au noyau pour permettre cette utilisation est minime et se limite à un patch de quelques lignes appliqué au fichier init/do_mounts.c. Il existe plusieurs patch disponibles, celui-ci est accessible depuis le FAQ du site http://www.Linux-usb.org.
--- do_mounts.c 2003-09-03 20:27:20.000000000 +1000
+++ ../../../kernel-source-2.4.22/init/do_mounts.c 2003-12-15 08:58:40.000000000 +1100
@@ -348,6 +348,7 @@ static void __init mount_block_root(char
{
char *fs_names = __getname();
char *p;
+ int retries = 0;
get_fs_names(fs_names);
retry:
@@ -369,8 +370,16 @@ retry:
printk ("VFS: Cannot open root device \"%s\" or %s\n",
root_device_name, kdevname (ROOT_DEV));
printk ("Please append a correct \"root=\" boot option\n");
- panic("VFS: Unable to mount root fs on %s",
- kdevname(ROOT_DEV));
+ if (++retries > 5)
+ panic("VFS: Unable to mount root fs on %s",
+ kdevname(ROOT_DEV));
+ else {
+ /* wait 1 second and try again */
+ printk ("Retrying in 1 second, try #%d\n", retries);
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(HZ);
+ goto retry;
+ }
}
panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));
out:
Le principe de la modification est simple: on ajoute une attente de quelques secondes (maximum 5 essais) pour laisser le temps à la clé USB d'être détectée. Ce n'est pas des plus élégants mais c'est simple et cela fonctionne. Une modification similaire à ajouter à la fin de la fonction mount_root() est également disponible ci-dessous.
/*
* Patch for USB boot
*/
{
/* begin jordi **************************** */
static DECLARE_WAIT_QUEUE_HEAD (jordi_queue);
printk ("\n\n\n---------------------------------\n");
printk (" WAITING FOR A WHILE (1000) \n");
printk (" TO DETECT THE USB DISK \n");
sleep_on_timeout (&jordi_queue, 1000);
printk ("---------------------------------\n\n\n");
/* end jordi **************************** */
}
/* End of patch */
mount_block_root("/dev/root", root_mountflags);
}
Au niveau de la configuration du noyau, il faudra valider les différentes options (SCSI et USB) en statique pour permettre la détection de la clé USB en tant que disque au démarrage. Les figures suivantes indiquent la configuration SCSI et USB. Bien entendu si vous disposez d'un contrôleur OHCI et non UHCI, il faudra adapter la configuration USB.

Figure 5: Configuration SCSI du noyau

Figure 6: Configuration USB du noyau
Concernant l'installation de LILO, le principe est le même que pour les CompactFlash ou DoM (puisque c'est également un périphérique en mode bloc) sauf qu'il faut utiliser /dev/sda au lieu de /dev/hda.