lundi 20 juin 2016

Créer une SD carte master pour RPi

Voici comment dupliquer 'intelligemment' une carte mémoire d'un Raspberry pi.
L'image de la certe peut ensuite etre archivé, et etre utiliser comme 'master'.

'Intelligemment' veut dire que l'on ne va pas dupliquer tout le support physique si ce n'est pas nécessaire.

Étape 1 : Évaluer la taille utile sur la carte micro SD

Depuis le RPi que le font dupliquer taper :

# fdisk  -l

Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes, 31116288 sectors
        Device Boot  Start     End  Blocks   Id  System

/dev/mmcblk0p1        2048  616447  307200    c  W95 FAT32 (LBA)
/dev/mmcblk0p2      616448 1665023  524288   82  Linux swap
/dev/mmcblk0p3     1665024 5859327 2097152   83  Linux

On voit que le support physique (/dev/mmcblk0) fait 31116288 secteurs (donc ~ 14.8 Go)  alors que la dernière partition (/dev/mmcblk0p3)  s’arrête au secteur 5859327 (~ 2.8 Go). Il suffit donc de faire une image des 5859328 premiers secteurs. Un secteur faisant 512 octets cela fait 2929664 ko à sauvegarder. Soit encore 183104 x 16 k.

Étape 2 : Créer le fichier image

Depuis une autre machine ayant suffisamment d’espace disque, on peut aller pomper l’image d’un des raspberry du cluster en utilisant dd au travers de ssh :

# ssh root@rbpi09 "dd if=/dev/mmcblk0 count=183104 bs=16k" > /tmp/rpi.img
183104+0 records in
183104+0 records out
2999975936 bytes copied, 328.288 s, 9.1 MB/s


Étape 3: Vérifier / retoucher l’image

La commande ‘file’ va indiquer si le fichier est reconnaissable

# file rpi.img
rpi.img: x86 boot sector;
 
partition 1: ID=0xc, starthead 32, startsector 2048, 614400 sectors;
partition 2: ID=0x82, starthead 94, startsector 616448, 1048576 sectors;
partition 3: ID=0x83, starthead 163, startsector 1665024, 4194304 sectors, code offset 0xb8

Avec la commande fdisk -l rpi.img on retrouve les même info.

On peut monter les partitions fat32 et Linux, à condition de donner leur offset de début dans le fichier à l’octet prêt, c’est-à-dire offset = 512  * Secteur de démarrage.
Pour la partition FAT32 offset = 512 * 2048 = 10315776
Pour la partition Linux  offset = 512 * 1665024 = 852492288

 # mkdir /mount/img
 # mount -o loop,offset=852492288 rpi314.img2 /mnt/img
On peut même aller modifier les fichiers dans /mnt/img (pour vider des log par exemple)
On termine par : umount /mnt/img

Si on veut manipuler les partitions (changement de taille, tester le file system) on ne peut pas le faire si le fichier image est montée avec 'mount'. Il faut à la place créer une interface loopback avec la commande 'losetup' :

 # losetup -o offset -f --show rpi.img 

remplacer offset par l'offset de début de la partition (comme avec mount)
Grace à l'option --show losetup affiche sur quelle interface la partition a été montée. (En général /dev/loop1)

On peut alors utiliser cette interface comme on le fait
# fsk /dev/loop1
e2fsck 1.42.9 (28-Dec-2013)
/dev/loop1: clean, 68537/131072 files, 341154/524288 blocks

Terminer avec ' losetup -D'  pour détacher toutes les interfaces loopback.
Le fichier image peut être compressé pour être archivé, ou être utilisé pour créer d'autre cartes micro SD.

Étape 5 : Graver l'image