Как мне записать чтение / запись файловой системы по имени файла в Linux?

17

Я ищу простой метод, который будет регистрировать операции файловой системы. Он должен отображать имя файла, к которому осуществляется доступ или который был изменен.

Я знаком с powertop, и кажется, что он работает до такой степени, что показывает пользовательские файлы, в которые были записаны. Есть ли другие утилиты, которые поддерживают эту функцию.

Некоторые из моих выводов:

powertop : лучше всего подходит для ведения журнала доступа к записи, но больше внимания уделяется активности процессора.
iotop : показывает доступ к диску в реальном времени по процессам, но не имя файла.
lsof : показывает открытые файлы для процесса, но не доступ к файлам в реальном времени.
iostat : показывает реальное время. / O производительность диска / массивов, но не указывает на файл или процесс

cmcginty
источник

Ответы:

17

Пока что iotopэто лучшее общее решение. Следующая команда дает в режиме реального времени вывод всех процессов, использующих диск.

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

Даже если вы заметите, что процесс будет обращаться к диску. Простой способ исследовать это остановить процесс и запустить его с помощью strace. Например:

sudo strace -f nmbd -D

Это покажет вам системные вызовы доступа к файловой системе.

Другой вариант - inotify (7) , где многие дистрибутивы предоставляют «инструменты inotify», так что вы можете наблюдать путь через

inotifywait -r -mpath_you_want_to_watch

cmcginty
источник
1
fanotifyэто новая структура уведомлений файловой системы в ядре Linux (недавно добавленная в 2012 году). Вы можете проверить это. Инструменты и утилиты, которые его используют, все еще пишутся, так что вам, возможно, придется написать его самостоятельно, но это гораздо надежнее, чем inotify, famin или что-то еще, что вы могли видеть до сих пор.
allquixotic
3
Быстрый поиск Google для fanotify показывает инструмент под названием fatraceиз здесь .
Thanh DK
Что находится nmbdв данной straceкоманде?
dragosrsupercool
9

Другой вариант - http://linux.die.net/man/7/inotify, где многие дистрибутивы предоставляют «инструменты inotify», так что вы можете посмотреть путь через

inotifywait -r -m /<path you want to watch>
x29a
источник
+1. «Inotifywait эффективно ожидает изменений в файлах с помощью интерфейса Linux inotify (7). »В значительной степени помогает детализированному аудиту, демонстрируя любой доступ и изменение <file> в отслеживаемом пути.
tuk0z
3

Недавно я натолкнулся на fatrace, который использует fanotify . Работает красиво, поэтому я решил поделиться. Он регистрирует все типы файловых операций, включая открытие / создание / изменение в стандартный вывод или, необязательно, файл, и вы даже можете фильтровать, чтобы получить только некоторые типы операций. По умолчанию он контролирует все монтирования, кроме виртуальных. Сам автор хорошо объясняет это здесь.

турбовентиляторный
источник
2

Для ведения журнала (а не мониторинга) вы должны рассмотреть возможность использования демона аудита Linux, представленного в ядре 2.6.

RedGrittyBrick
источник
Я не смог заставить работать PID-наблюдатель, поэтому не очень полезен, если вы не знаете, какой файл смотреть
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"
   }
Джон
источник
5
Не могли бы вы обновить свой ответ некоторыми подробностями о том, как использовать этот код и что он будет достигать наряду с побочными эффектами и ограничениями?
Джереми W