2017-05-04 2 views
1

Je teste Inotify sur ext4 pas ubuntu 14.04 et lors de l'exécution de copie ou création je reçois les mêmes événements Inotify suivants:détecter une opération de copie avec Inotify

fichier cp newFile

IN_CREATE newFile
IN_MODIFY newfile
IN_CLOSE newfile

echo "foo" >> newfile

IN_CREATE newfile
IN_MODIFY newfile
IN_CLOSE newfile

Est-il possible de distinguer ces deux situations? Je voudrais avoir des informations qu'une copie a été effectuée et quel était le fichier source et le fichier de destination. S'il n'y a aucune possibilité de le faire par Inotify, cela peut-il être fait autrement?

Nous vous remercions de votre aide.

Répondre

1

Il n'y a pas de "copie" dans Unix. Même les syscalls les plus avancés pour la copie de fichiers (sendfile et copy_file_range) se résument à dupliquer des données entre deux fichiers indépendants, en utilisant un tampon intermédiaire. Mais vous pouvez utiliser des devinettes pour identifier les copies de fichiers avec un degré décent de certitude.

On suppose que

  1. Deux fichiers sont ouverts: A et B (sans ordre particulier)
  2. A est lu à partir (IN_ACCESS)
  3. B est écrit (IN_MODIFY)
  4. A et B sont fermés
  5. A était ouvert pour la lecture (identifié par IN_CLOSE_NOWRITE)
  6. B était ouvert pour l'écriture (identifié par IN_CLOSE_WRITE)
  7. A et B et ont la même taille de données (stat.st_size) après

Notez que la séquence ci-dessus est juste heuristique commune, pas de règle stricte. Il peut y avoir d'autres événements dont l'ordre n'est pas si évident (par exemple, tronquer ou ignorer le fichier cible-IN_MODIFY-avant l'ouverture du fichier source). Le processus de copie peut dissocier le fichier cible existant et créer un nouveau fichier spécifiquement pour la copie, dans ce cas, ce nouveau fichier doit être en temps opportun soumis à l'observation avec inotify (!!). Vous risquez de manquer certains (ou tous) événements en raison des courses par abonnement, qui sont totalement indétectables par conception.

Vous risquez également de manquer des événements en raison des dépassements de file d'attente inotify (IN_Q_OVERFLOW).

Inotify ne peut pas détecter les actions en mémoire sur les fichiers mmap-ed et mmap est souvent utilisé pour la copie de fichiers. Donc, des étapes entières 2 et 3 pourraient être manquantes.Vous n'avez pas spécifié de système de fichiers cible (et pensez ou non utiliser inotify dans un environnement non contrôlé), mais attention, certains systèmes de fichiers ne supportent pas inotify (les systèmes de fichiers FUSE et réseau ont tendance à être particulièrement problématiques). Cela peut dépendre de la spécificité du système de fichiers et de la version du noyau dans le cas de FUSE. La création de liens physiques n'est pas strictement qualifiée de copie, mais elle peut aboutir à des modèles post-mortem ressemblant à cette situation (deux fichiers de même taille et de même contenu apparent), votre application devrait donc être mieux protégée. Pour des raisons ci-dessus, identifier des copies avec inotify est trop de corvée, sauf si vous attendez un retour sur investissement significatif. Vous devriez commencer par identifier les copies, en utilisant une analyse statique (parce que vous aurez parfois recours à inotify).

+0

Merci d'avoir répondu. C'est très utile. –