mercredi 20 juin 2012

Création d'une carte SD virtuelle

Une carte SD type pour la raspberry pi doit avoir au minimum deux partitions :
  • Partition de boot de type Fat32 amorçable, ou se trouveront les fichiers nécessaires pour initialiser le système.
  • Partition de système de fichiers de type Ext4, ou se trouvera le système de fichiers (Logique ;)).
Les utilitaires nécessaires pour la création, la configuration et le montage de notre carte SD virtuelle sont :
  • dd : Convertir un fichier en le copiant.
  • losetup : activer et contrôler les périphériques de boucles.
  • fdisk ou cfdisk : manipulateur de tables de partitions pour Linux.
  • kpartx : créer un mapping des périphériques à partir des tables de partitions.
  • mkfs.vfat et mkfs.ext4 : créer un système de fichiers linux.
  • mount et umount : monter/démonter un système de fichiers linux.
C'est différents paquets doivent être préalablement installés sur votre distribution linux avant de commencer.





On va commencer par créer un fichier vierge (rempli de caractères NULL) de type bloc, de taille 2Go, avec la commande linux dd.

# dd if=/dev/zero of=fake_sd_card.img bs=1024 count=2000000
2000000+0 enregistrements lus
2000000+0 enregistrements écrits
2048000000 octets (2,0 GB) copiés, 86,1476 s, 23,8 MB/s

Paramètres:
    -> if : fichier d'entrée.  
    -> of : fichier de sortie.
    -> bs : nombre d'octets écrits en une fois.
    -> count : nombres de blocs à écrire.

Maintenant, Il faut associer un périphérique de boucle avec notre image précédemment créé, grâce à la commande losetup.

# sudo losetup -f
/dev/loopX

    -> -f : pour connaître le premier périphérique de boucle disponible.
    -> X : le numéro du périphérique de boucle disponible.

# sudo losetup /dev/loop0 fake_sd_card.img
Périphérique boucle : /dev/loop0

Nous voila avec une association entre notre périphérique et notre fichier, on va créer une table de partitions et les partitions pour notre fichier image, pour cela, nous allons utiliser la commande fdisk.

# sudo fdisk /dev/loop0
Commande (m pour l'aide): n (ajouter une nouvelle partition)
Commande d'action
   e   étendue
   p   partition primaire (1-4)
p
Numéro de partition (1-4, par défaut 1): (Touche ENTRER)
Utilisation de la valeur par défaut 1
Premier secteur (2048-3999999, par défaut 2048): (Touche ENTRER)
Utilisation de la valeur par défaut 2048
Dernier secteur, +secteurs or +taille{K,M,G} (2048-3999999, par défaut 3999999): +75M

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

Commande (m pour l'aide): a (bascule le drapeau d'amorce)
Numéro de partition (1-4): 1

Et pour la partition du système de fichiers :

Commande (m pour l'aide): n (ajouter une nouvelle partition)
Commande d'action
   e   étendue
   p   partition primaire (1-4)
p
Numéro de partition (1-4, par défaut 2): (Touche ENTRER)
Utilisation de la valeur par défaut 2
Premier secteur (155648-3999999, par défaut 155648): (Touche ENTRER)
Utilisation de la valeur par défaut 155648
Dernier secteur, +secteurs or +taille{K,M,G} (155648-3999999, par défaut 3999999): (Touche ENTRER)
Utilisation de la valeur par défaut 3999999

Pour afficher le résultat de nos actions :

Commande (m pour l'aide): p (affiche la table de partition)

Disque /dev/loop0 : 2048 Mo, 2048000000 octets
255 têtes, 63 secteurs/piste, 248 cylindres, total 4000000 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x29d14150

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/loop0p1   *        2048      155647       76800    c  W95 FAT32 (LBA)
/dev/loop0p2          155648     3999999     1922176   83  Linux

Nous avons 2 partitions vierges, typées (une en W95 FAT32 et une autre en linux), il nous reste plus qu'à sauvegarder puis quitter l'utilitaire fdisk.

Commande (m pour l'aide): w (écrire la table sur le disque et quitter)

Puisque nous sommes sur un fichier typé disque et non pas sur une vraie carte SD, une erreur apparaît lors de l'enregistrement, mais à ne pas prendre en compte dans notre cas.

A ce moment là, les partitions ne sont pas explicitement présentes sur notre distribution, ce qui veut dire que si on exécute la commande :

# ls -al /dev

On ne verra pas nos deux partitions : /dev/loop0p1 et /dev/loop0p.

L'utilitaire kpartx va créer un mapping des périphériques en fonction de la table de partition donnée :

# sudo kpartx -a -v /dev/loop0
add map loop0p1 (253:0): 0 153600 linear /dev/loop0 2048
add map loop0p2 (253:1): 0 3844352 linear /dev/loop0 155648 

Maintenant si on ré-itère la commande :

# ls -al /dev/mapper
drwxr-xr-x  2 root root     100 2012-06-20 15:05 ./
drwxr-xr-x 16 root root    4420 2012-06-20 15:05 ../
crw-------  1 root root 10, 236 2012-06-18 16:47 control
lrwxrwxrwx  1 root root       7 2012-06-20 15:05 loop0p1 -> ../dm-0
lrwxrwxrwx  1 root root       7 2012-06-20 15:05 loop0p2 -> ../dm-1

Nous visualisons bien que nos deux partitions sont présentes sur le système.

Il va falloir les formater, pour cela nous allons utiliser les utilitaires mkfs.vfat et mkfs.ext4.

Pour formater la partition Fat32, la commande va être la suivante :
# sudo mkfs.vfat -F 32 /dev/mapper/loop0p1

Pour formater la partition Linux en Ext4, la commande va être la suivante :

# sudo mkfs.ext4 /dev/mapper/loop0p2
mke2fs 1.41.14 (22-Dec-2010)
Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
« Stride » = 0 blocs, « Stripe width » = 0 blocs
120240 i-noeuds, 480544 blocs
24027 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=494927872
15 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8016 i-noeuds par groupe
Superblocs de secours stockés sur les blocs : 
 32768, 98304, 163840, 229376, 294912

Écriture des tables d'i-noeuds : complété                        
Création du journal (8192 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Pour accéder à ces deux partitions, on va finalement les monter avec l'utilitaire mount.

# sudo mkdir -p /media/boot
# sudo mkdir -p /media/rootfs
# sudo mount /dev/mapper/loop0p1 /media/boot
# sudo mount /dev/mapper/loop0p2 /media/rootfs

Pour utiliser le fichier, il va falloir démonter le périphérique de boucle associé à celui-ci, dans l'ordre, cela va nous donner :

# sudo umount /media/boot
# sudo umount /media/rootfs

# sudo kpartx -d -v /dev/loop0
del devmap : loop0p2
del devmap : loop0p1

# sudo losetup -d /dev/loop0

Notre carte SD virtuelle est maintenant prête ....
Dans un prochain billet, nous verrons son utilisation.

1 commentaire: