« Précédent Suivant »

Mass Storage USB sur tous les OS grâce au File-backed Storage Gadget (g_file_storage)

Le 02/06/2011 à 10:42

Je me suis attelé récemment à la mise en place d'un mass storage (FAT32) sur un device Linux grâce au gadget file storage (g_file_storage), compatible avec Windows, Mac et Linux ! Hé bien, c'est un peu de la tambouille magique pour rendre ça compatible entre OS. Hélas, la documentation que l'on retrouve sur Internet ne précise pas forcément les étapes pour faire fonctionner le mass storage sous tous les OS. En fouinant bien j'ai fini par trouver les étapes à suivre pour mettre ça en place ! C'est plus une question du bon argument à spécifier à la création de la partition, mais au final on gagne du temps quand on le sait dès le départ ! Parce qu'aller fouiner dans le code source du driver pour voir comment ça marche c'est cool, mais un poil prise de tête. (encore que mine de rien c'est plutôt bien documenté)

Voici les étapes :

Préparation du kernel

Préparation de la partition

Jusque là, je n'ai réussi qu'à générer des partitions puissances de 2 au niveau de la taille. Avec des unités d'allocation de 4 Ko (par défaut), il suffit de changer le nombre de têtes (1, 2, 4, ...) pour avoir respectivement des mass storage de (4, 8, 16Mo, ...) Je n'ai pas encore complètement compris entièrement le fonctionnement pour tenter de sortir des clous avec des partitions exotiques (genre 7Mo si c'est envisageable). Si quelqu'un a l'information, je suis preneur ;) Parce que je me perds un peu avec cette ratatouille de Linux / Windows qui n'ont pas les mêmes unités...

Bref, dans cet exemple je me base sur un mass storage de 4 Mo. Mais pour augmenter la taille de celle-ci, il suffit de changer la valeur du count dans la commande dd qui va suivre, puis le nombre de têtes dans le fdisk. Le max était 255 têtes, soit les 1020 Mo max du FAT32 pour des unités d'allocation de 4 Ko

Créons donc notre périphérique à partir du néant !

dd bs=1M count=4 if=/dev/zero of=mass_storage.img

Puis lançons fdisk.

$ fdisk mass_storage.img
Le périphérique ne contient pas une table de partitions DOS ou Sun, SGI, OSF valide
Création d'une nouvelle étiquette DOS avec id de disque 0x3a4a9ca1.
Les modifications restent en mémoire jusqu'à ce que vous les écriviez.
Après quoi, bien sûr, le contenu précédent sera irrécupérable.

AVERTISSEMENT: fanion 0x0000 non valide dans la table de partitions 4, sera corrigé par w(écriture)
Vous devez initialiser cylindres.
Vous pouvez faire cela depuis le menu des fonctions avancées.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Commande (m pour l'aide): x

Commande pour experts (m pour de l'aide): s
Nombre de secteurs (1-63, par défaut 63): 8
AVERTISSEMENT: initialisation du décalage de secteur pour compatibilité DOS

Commande pour experts (m pour de l'aide): h
Nombre de têtes (1-256, par défaut 255): 1

Commande pour experts (m pour de l'aide): c
Nombre de cylindres (1-1048576): 1024

Commande pour experts (m pour de l'aide): r

Commande (m pour l'aide): n
Commande d'action
e   étendue
p   partition primaire (1-4)
p
Numéro de partition (1-4): 1
Premier cylindre (2-1024, par défaut 2):
Utilisation de la valeur par défaut 2
Dernier cylindre, +cylindres or +taille{K,M,G} (2-1024, par défaut 1024):
Utilisation de la valeur par défaut 1024

Commande (m pour l'aide): t
Partition sélectionnée 1
Code Hexa (taper L pour lister les codes): b
Type système de partition modifié de 1 à b (W95 FAT32)

Commande (m pour l'aide): p

Disque mass_storage.img: 0 Mo, 0 octets
1 têtes, 8 secteurs/piste, 1024 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x3a4a9ca1

Périphérique Amorce  Début        Fin      Blocs     Id  Système
mass_storage.img1               2        1024        4092    b  W95 FAT32

Commande (m pour l'aide): w
La table de partitions a été altérée!

AVERTISSEMENT: si vous avez créé ou modifié une partition DOS 6.x,
svp consulter les pages du manuel de fdisk pour des informations
complémentaires.
Synchronisation des disques.

Et si l'on souhaite consulter les informations de notre partition :

$ fdisk -l mass_storage.img
Vous devez initialiser cylindres.
Vous pouvez faire cela depuis le menu des fonctions avancées.

Disque mass_storage.img: 0 Mo, 0 octets
1 têtes, 8 secteurs/piste, 0 cylindres
Unités = cylindres de 8 * 512 = 4096 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x3a4a9ca1

Périphérique Amorce  Début        Fin      Blocs     Id  Système
mass_storage.img1               2        1024        4092    b  W95 FAT32

Pour accéder au device, on doit alors préciser à quel offset se placer pour travailler avec. Pour ça nous devons calculer la taille du premier cylindre. Soit :

offset = cylindres de 8 * 512 = 4096 octets (indiqué par la commande p du fdisk ou fdisk -l)

losetup -o 4096 /dev/loop0 mass_storage.img

Et on créé un magnifique système de fichiers FAT32 appelé “storage” :

mkdosfs /dev/loop0 -n storage

Si vous voulez vous pouvez monter votre mass storage et bidouiller dedans :

mount -t vfat /dev/loop0
...
umount /dev/loop0

puis on démonte le périphérique virtuel.

losetup -d /dev/loop0

Chargement du mass_storage

Une fois que votre kernel est en place sur votre système, il n'y a plus qu'à placer le fichier mass_storage.img sur le système embarqué et de charger la partition :

insmod g_file_storage.ko file=/tmp/mass_storage.img stall=0

stall=0 est l'option magique qui fait que le mass_storage fonctionne sous Windows sans mouliner à l'infini en attendant une détection du filesystem. (boolean to permit the driver to halt bulk endpoints) On peut également jouer avec l'option ro pour mettre le mass storage en read only ou non. De façon générale on peut retrouver de la doc sur le driver dans le kernel : drivers/usb/gadget/file_storage.c

Et voilà, en branchant votre device sur n'importe quel OS, il sera reconnu comme disque de mass storage appelé “storage” :) Héhé !

Et pour la route, voici les partitions FAT32 finales (vides) :

« Précédent Suivant »
Commentaires
blog comments powered by Disqus