Jak zalogować system plików do odczytu / zapisu według nazwy pliku w systemie Linux?

17

Szukam prostej metody, która będzie rejestrować operacje systemu plików. Powinien wyświetlać nazwę pliku, do którego uzyskiwany jest dostęp lub który jest modyfikowany.

Znam powertop i wygląda na to, że działa do tego stopnia, że ​​pokazuje pliki użytkownika, do których zostały zapisane. Czy istnieją inne narzędzia obsługujące tę funkcję?

Niektóre z moich ustaleń:

powertop : najlepszy do rejestrowania dostępu do zapisu, ale bardziej skupiony na aktywności procesora
iotop : pokazuje dostęp do dysku w czasie rzeczywistym według procesu, ale nie nazwa pliku
lsof : pokazuje otwarte pliki na proces, ale nie dostęp do pliku w czasie rzeczywistym
iostat : pokazuje czas rzeczywisty I Wydajność / O dysku / macierzy, ale nie wskazuje pliku lub procesu

cmcginty
źródło

Odpowiedzi:

17

Jak dotąd iotopnajlepsze ogólne rozwiązanie. Poniższe polecenie zapewnia dane wyjściowe wszystkich procesów korzystających z dysku w czasie rzeczywistym.

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

Nawet zauważysz, że proces będzie uzyskiwał dostęp do dysku. Prostym sposobem na zbadanie jest zatrzymanie procesu i rozpoczęcie go od strace. Na przykład:

sudo strace -f nmbd -D

Spowoduje to wyświetlenie wywołań systemowych dostępu do systemu plików.

Inną opcją jest inotify (7) , w której wiele dystrybucji udostępnia „narzędzia inotify”, dzięki czemu można oglądać ścieżkę za pośrednictwem

inotifywait -r -mpath_you_want_to_watch

cmcginty
źródło
1
fanotifyto nowa struktura powiadomień systemu plików w jądrze Linuksa (ostatnio dodana około 2012 roku). Możesz to sprawdzić. Narzędzia i narzędzia, które z niego korzystają, wciąż są pisane, więc być może będziesz musiał napisać je samodzielnie, ale jest ono o wiele bardziej niezawodne niż niedoinformowanie, niesmaczenie lub cokolwiek innego, co do tej pory widziałeś.
allquixotic
3
Szybkie wyszukiwanie Google dla fanotify pokazuje narzędzie o nazwie fatraceod tutaj .
Thanh DK
Co zawiera nmbdpodane stracepolecenie?
dragosrsupercool,
9

Inną opcją jest http://linux.die.net/man/7/inotify, gdzie wiele dystrybucji udostępnia „narzędzia inotify”, dzięki czemu można obserwować ścieżkę za pośrednictwem

inotifywait -r -m /<path you want to watch>
x29a
źródło
+1. «Inotifywait wydajnie czeka na zmiany w plikach za pomocą interfejsu inotify (7) Linuksa. »Bardzo pomaga w szczegółowym audycie, pokazując dowolny DOSTĘP i MODYFIKUJ <plik> na monitorowanej ścieżce.
tuk0z
3

Ostatnio natknąłem się na fatrace, które wykorzystuje fanotify . Działa pięknie, więc pomyślałem, że podzielę się. Rejestruje wszystkie typy operacji na plikach, w tym otwieranie / tworzenie / modyfikowanie do standardowego lub opcjonalnie pliku, a nawet można filtrować, aby uzyskać tylko niektóre rodzaje operacji. Domyślnie monitoruje wszystkie montowania oprócz wirtualnych. Sam autor dobrze to tutaj wyjaśnia.

turbofan
źródło
2

Do rejestrowania (zamiast monitorowania) należy rozważyć użycie demona kontroli systemu Linux wprowadzonego w jądrze 2.6.

RedGrittyBrick
źródło
Nie mogłem uruchomić obserwatora PID, więc nie jest to bardzo przydatne, jeśli nie wiesz, jaki plik oglądać
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
źródło
5
czy mógłbyś zaktualizować swoją odpowiedź o kilka szczegółów na temat korzystania z tego kodu i co on osiągnie wraz z efektami ubocznymi i ograniczeniami?
Jeremy W