Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Fichiers spéciaux & métadonnées étendues spec Décidé

Un fichier n'est pas que son contenu : propriétaires, cinq familles d'ACL incompatibles, xattrs, flags d'inode, flux annexes, liens, trous. Règle d'or : capturer fidèlement, restaurer au mieux, ne jamais mentir.

En clair — le déménageur consciencieux Un carton n'est pas que son contenu. Il porte une étiquette de propriétaire, une liste de qui a le droit de l'ouvrir, des post-its collés dessus, parfois un scellé « ne pas ouvrir ». Et certains « objets » ne sont même pas des cartons : le panneau indicateur (symlink — on déménage le panneau, pas ce qu'il pointe), le robinet dans le mur (device — on note qu'il y a un robinet, on ne déménage pas l'eau). Le déménageur qui perd les post-its en silence, on s'en aperçoit six mois plus tard — trop tard. D'où le bordereau : tout ce qui n'a pas été déménagé est écrit dessus.

La règle d’or

Capturer fidèlement · restaurer au mieux · ne jamais mentir Au backup : tout ce qui est lisible est capturé, en octets bruts (pas d'interprétation qui peut se tromper). À la restauration : tout ce que l'OS cible et les privilèges permettent est appliqué. Et tout ce qui a été sauté — dans un sens ou dans l'autre — apparaît dans le rapport, jamais en silence. Les outils de backup perdent la confiance de leurs utilisateurs une métadonnée à la fois ; le silence est le vrai bug.

L’inventaire par type de fichier

TypeAu backupÀ la restauration
Fichier ordinairecontenu (flux) + méta
Répertoireentrées + méta
Symlinkla cible (chaîne brute, jamais suivie) + métarecréé tel quel
Lien durgroupe dev+inode → contenu stocké une fois1ʳᵉ occurrence = contenu, suivantes = lien
Sparsetrous détectés (SEEK_HOLE) → entrées holetrous recréés, zéro octet stocké
Device (char/bloc)méta seulement (major/minor) — on ne lit jamais le contenurecréé si root, sinon rapporté
FIFOméta seulementrecréé
Socketignoré (artefact d’exécution)— signalé au scan

Deux lignes assumées : les devices (lire /dev/sda par accident serait catastrophique — on note le robinet, pas l’eau) et les sockets (rien à restaurer, mais dit dans le rapport, pas tu).

L’inventaire des attributs — exhaustif

Identité & droits — il n’y a pas une langue des permissions

En clair — les dialectes d'ACL On croit que « les permissions », c'est un seul système. En réalité il en existe cinq dialectes incompatibles, et la cible NAS de Cairn les croise tous : un partage Synology ne parle pas la même langue qu'un partage Windows ni qu'un QNAP récent. Un backup qui traduit d'un dialecte à l'autre trahit : la seule fidélité possible est de stocker chaque ACL dans sa langue d'origine, taguée par famille, et de la restaurer à l'identique sur un système du même type.
  • mode POSIX — rwx + setuid / setgid / sticky bit.
  • uid / gid + noms — les deux, pour le mapping à la restauration ([décidé](manifests.md)).
  • ACL POSIX (access + default) — Linux classique, via system.posix_acl_*.
  • ACL NFSv4 / richacl — macOS, ZFS (QNAP QuTS hero), montages NFS (system.nfs4_acl).
  • SynoACL — le système propriétaire de Synology (DSM monte ext4/btrfs avec l'option synoacl, sémantique façon Windows, stocké en xattrs dédiés, géré par synoacltool). Les outils standard (rsync…) le massacrent — le capturer fidèlement est un différenciateur pour la cible NAS.
  • NT ACL QNAP — QTS (ext4) maintient une émulation NT ACL propriétaire en plus des ACL POSIX ; les deux peuvent entrer en conflit à la migration.
  • Security descriptor Windows — owner SID, group SID, DACL, et SACL (règles d'audit — lecture soumise au privilège SeSecurityPrivilege : capturée si l'agent l'a, rapportée sinon).
  • Capabilities Linuxsecurity.capability (voir l'encart rouge).
  • Contexte SELinuxsecurity.selinux.

Temps

  • mtime, ctime — capturés en ns ; le ctime n'est pas restaurable (aucune API), on le garde pour l'audit.
  • birthtime / crtime — capturé (statx btime, natif Windows/macOS) ; restaurable sur Windows et macOS, pas d'API Linux → rapporté.
  • atime — optionnel (off par défaut : coûteux, peu utile, et le lire le modifie ailleurs).

Flags — trois mécanismes distincts

  • Flags d'inode Linux (chattr/lsattr) : immutable, append-only, nodump, noatime… — ce ne sont pas des xattrs : ioctl FS_IOC_GETFLAGS, un chemin de capture séparé. L'immutable exige CAP_LINUX_IMMUTABLE à la restauration.
  • Flags BSD/macOS (chflags) : uchg, schg, hidden, opaque… — la suite de tests BackupBouncer a montré que même restic en rate ; on vise la fidélité complète ici.
  • Attributs Windows : hidden, system, readonly, archive, compressed, encrypted, temporary, offline, not-content-indexed.

Contenus annexes & structure

  • xattrs, tous namespacesuser.*, security.*, system.*, trusted.* (root requis), com.apple.* (FinderInfo, tags/labels, quarantine…). Octets bruts, namespace inclus.
  • Flux annexes — ADS Windows, resource forks macOS : couverts par les [flux nommés](manifests.md) du modèle. Exemple d'ADS que tout le monde croise : Zone.Identifier, la marque « téléchargé d'Internet » qui déclenche l'avertissement de sécurité — restaurée fidèlement comme n'importe quel flux.
  • Extended Attributes NTFS ($EA) — le vrai jumeau des xattrs sous Windows, à ne pas confondre avec les ADS : petites paires clé→valeur (~64 Ko max par fichier), héritage OS/2, accessibles uniquement par l'API native (NtQueryEaFile — pas même une API Win32 normale). Quasi inutilisés… sauf par WSL : les distributions Linux y rangent uid/gid/mode ($LXUID, $LXGID, $LXMOD) et les xattrs Linux (LX.*). Les rater = restaurer un environnement WSL aux permissions détruites, silencieusement. Capturés.
  • Reparse points Windows — symlinks, junctions, mount points : capturés avec leur type exact (un junction n'est pas un symlink) ; les placeholders (OneDrive & co) ne sont jamais « hydratés » de force — capturés comme reparse, rapportés.
Le piège security.capability — le binaire silencieusement cassé Un binaire doté de capabilities (setcap — un ping sans setuid, un service qui ouvre un port < 1024) les porte dans l'xattr security.capability. Restauré sans cet attribut, le binaire est silencieusement cassé : il se lance, puis échoue à faire son travail, souvent des semaines plus tard. Même famille de piège que l'ACL Synology perdue par rsync : la métadonnée invisible dont l'absence ne se voit qu'à l'usage. C'est exactement ce que la règle du rapport interdit : si une capability ou une SynoACL n'a pas pu être restaurée, c'est écrit noir sur blanc.

Les cas retors — vérifiés, décidés

La compression transparente macOS — le piège du post-it qui ment macOS compresse certains fichiers de façon invisible : les données compressées vivent dans l'xattr com.apple.decmpfs (ou le resource fork), le flag BSD UF_COMPRESSED est posé, et toute lecture normale décompresse à la volée. Le piège mortel pour un backup « fidèle » : lire le contenu (déjà décompressé) et recopier bêtement l'xattr decmpfs + le flag → à la restauration, un fichier dont le post-it dit « je suis compressé » alors que le contenu ne l'est plus = fichier corrompu. Règle : contenu capturé décompressé, decmpfs/fork compressé/UF_COMPRESSED jamais restaurés tels quels (recompression optionnelle façon ditto --hfsCompression, plus tard). L'exception qui confirme la règle d'or : ici, la fidélité aveugle serait le bug.
  • Fichiers chiffrés par le FS — EFS Windows, fscrypt Linux. Lus normalement, ils livrent le clair (si l'agent a la clé) ou rien. EFS a une API dédiée de backup (ReadEncryptedFileRaw/WriteEncryptedFileRaw, privilège SeBackupPrivilege) : capture du chiffré + métadonnées $EFS sans détenir la clé — restaurable uniquement avec les clés d'origine, et dit tel quel dans le rapport. fscrypt n'a pas d'équivalent : contenu capturé si déverrouillé, sinon rapporté. Dans les deux cas, jamais de faux espoir silencieux.
  • Noms courts 8.3 Windows (FILENA~1.TXT) — des applications legacy et des entrées de registre y font référence. Capturés ; restauration best-effort (SetFileShortName, privilèges requis), rapportée sinon.
  • Object IDs NTFS ($OBJECT_ID, résolution des raccourcis par Distributed Link Tracking) — capturés, restaurés si possible.
  • Clones & reflinks (clonefile APFS, reflink btrfs/XFS) — deux fichiers partageant leurs blocs. La relation de clone n'est pas préservée (les fichiers redeviennent indépendants à la restauration — ils peuvent donc occuper plus de place localement) ; côté serveur, la dédup neutralise de toute façon le doublon. Assumé et documenté.
  • Project IDs (quotas projet XFS/ext4, via FS_IOC_FSGETXATTR) — capturés où lisibles, rapportés sinon.
  • Whiteouts overlayfs (couches Docker : char device 0:0 + xattrs trusted.overlay.*) — déjà couverts par la capture des devices et des xattrs trusted.* ; noté explicitement car un NAS qui héberge des conteneurs en est plein.

Privilèges — la dégradation propre

Agent non-root : certaines métadonnées sont illisibles (trusted.*, SACL, certaines ACL) → capturé ce qui peut l’être, le reste listé dans le rapport de backup. Restauration non-root : ownership, devices, flags immutables inapplicables → appliqués si possible, rapportés sinon. Jamais d’échec global pour une méta inapplicable, jamais de silence non plus. (La question « l’agent tourne-t-il en root/SYSTEM ? » appartient au sujet Forme.)

Restauration croisée — entre dialectes

Restaurer un backup Synology vers un Linux vanilla, ou un partage Windows vers un QNAP : le contenu passe toujours ; les métadonnées de la mauvaise famille sont conservées dans le snapshot (rien n’est perdu), non appliquées, et rapportées. Une traduction best-effort entre familles d’ACL (SynoACL → POSIX, richacl → DACL…) est envisageable plus tard comme option explicite — jamais silencieuse, la traduction fidèle n’existant pas. Le détail par plateforme (APIs, formats exacts) appartient au sujet Multi-plateforme.