Restauration rest Décidé
Quatre modes servis par un seul moteur, une reprise qui n'est que le scan à l'envers, des écritures atomiques, un plan de téléchargement groupé par segment — et un principe : le snapshot est une entrée non fiable.
Ce que l’architecture donne gratuitement
- Chaque snapshot est un « full » logique — aucune chaîne à rejouer, on choisit une racine et on descend le DAG.
- Restaurer, c'est vérifier. Chaque adresse est le hash du contenu chiffré, chaque déchiffrement valide le tag AEAD : un chunk corrompu, tronqué ou substitué est détecté mécaniquement, pas par bonne volonté. Un
restore --dry-runqui n'écrit rien = le test de vérification de la section M, gratuit.
Décision 1 — Quatre modes, un seul moteur
Restauration complète, partielle (un sous-arbre, une sélection), un fichier, ou une plage d’octets d’un fichier — les quatre sont le même algorithme : descendre le DAG en n’ouvrant que les branches demandées. Pour la plage, la somme préfixe des len du manifeste donne directement quels chunks couvrent les octets voulus (seek) : restaurer 100 Mo au milieu d’une image disque de 2 To ne télécharge que ~50 chunks, pas le fichier.
Décision 2 — La reprise, c’est le scan à l’envers
Le moteur de comparaison du backup (arbre du snapshot ↔ disque local) sert dans les deux sens : au backup, ce qui diffère monte ; à la restauration, ce qui diffère descend. Conséquences :
- Reprise après crash = relancer la même commande — le re-run est idempotent, les fichiers déjà restaurés (présents et conformes) sont sautés.
- Mode « synchroniser » gratuit — ramener un dossier à l'état exact d'un snapshot, en ne touchant que ce qui a dévié.
- Un seul moteur à écrire, tester et durcir, pour les deux directions.
Décision 3 — Écriture atomique, métadonnées en dernier
Jamais de demi-fichier sous son nom final. Chaque fichier est écrit dans un temporaire puis basculé d’un rename() atomique — un crash en pleine restauration laisse des brouillons identifiables, jamais un fichier final corrompu. Et l’ordre des finitions compte :
- contenu → xattrs/ACL → permissions → timestamps en dernier (sinon la pose des attributs les modifierait) ;
- mtimes des répertoires en post-order — écrire les enfants modifie le mtime du parent, donc on date le parent après ses enfants ;
- liens durs : première occurrence = contenu, suivantes = lien ;
- propriétaires : au choix par uid/gid numériques ou par noms (on stocke les deux) — indispensable quand on restaure sur une autre machine où « l'utilisateur 1000 » n'est pas le même.
Décision 4 — Le plan de téléchargement
Concrètement, une restauration de 1 To ≈ 500 000 chunks éparpillés. La phase de plan collecte toutes les adresses, les trie par (segment, offset) → le serveur lit ses segments quasi séquentiellement (les HDD adorent), le client réassemble. Et la dédup joue à l’envers : un chunk partagé par 50 fichiers est téléchargé une fois, écrit 50 fois — cache éphémère de session, même contrat que celui du scan (optionnel, jetable).
Décision 5 — Le snapshot est une entrée non fiable
../../etc/passwd, ou un lien symbolique vers l'extérieur suivi d'écritures « à travers » le lien. Suivre ces étiquettes aveuglément = écrire hors du répertoire cible — la famille de CVE « path traversal » qui a mordu tar et restic. Règles gravées : noms validés (pas de séparateur, pas de .., noms réservés Windows rejetés), symlinks jamais suivis pendant la création (O_NOFOLLOW / RESOLVE_BENEATH), et toute violation arrête la restauration avec un diagnostic — pas un warning qu'on scrolle.
Décision 6 — Politiques de collision
Restaurer vers l’emplacement d’origine ou ailleurs ; si un fichier existe déjà : skip, overwrite ou newer-only — l’overwrite étant sûr par construction (temp + rename). Défaut non destructif : restauration dans un sous-dossier daté (restore-2026-07-02/) ; écraser en place est un choix explicite, jamais une surprise.
Plus tard (noté, pas conçu) : monter un snapshot en lecture seule comme un disque (FUSE / WinFsp), avec téléchargement paresseux — parcourir « le NAS d’il y a trois semaines » dans l’explorateur de fichiers avant de choisir quoi restaurer. Servira l’UI de restauration de la section H.