¿Cómo registro el sistema de archivos de lectura / escritura por nombre de archivo en Linux?

17

Estoy buscando un método simple que registre las operaciones del sistema de archivos. Debe mostrar el nombre del archivo al que se accede o se modifica.

Estoy familiarizado con powertop, y parece que esto funciona hasta cierto punto, en tanto que muestra los archivos de usuario en los que se escribieron. ¿Hay alguna otra utilidad que admita esta función?

Algunos de mis hallazgos:

powertop : mejor para el registro de acceso de escritura, pero más centrado en la actividad de la CPU
iotop : muestra el acceso al disco en tiempo real por proceso, pero no el nombre del archivo
lsof : muestra los archivos abiertos por proceso, pero no el
iostato de acceso a archivos en tiempo real : muestra el tiempo real I / O rendimiento de disco / matrices pero no indica archivo o proceso

cmcginty
fuente

Respuestas:

17

Hasta ahora iotopes la mejor solución general. El siguiente comando le proporciona una salida en tiempo real de todos los procesos que utilizan el disco.

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

Incluso usted notará que el proceso accederá al disco. La forma más sencilla de investigar es detener el proceso y comenzarlo de inmediato. Por ejemplo:

sudo strace -f nmbd -D

Esto le mostrará syscalls del acceso al sistema de archivos.

Otra opción es inotify (7) , donde muchas distribuciones proporcionan "herramientas de inotify" para que pueda ver una ruta a través de

inotifywait -r -mpath_you_want_to_watch

cmcginty
fuente
1
fanotifyes un nuevo marco de notificación del sistema de archivos en el kernel de Linux (agregado recientemente alrededor de 2012). Es posible que desee comprobar eso. Las herramientas y utilidades que lo usan todavía se están escribiendo, por lo que es posible que tenga que escribir uno usted mismo, pero es mucho más robusto que inotify, famin o cualquier otra cosa que haya visto hasta ahora.
Allquixotic
3
Una búsqueda rápida en Google para fanotify muestra una herramienta llamada fatracedesde aquí .
Thanh DK
¿Qué hay nmbden el stracecomando dado ?
dragosrsupercool
9

Otra opción es http://linux.die.net/man/7/inotify, donde muchas distribuciones proporcionan "herramientas de inotify" para que pueda ver una ruta a través de

inotifywait -r -m /<path you want to watch>
x29a
fuente
+1. «Inotifywait espera eficientemente los cambios en los archivos utilizando la interfaz inotify (7) de Linux. »Ayuda enormemente a la auditoría de grano fino al mostrar cualquier ACCESO y MODIFICAR <archivo> en la ruta monitoreada.
tuk0z
3

Recientemente me encontré con fatrace que usa fanotify . Funciona hermoso, así que pensé que compartiría. Registra todos los tipos de operaciones de archivo, incluidos abrir / crear / modificar en stdout u opcionalmente un archivo e incluso puede filtrar para obtener solo algunos tipos de operaciones. Por defecto, monitorea todos los montajes, excepto los virtuales. El propio autor lo explica bien aquí.

turbofan
fuente
2

Para iniciar sesión (en lugar de monitorear), debería considerar usar el demonio de auditoría de Linux introducido en el kernel 2.6.

RedGrittyBrick
fuente
No pude hacer que el observador PID funcione, así que no es muy útil si no sabes qué archivo mirar
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
fuente
55
¿podría actualizar su respuesta con algunos detalles sobre cómo usar este código y lo que logrará junto con los efectos secundarios y las limitaciones?
Jeremy W