Flags de FSEvents explicados: cada bit, decodificado
Todos los bits de flags de FSEvents en disco con su valor, sus nombres en FSEventsParser y mac_apt, y cómo leer Created, Renamed, ItemCloned o EndOfTransaction.
En resumen. El campo de flags es un conjunto de bits de 32 bits en little-endian. Leído así, Created es 0x00000001, Removed 0x00000002, Renamed 0x00000008, Modified 0x00000010, y el tipo de elemento se encuentra en los bits altos (File 0x00800000, Folder 0x01000000). FSEventsParser lee esos mismos cuatro bytes en big-endian, por lo que sus constantes tienen los bytes invertidos (Created = 0x01000000), con los mismos nombres. Ninguno de estos valores coincide con los de la API kFSEventStreamEventFlag* de Apple.
La tabla
Los valores corresponden al u32 leído en little-endian (la convención de mac_apt). La columna FSEventsParser muestra el mismo bit en su convención big-endian.
| Bit (LE) | FSEventsParser (BE) | Nombre (FSEventsParser / mac_apt) | Significado |
|---|---|---|---|
0x00000001 | 0x01000000 | Created | Elemento creado |
0x00000002 | 0x02000000 | Removed | Elemento eliminado |
0x00000004 | 0x04000000 | InodeMetaMod | Metadatos del inodo modificados (p. ej., modo, marcas de tiempo) |
0x00000008 | 0x08000000 | Renamed / RenamedOrMoved | Renombrado o movido |
0x00000010 | 0x10000000 | Modified | Contenido modificado |
0x00000020 | 0x20000000 | Exchange | Intercambiado con otro elemento (guardado atómico) |
0x00000040 | 0x40000000 | FinderInfoMod | Información del Finder modificada |
0x00000080 | 0x80000000 | FolderCreated | Carpeta creada |
0x00000100 | 0x00010000 | PermissionChange | Permisos o propietario modificados |
0x00000200 | 0x00020000 | ExtendedAttrModified / XAttrModified | Atributo extendido establecido o modificado |
0x00000400 | 0x00040000 | ExtendedAttrRemoved / XAttrRemoved | Atributo extendido eliminado |
0x00001000 | 0x00100000 | DocumentRevisioning / DocumentRevision | Interviene el almacén de versiones de documentos |
0x00004000 | 0x00400000 | ItemCloned | Clon APFS (copia copy-on-write), High Sierra y posteriores |
0x00080000 | 0x00000800 | LastHardLinkRemoved | Eliminado el último enlace duro a un inodo |
0x00100000 | 0x00001000 | HardLink | El elemento es un enlace duro |
0x00400000 | 0x00004000 | SymbolicLink | El elemento es un enlace simbólico |
0x00800000 | 0x00008000 | FileEvent / File | El elemento es un archivo |
0x01000000 | 0x00000001 | FolderEvent / Folder | El elemento es una carpeta |
0x02000000 | 0x00000002 | Mount | Se montó un volumen en esta ruta |
0x04000000 | 0x00000004 | Unmount | Se desmontó un volumen de esta ruta |
0x20000000 | 0x00000020 | EndOfTransaction | Marca el final de un grupo de cambios relacionados |
El resto de bits no tiene un significado documentado. El FSEvents Parser los muestra en hexadecimal en lugar de aventurar una interpretación, y FSEventsParser los etiqueta como NOT_USED; encontrarlos en datos recuperados mediante carving es un indicio de que el registro está dañado.
Cómo leer las combinaciones
Un registro recoge todos los cambios que fseventsd fusionó para esa ruta (consulta coalescencia de eventos):
Created;Modified;FileEvent: se escribió un archivo. Es el patrón habitual de un documento nuevo o de una descarga.Created;Modified;Removed;FileEvent: un archivo de vida corta (archivos temporales, datos provisionales de un instalador, un archivo creado y eliminado dentro del mismo volcado). El orden dentro del registro no se conserva.Renamed;FileEventdos veces, con el mismo node ID: un renombrado o un movimiento; el event ID más bajo suele corresponder a la ruta antigua. En 1SLD no hay node ID y el emparejamiento depende de que los IDs sean consecutivos.ExtendedAttrModifieden una descarga nueva: normalmente, el establecimiento de los atributos de cuarentena y de origen (where-from).ExtendedAttrRemoveden elementos extraídos o descargados: se eliminó un atributo. Quitarcom.apple.quarantinees un posible motivo (consulta atributo de cuarentena), pero muchas aplicaciones eliminan atributos de forma rutinaria.InodeMetaModen solitario: unchmod, untoucho un cambio de propietario; hacer ejecutable un helper descargado suele tener este aspecto.Mount;FolderEventenVolumes/NAME: un volumen conectado en ese punto de montaje. El propio.fseventsddel volumen registra después lo que se escribió en él.ItemCloned: un clon APFS, p. ej., un duplicado del Finder ocp -c. El clon y su origen comparten bloques de datos.
Las constantes de la API son distintas
Los FSEventStreamEventFlags documentados por Apple (kFSEventStreamEventFlagItemCreated = 0x100, …ItemIsFile = 0x10000, etc.) describen lo que recibe una aplicación en ejecución a través de la API de FSEvents. No coinciden con los bits que se escriben en .fseventsd, como señalan la investigación de Nicole Ibrahim y el código fuente de mac_apt. Un parser que aplique la tabla de la API a los archivos de log producirá nombres erróneos.
Cómo muestra los flags el parser
El FSEvents Parser muestra los flags de cambio como etiquetas, el tipo de elemento en su propia columna, y el valor bruto (p. ej., 0x00800011) junto con los nombres al estilo de FSEventsParser en el detalle del registro y en las exportaciones CSV. El filtro de cambios agrupa los bits en Created, Removed, Renamed, Modified/cloned, metadatos/atributos y mount/unmount.
Preguntas frecuentes
¿Los flags de los logs de FSEvents son los mismos que los de la API FSEventStream?
No. Los bits almacenados en los logs de .fseventsd difieren de las constantes públicas kFSEventStreamEventFlag de Apple. Utiliza una tabla elaborada para el formato en disco.
¿Qué significa ExtendedAttrRemoved?
Se eliminó un atributo extendido del elemento. FSEvents no indica cuál; la eliminación de com.apple.quarantine es solo una posibilidad entre muchas.