Como faço para registrar / ler o sistema de arquivos por nome de arquivo no Linux?

17

Estou procurando um método simples que registre as operações do sistema de arquivos. Ele deve exibir o nome do arquivo que está sendo acessado ou modificado.

Eu estou familiarizado com o powertop, e parece que isso funciona até certo ponto, tanto que mostra os arquivos do usuário que foram gravados. Existem outros utilitários que suportam esse recurso.

Algumas das minhas descobertas:

powertop : melhor para o log de acesso de gravação, mas mais focado na atividade da CPU
iotop : mostra o acesso ao disco em tempo real por processo, mas não o nome do arquivo
lsof : mostra os arquivos abertos por processo, mas não o acesso ao arquivo em tempo real
iostat : mostra o tempo real / O desempenho do disco / matrizes, mas não indica arquivo ou processo

cmcginty
fonte

Respostas:

17

Até agora iotopé a melhor solução geral. O comando a seguir fornece uma saída em tempo real de todos os processos usando o 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

Mesmo assim, você notará que o processo estará acessando o disco. A maneira mais simples de investigar é interromper o processo e iniciá-lo com strace. Por exemplo:

sudo strace -f nmbd -D

Isso mostrará os syscalls do acesso ao sistema de arquivos.

Outra opção é inotify (7) , onde muitas distribuições fornecem "ferramentas inotify" para que você possa observar um caminho via

inotifywait -r -mpath_you_want_to_watch

cmcginty
fonte
11
fanotifyé uma nova estrutura de notificação do sistema de arquivos no kernel do Linux (adicionada recentemente por volta de 2012). Você pode verificar isso. As ferramentas e utilitários que o utilizam ainda estão sendo gravados, portanto você pode ter que escrever um, mas é muito mais robusto do que inotificar, famin ou qualquer outra coisa que você já tenha visto até agora.
allquixotic
3
Uma busca no Google rápida para shows fanotify uma ferramenta chamada fatracea partir daqui .
Thanh DK
O que está nmbdno stracecomando fornecido ?
dragosrsupercool
9

Outra opção é http://linux.die.net/man/7/inotify, onde muitas distribuições fornecem "inotify-tools" para que você possa observar um caminho via

inotifywait -r -m /<path you want to watch>
x29a
fonte
+1. «Inotifywait aguarda eficientemente alterações nos arquivos usando a interface inotify (7) do Linux. »Ajuda muito na auditoria de detalhes, exibindo ACCESS e MODIFY <file> no caminho monitorado.
tuk0z
3

Recentemente me deparei com o fatrace, que usa o fanotify . Funciona bonito, então eu pensei em compartilhar. Ele registra todos os tipos de operações de arquivo, incluindo abrir / criar / modificar para stdout ou, opcionalmente, um arquivo e você pode até filtrar para obter apenas alguns tipos de operações. Por padrão, ele monitora todas as montagens, exceto as virtuais. O próprio autor explica bem aqui.

turbofan
fonte
2

Para registro (em vez de monitoramento), você deve considerar o uso do daemon de auditoria Linux, introduzido no kernel 2.6.

RedGrittyBrick
fonte
Não consegui que o observador do PID funcionasse, por isso não é muito útil se você não souber qual arquivo assistir
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
fonte
5
você poderia atualizar sua resposta com alguns detalhes sobre como usar esse código e o que ele fará com os efeitos colaterais e limitações?
Jeremy W