Comment journaliser le système de fichiers en lecture / écriture par nom de fichier sous Linux?

17

Je recherche une méthode simple qui enregistrera les opérations du système de fichiers. Il doit afficher le nom du fichier consulté ou modifié.

Je connais powertop, et il semble que cela fonctionne dans une certaine mesure, dans la mesure où il montre les fichiers utilisateur qui ont été écrits. Existe-t-il d'autres utilitaires qui prennent en charge cette fonctionnalité?

Certaines de mes conclusions:

powertop : idéal pour la journalisation des accès en écriture, mais plus axé sur l'activité du processeur
iotop : affiche l'accès au disque en temps réel par processus, mais pas le nom du fichier
lsof : affiche les fichiers ouverts par processus, mais pas l'accès aux fichiers en temps réel
iostat : affiche le temps réel I / O performances du disque / des tableaux mais n'indique pas le fichier ou le processus

cmcginty
la source

Réponses:

17

Jusqu'à présent, iotopc'est la meilleure solution globale. La commande suivante vous donne une sortie en temps réel de tous les processus utilisant le disque.

iotop -bktoqqq -d .5

where: -b     is batch mode
       -k     is kilobytes/s
       -t     adds timestamp
       -o     only show processes or threads actually doing I/O
       -qqq   removes output headers
       -d .5  updates every .5 seconds

Même vous remarquerez que le processus accédera au disque. Le moyen le plus simple d'enquêter est d'arrêter le processus et de le démarrer avec strace. Par exemple:

sudo strace -f nmbd -D

Cela vous montrera les appels système de l'accès au système de fichiers.

Une autre option est inotify (7) , où de nombreuses distributions fournissent des "outils inotify" afin que vous puissiez regarder un chemin via

inotifywait -r -mpath_you_want_to_watch

cmcginty
la source
1
fanotifyest un nouveau cadre de notification de système de fichiers dans le noyau Linux (récemment ajouté vers 2012). Vous voudrez peut-être vérifier cela. Les outils et les utilitaires qui l'utilisent sont toujours en cours d'écriture, vous devrez donc peut-être en écrire un vous-même, mais il est beaucoup plus robuste que inotify, famin ou tout ce que vous avez pu voir jusqu'à présent.
allquixotic
3
Une recherche rapide sur Google pour fanotify montre un outil appelé fatraced' ici .
Thanh DK
Que nmbdcontient la stracecommande donnée ?
dragosrsupercool
9

Une autre option est http://linux.die.net/man/7/inotify où de nombreuses distributions fournissent des "outils inotify" afin que vous puissiez regarder un chemin via

inotifywait -r -m /<path you want to watch>
x29a
la source
+1. «Inotifywait attend efficacement les modifications des fichiers à l'aide de l'interface inotify (7) de Linux. »Aide grandement à l'audit à grain fin en affichant tout ACCÈS et MODIFIER <fichier> dans le chemin surveillé.
tuk0z
3

J'ai récemment rencontré fatrace qui utilise fanotify . Fonctionne très bien alors j'ai pensé que je partagerais. Il enregistre tous les types d'opérations sur les fichiers, y compris ouvrir / créer / modifier sur stdout ou éventuellement un fichier et vous pouvez même filtrer pour n'obtenir que certains types d'opérations. Par défaut, il surveille tous les montages à l'exception des montages virtuels. L'auteur lui-même l'explique bien ici.

turboréacteur
la source
2

Pour la journalisation (plutôt que la surveillance), vous devriez envisager d'utiliser le démon d'audit Linux introduit dans le noyau 2.6.

RedGrittyBrick
la source
Je n'ai pas pu faire fonctionner l'observateur PID, donc pas très utile si vous ne savez pas quel fichier regarder
cmcginty
-3
#!/usr/bin/perl
use Cwd;
use File::Touch;
use File::Temp qw/tempfile/;
use Time::HiRes qw/sleep time alarm/;
use Term::ReadKey;
my ($wchar, $hchar, $wpixels, $hpixels) = GetTerminalSize();
if($hchar < 10) {print "please increase window size"; exit; }
my $mydir = getcwd;
my  ($fh, $tmpfile) = tempfile(UNLINK => 1);

while(1)
   {
   my $starttime = time;
   eval {
        local $SIG{ALRM} = sub { die "alarm\n" };
        alarm 0.4;
        $query = `find -neweraa $tmpfile 2>&1`; #change to mm for writes only
        touch($tmpfile);
        @files = split(/\n/,$query);
        alarm 0;
        };
   system('clear');
   foreach $file(@files) { $filecount{$file}++; }
   @sorted = sort {$filecount{$b} <=> $filecount{$a}} (keys %filecount);
   for ($x = 0;$x < $hchar-2; $x++) {print $filecount{$sorted[$x]}."\t".$sorted[$x]."\n";}
   my $endtime = time;
   my $length = ($endtime-$starttime);
   if ($length > 0.3) {print "program not designed for large trees, please use smaller tree.\n"; exit;}
   print "\n$length"."s\n"
   }
Jon
la source
5
pourriez-vous s'il vous plaît mettre à jour votre réponse avec quelques détails sur la façon d'utiliser ce code et ce qu'il va accomplir avec les effets secondaires et les limitations?
Jeremy W