Operations internes — production en serie
Cloner, flasher, verifier et reparer les cartes SD avant expedition. Tout en ligne de commande depuis un Mac.
---
## 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)