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.
La règle d’or
L’inventaire par type de fichier
| Type | Au backup | À la restauration |
|---|---|---|
| Fichier ordinaire | contenu (flux) + méta | ✓ |
| Répertoire | entrées + méta | ✓ |
| Symlink | la cible (chaîne brute, jamais suivie) + méta | recréé tel quel |
| Lien dur | groupe dev+inode → contenu stocké une fois | 1ʳᵉ occurrence = contenu, suivantes = lien |
| Sparse | trous détectés (SEEK_HOLE) → entrées hole | trous recréés, zéro octet stocké |
| Device (char/bloc) | méta seulement (major/minor) — on ne lit jamais le contenu | recréé si root, sinon rapporté |
| FIFO | méta seulement | recréé |
| Socket | ignoré (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
- 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é parsynoacltool). 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 Linux —
security.capability(voir l'encart rouge). - Contexte SELinux —
security.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é (
statxbtime, 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 : ioctlFS_IOC_GETFLAGS, un chemin de capture séparé. L'immutable exigeCAP_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 namespaces —
user.*,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.
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
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ègeSeBackupPrivilege) : 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 xattrstrusted.*; 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.