# Clonage des cartes SD (au bureau)

<div style="background: linear-gradient(135deg, #00695c 0%, #004d40 100%); color: white; padding: 24px; border-radius: 12px; margin-bottom: 24px;">
<h2 style="margin:0; color: white;">Operations internes — production en serie</h2>
<p style="margin: 8px 0 0 0; opacity: 0.9;">Cloner, flasher, verifier et reparer les cartes SD avant expedition. Tout en ligne de commande depuis un Mac.</p>
</div>

---

## Image de reference

| Fichier | Taille | Statut |
|---------|:------:|--------|
| `smarteye-dev-backup.img` | ~54 Go | **Fonctionnelle** — validee le 22/02/2026 |

Localisation Mac : `/Users/rachid/jetson_backup/smarteye-dev-backup.img`

!!! warning "Sauvegarde obligatoire"
    Cette image doit exister en **au moins 2 exemplaires** :

    - Sur le Mac (disque local ou externe)
    - Sur le serveur OVH : `scp smarteye-dev-backup.img debian@lucas.unigest.fr:/home/debian/backups/`

---

## 1 — Flasher une carte SD (production)

C'est l'operation principale. Pour chaque nouveau client, on flashe une carte SD neuve depuis l'image de reference.

### Materiel

- Carte SD neuve **SanDisk Extreme Pro** 64 Go minimum
- Lecteur de carte SD (integre ou USB)

### Procedure

```bash
# Identifier la carte SD
diskutil list
# Reperer la carte par sa taille et ses partitions
# Le lecteur integre du Mac peut apparaitre comme "internal, physical", c'est normal

# Demonter sans ejecter
diskutil unmountDisk /dev/diskN

# Flasher (remplacer N par le bon numero)
sudo dd if=/Users/rachid/jetson_backup/smarteye-dev-backup.img of=/dev/rdiskN bs=4m status=progress

# Ejecter proprement
diskutil eject /dev/diskN
```

!!! danger "Verifier le numero de disque"
    Toujours verifier **deux fois** le `/dev/diskN` avant de lancer `dd`. Se tromper de disque = ecraser le disque du Mac.

Le `r` devant `diskN` (→ `rdiskN`) utilise le mode raw, **5x plus rapide**.

Duree : ~20-25 min pour 54 Go a ~39 MB/s.

### Verification rapide

Apres le flash, avant d'ejecter :

```bash
diskutil list /dev/diskN
```

Resultat attendu : une **GUID_partition_scheme** avec ~14 partitions Linux + 1 partition EFI. C'est la structure standard du Jetson Nano.

### Production en serie

Pour flasher plusieurs cartes a la suite :

1. Flasher la carte → ejecter
2. Etiqueter la carte (numero de serie / nom client)
3. Inserer la carte dans un Jetson
4. Inserer la carte suivante dans le lecteur → recommencer

La box part chez le client **carte SD deja inseree, prete a brancher**.

---

## 2 — Creer une nouvelle image de reference (backup)

Quand SmartEye evolue (nouvelle version YOLO, corrections, etc.), il faut creer une nouvelle image de reference depuis le Jetson de dev.

### Procedure

Eteindre le Jetson proprement, retirer la carte SD, l'inserer dans le lecteur du Mac.

```bash
# Identifier la carte SD
diskutil list

# Demonter
diskutil unmountDisk /dev/diskN

# Cloner bit-a-bit
sudo dd if=/dev/rdiskN of=/Users/rachid/jetson_backup/smarteye-dev-backup.img bs=4m status=progress

# Ejecter
diskutil eject /dev/diskN
```

Duree : ~20-25 min pour une carte 64 Go.

### Nommage et archivage

```
smarteye-dev-backup-2026-02-22.img   ← actuelle (validee)
smarteye-dev-backup-2026-03-XX.img   ← future
```

Conserver les anciennes images. Copier sur OVH :

```bash
scp smarteye-dev-backup.img debian@lucas.unigest.fr:/home/debian/backups/
```

---

## 3 — Verifier une image (sans carte SD)

Pour inspecter une image `.img` sans la flasher :

```bash
hdiutil attach -nomount -readonly /Users/rachid/jetson_backup/smarteye-dev-backup.img
```

Resultat attendu :

```
/dev/disk6          GUID_partition_scheme
/dev/disk6s1        EFI
/dev/disk6s2 - s15  Linux Filesystem (multiple)
```

Detacher apres verification :

```bash
hdiutil detach /dev/disk6
```

---

## 4 — Reparer une image corrompue

Si une carte SD ne boot plus (erreur `mmcblk0p1 not found` sur le Jetson), la table de partitions est corrompue. Les donnees sont generalement encore intactes.

### Diagnostic sur le Jetson

Si le Jetson tombe dans un shell d'urgence (`bash-5.1#`) :

```bash
ls /dev/mmcblk0*
```

- `mmcblk0` present mais pas `mmcblk0p1` → table de partitions corrompue → reparable
- `mmcblk0` absent → probleme hardware (carte morte ou mauvais contact)

### Etape 1 : testdisk (retrouver les partitions)

```bash
brew install testdisk
testdisk /Users/rachid/jetson_backup/smarteye-dev-backup.img
```

1. **Create** → nouveau log
2. Selectionner l'image → **Proceed**
3. Type de table → **Intel**
4. **Analyse** → **Quick Search**
5. testdisk retrouve les partitions (FAT32 + Linux)
6. **Entree** pour continuer → **Write** → **Y**

!!! warning "testdisk ne suffit pas"
    testdisk ecrit une table MBR. Le Jetson Nano utilise une table **GPT** avec ~14 partitions. Il faut enchainer avec gdisk.

### Etape 2 : gdisk (restaurer la GPT)

```bash
brew install gptfdisk
gdisk /Users/rachid/jetson_backup/smarteye-dev-backup.img
```

gdisk detecte le conflit :

```
Found valid MBR and corrupt GPT. Which do you want to use?
 1 - MBR
 2 - GPT
 3 - Create blank GPT
```

1. Taper **`2`** (GPT — le header principal est souvent intact)
2. Taper **`x`** (menu expert)
3. Taper **`e`** (relocate backup structures to end of disk)
4. Taper **`m`** (retour menu principal)
5. Taper **`w`** → **Y**

Si gdisk refuse avec "Secondary partition table overlaps the last partition by N blocks" :

```bash
# Dans un AUTRE terminal, agrandir l'image
dd if=/dev/zero bs=512 count=200 >> /Users/rachid/jetson_backup/smarteye-dev-backup.img
```

Puis **quitter** gdisk (`q`) et le **relancer** (il doit recharger la nouvelle taille). Recommencer : 2 → x → e → m → w → Y.

### Verification finale

```bash
hdiutil attach -nomount -readonly /Users/rachid/jetson_backup/smarteye-dev-backup.img
```

GUID_partition_scheme avec ~14 partitions = image reparee. Flasher sur une carte SD et tester le boot.

---

## Fiabilite en production

!!! danger "Cartes SD : prototypage seulement"
    Les cartes SD ont une duree de vie limitee en ecriture. Docker + YOLO = beaucoup d'ecritures. Pour une production a plusieurs centaines de clients :

    - **SSD SATA via USB 3.0** pour le systeme (fiabilite industrielle)
    - **Carte SD uniquement pour le boot initial** (lecture seule)
    - **Backup automatique** des configs vers le serveur OVH

    | Composant | Cout unitaire |
    |-----------|:------------:|
    | SD 32 Go (boot) | ~10 EUR |
    | SSD 120 Go SATA | ~15 EUR |
    | Adaptateur USB 3.0 → SATA | ~8 EUR |
    | **Total par box** | **~33 EUR** |

---

## Etape suivante

→ [Installation chez le client](installation-client.md)
