Les flags FSEvents expliqués : chaque bit décodé
Chaque bit de flag FSEvents sur disque, sa valeur, ses noms selon FSEventsParser et mac_apt, et comment lire Created, Renamed, ItemCloned ou EndOfTransaction.
En bref. Le champ des flags est un ensemble de bits sur 32 bits en little-endian. Lu ainsi, Created vaut 0x00000001, Removed 0x00000002, Renamed 0x00000008, Modified 0x00000010, et le type d'élément se trouve dans les bits de poids fort (File 0x00800000, Folder 0x01000000). FSEventsParser lit ces quatre mêmes octets en big-endian : ses constantes ont donc les octets inversés (Created = 0x01000000), avec les mêmes noms. Aucune de ces valeurs ne correspond aux valeurs kFSEventStreamEventFlag* de l'API d'Apple.
La table
Les valeurs sont celles du u32 lu en little-endian (la convention de mac_apt). La colonne FSEventsParser montre le même bit selon sa convention big-endian.
| Bit (LE) | FSEventsParser (BE) | Nom (FSEventsParser / mac_apt) | Signification |
|---|---|---|---|
0x00000001 | 0x01000000 | Created | Élément créé |
0x00000002 | 0x02000000 | Removed | Élément supprimé |
0x00000004 | 0x04000000 | InodeMetaMod | Métadonnées d'inode modifiées (mode, horodatages…) |
0x00000008 | 0x08000000 | Renamed / RenamedOrMoved | Renommé ou déplacé |
0x00000010 | 0x10000000 | Modified | Contenu modifié |
0x00000020 | 0x20000000 | Exchange | Échangé avec un autre élément (enregistrement atomique) |
0x00000040 | 0x40000000 | FinderInfoMod | Informations Finder modifiées |
0x00000080 | 0x80000000 | FolderCreated | Dossier créé |
0x00000100 | 0x00010000 | PermissionChange | Permissions ou propriétaire modifiés |
0x00000200 | 0x00020000 | ExtendedAttrModified / XAttrModified | Attribut étendu défini ou modifié |
0x00000400 | 0x00040000 | ExtendedAttrRemoved / XAttrRemoved | Attribut étendu supprimé |
0x00001000 | 0x00100000 | DocumentRevisioning / DocumentRevision | Implique le stockage des versions de documents |
0x00004000 | 0x00400000 | ItemCloned | Clone APFS (copie en copy-on-write), High Sierra et versions ultérieures |
0x00080000 | 0x00000800 | LastHardLinkRemoved | Dernier lien physique vers un inode supprimé |
0x00100000 | 0x00001000 | HardLink | L'élément est un lien physique |
0x00400000 | 0x00004000 | SymbolicLink | L'élément est un lien symbolique |
0x00800000 | 0x00008000 | FileEvent / File | L'élément est un fichier |
0x01000000 | 0x00000001 | FolderEvent / Folder | L'élément est un dossier |
0x02000000 | 0x00000002 | Mount | Un volume a été monté sur ce chemin |
0x04000000 | 0x00000004 | Unmount | Un volume a été démonté de ce chemin |
0x20000000 | 0x00000020 | EndOfTransaction | Marque la fin d'un groupe de modifications liées |
Les autres bits n'ont pas de signification documentée. Le FSEvents Parser les affiche en hexadécimal plutôt que de deviner, et FSEventsParser les étiquette NOT_USED ; les voir apparaître dans des données carvées indique que l'enregistrement est probablement endommagé.
Lire les combinaisons
Un enregistrement porte toutes les modifications que fseventsd a fusionnées pour ce chemin (voir fusion d'événements) :
Created;Modified;FileEvent: un fichier a été écrit. C'est la forme habituelle d'un nouveau document ou d'un téléchargement.Created;Modified;Removed;FileEvent: un fichier éphémère (fichiers temporaires, données de travail d'un installeur, fichier créé puis supprimé entre deux écritures du journal). L'ordre au sein de l'enregistrement n'est pas conservé.Renamed;FileEventdeux fois, même node ID : un renommage ou un déplacement ; l'identifiant d'événement le plus bas correspond généralement à l'ancien chemin. En 1SLD, il n'y a pas de node ID et l'appariement repose sur des identifiants consécutifs.ExtendedAttrModifiedsur un nouveau téléchargement : typiquement la pose des attributs de quarantaine et de provenance (where-from).ExtendedAttrRemovedsur des éléments extraits ou téléchargés : un attribut a été retiré. Supprimercom.apple.quarantineen est une raison possible, voir attribut de quarantaine ; de nombreuses applications retirent des attributs en routine.InodeMetaModseul : unchmod, untouchou un changement de propriétaire ; rendre exécutable un utilitaire téléchargé ressemble souvent à cela.Mount;FolderEventsurVolumes/NAME: un volume a été attaché à ce point de montage. Le propre.fseventsddu volume journalise ensuite ce qui y est écrit.ItemCloned: un clone APFS, par exemple une duplication dans le Finder ou uncp -c. Le clone et sa source partagent les mêmes blocs de données.
Les constantes de l'API sont différentes
Les FSEventStreamEventFlags documentés par Apple (kFSEventStreamEventFlagItemCreated = 0x100, …ItemIsFile = 0x10000, etc.) décrivent ce qu'une application en cours d'exécution reçoit de l'API FSEvents. Ils ne correspondent pas aux bits écrits dans .fseventsd, comme l'ont relevé les recherches de Nicole Ibrahim et le code source de mac_apt. Un parseur qui applique la table de l'API aux fichiers journaux produit des noms erronés.
Comment le parseur affiche les flags
Le FSEvents Parser affiche les flags de modification sous forme de pastilles étiquetées, le type d'élément dans sa propre colonne, ainsi que la valeur brute (par exemple 0x00800011) et les noms à la manière de FSEventsParser dans le détail de l'enregistrement et dans les exports CSV. Le filtre de modifications regroupe les bits en Création, Suppression, Renommage, Modification/clonage, métadonnées/attributs et montage/démontage.
FAQ
Les flags des journaux FSEvents sont-ils les mêmes que ceux de l'API FSEventStream ?
Non. Les bits stockés dans les journaux .fseventsd diffèrent des constantes publiques kFSEventStreamEventFlag d'Apple. Utilisez une table conçue pour le format sur disque.
Que signifie ExtendedAttrRemoved ?
Un attribut étendu a été retiré de l'élément. FSEvents ne précise pas lequel ; le retrait de com.apple.quarantine n'est qu'une possibilité parmi d'autres.