Linux эквивалентен Mac OS X's fs_usage

3219
Khai

Есть ли в Linux эквивалент команды Mac OS X fs_usage? Согласно справочной странице, он выполняет следующее: «сообщает о системных вызовах и сбоях страниц, связанных с работой файловой системы, в режиме реального времени».

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

Вот пример вывода:

03:44:25 stat64 erences/ByHost/org.mozilla.firefox.69AC0B48-F675-5045-B873-A28B119C33E7.plist 0.000029 firefox  03:44:25 stat64 /Users/**********/Library/Preferences 0.000011 firefox  03:44:25 statfs64 /Users/**********/Library/Preferences 0.000004 firefox  03:44:25 open /Users/**********/Library/Preferences/org.mozilla.firefox.plist.lockfile 0.000090 firefox  03:44:25 stat64 /Users/**********/Library/Preferences/org.mozilla.firefox.plist 0.000004 firefox  03:44:25 stat64 /Users/**********/Library/Preferences 0.000002 firefox  03:44:25 open /Users/**********/Library/Preferences/org.mozilla.firefox.plist.vjLkANe 0.000100 firefox  

Есть идеи?

7

5 ответов на вопрос

4
Cristian Ciupitu

Вы можете использовать audctl для мониторинга системных вызовов, связанных с деятельностью файловой системы, например open, statили lstat. К сожалению, мониторинг readили writeкажется проблематичным.

auditctlутилита, помогающая контролировать систему аудита ядра Вам нужно быть пользователем root, чтобы использовать его. Он поддерживает различные фильтры, такие как:

devmajor Device Major Number  devminor Device Minor Number  dir Full Path of Directory to watch. This will place a recursive watch on the directory and its whole subtree. It can only be used on exit list. See "-w".  egid Effective Group ID. May be numeric or the groups name.  euid Effective User ID. May be numeric or the user account name.  filetype The target file's type. Can be either file, dir, socket, symlink, char, block, or fifo.  path Full Path of File to watch. It can only be used on exit list.  pid Process ID  ppid Parent's Process ID 

Пример (проверено на Fedora 16 x86_64)

Чтобы добавить правила аудита, запустите от имени пользователя root:

for syscall in open stat lstat read write; do auditctl -a exit,always -F arch=b64 -S $syscall \ -F euid=1000 \ -F dir=/tmp/superuser.com/questions/370070 done 

Чтобы удалить их позже, замените -aна -d:

for syscall in open stat lstat read write; do auditctl -d exit,always -F arch=b64 -S $syscall \ -F euid=1000 \ -F dir=/tmp/superuser.com/questions/370070 done 

После добавления правил сделайте что-нибудь в этом каталоге как пользователь с UID 1000:

cd /tmp/superuser.com/questions/370070 echo foo > bar cat bar stat bar 

ausearch --start 00:00:00 --uid-effective 1000вернет следующее (журнал есть /var/log/audit/audit.log):

time->Thu Jun 14 00:02:32 2012 type=PATH msg=audit(1339621352.871:18529): item=0 name="/tmp/superuser.com/questions/370070" inode=178 dev=fd:03 mode=040775 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=CWD msg=audit(1339621352.871:18529): cwd="/home/ciupicri" type=SYSCALL msg=audit(1339621352.871:18529): arch=c000003e syscall=4 success=yes exit=0 a0=139bbf0 a1=7fff32d832d0 a2=7fff32d832d0 a3=24 items=1 ppid=2249 pid=3446 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=1 comm="bash" exe="/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) [root@hermes ~]# ausearch --start 00:00:00 --uid-effective 1000 ---- time->Thu Jun 14 00:02:32 2012 type=PATH msg=audit(1339621352.871:18529): item=0 name="/tmp/superuser.com/questions/370070" inode=178 dev=fd:03 mode=040775 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=CWD msg=audit(1339621352.871:18529): cwd="/home/ciupicri" type=SYSCALL msg=audit(1339621352.871:18529): arch=c000003e syscall=4 success=yes exit=0 a0=139bbf0 a1=7fff32d832d0 a2=7fff32d832d0 a3=24 items=1 ppid=2249 pid=3446 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=1 comm="bash" exe="/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) ---- time->Thu Jun 14 00:02:47 2012 type=PATH msg=audit(1339621367.175:18531): item=0 name="bar" inode=218 dev=fd:03 mode=0100664 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=CWD msg=audit(1339621367.175:18531): cwd="/tmp/superuser.com/questions/370070" type=SYSCALL msg=audit(1339621367.175:18531): arch=c000003e syscall=2 success=yes exit=3 a0=7fff5ed6b37f a1=0 a2=0 a3=7fff5ed69460 items=1 ppid=3446 pid=4735 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) ---- time->Thu Jun 14 00:02:47 2012 type=PATH msg=audit(1339621367.172:18530): item=1 name="bar" inode=218 dev=fd:03 mode=0100664 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=PATH msg=audit(1339621367.172:18530): item=0 name="/tmp/superuser.com/questions/370070" inode=178 dev=fd:03 mode=040775 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=CWD msg=audit(1339621367.172:18530): cwd="/tmp/superuser.com/questions/370070" type=SYSCALL msg=audit(1339621367.172:18530): arch=c000003e syscall=2 success=yes exit=3 a0=1665500 a1=241 a2=1b6 a3=4 items=2 ppid=2249 pid=3446 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=1 comm="bash" exe="/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) ---- time->Thu Jun 14 00:02:47 2012 type=PATH msg=audit(1339621367.971:18532): item=0 name="bar" inode=218 dev=fd:03 mode=0100664 ouid=1000 ogid=1000 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0 type=CWD msg=audit(1339621367.971:18532): cwd="/tmp/superuser.com/questions/370070" type=SYSCALL msg=audit(1339621367.971:18532): arch=c000003e syscall=6 success=yes exit=0 a0=7fffdc713375 a1=7fffdc711580 a2=7fffdc711580 a3=7fffdc7112f0 items=1 ppid=3446 pid=4736 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts6 ses=1 comm="stat" exe="/usr/bin/stat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) 

Номера системных вызовов можно найти в /usr/include/asm/unistd_64.h.

Я присудил награду за этот вопрос, потому что он наиболее близок к тому, что я действительно искал ... Похоже, что нет никакого решения для точного вопроса, который я задал, поэтому я не буду отмечать ни один из ответов (пока что ) как принято. Khai 12 лет назад 0
3
lornix

Да, да, я знаю ... старая тема ...

Но все же ... Исходный код Apple для fs_usage доступен онлайн, вполне возможно скомпилировать его самостоятельно. Конечно, есть некоторые предостережения ...

Он основан на системных вызовах Apple OS X netbsd, поэтому потребуется некоторое (ха!) Редактирование ...

Даже поставляется с бесплатным Makefile (приправленный netbsd, увы).

Но если вы позвоните в течение следующих 10 минут, они даже добавят справочную страницу, пригодную для использования ... все бесплатно!

Я слишком много смотрел рекламные ролики поздним вечером.

Исходный код Apple fs_usage

(Нет возврата, батареи не включены, не возвращаются в магазин, требуется некоторая сборка)

(и, посмотрев код и увидев ваш пример, я уверен, что можно было бы создать что-то, чтобы выполнить «подмножество» функций fs_usage довольно быстро ... позвольте мне возиться ...)

У меня есть рабочая программа, начинающая выглядеть похожей на то, что вы ищете, мне нужно еще немного поработать над ней, чтобы приблизиться, но вы все можете попробовать.

Репозиторий Bitbucket Hg - fs_usage

Этот вопрос о Linux-эквиваленте, и вы отвечаете с помощью решения NetBSD? Я не понимаю ... Разве ядра не сильно отличаются? Большая часть или все fs_usage - это dtrace afaik, и в любом случае они доступны для bsd. Daniel Beck 12 лет назад 0
Нет, я ответил, что источник доступен. Я знаю, что они разные, вот почему я сам пытаюсь найти решение. Но тот факт, что источник доступен, очень полезен. Да, ядра разные, но не так сложно подобрать функции и процедуры. У меня есть частичная программа, которая делает некоторые функции оригинала уже. Не сложнее, чем адаптировать программу из Windows в Linux или наоборот. По совпадению, я работал над некоторыми проектами в том же духе, поэтому я разработал мозоль от удара головой об этом наборе проблем. :) lornix 12 лет назад 0
@lornix Как далеко вы продвинулись с этим? Я заметил, что вы удалили репо некоторое время назад. :( Alistair McMillan 9 лет назад 0
Ну ... fs_usage использует целый ряд API-интерфейсов ядра, которые ядро ​​Linux не предлагает, насколько я могу судить. Кроме того, это вопрос пользователя, а не вопрос программиста, поэтому, если вы не можете предоставить работающее решение, будет нечестно сказать «да, вы можете получить его, если напишите его сами», не так ли? SuperTempel 9 лет назад 0
3
Jeremy W

Iowatch может быть возможность.


чтобы посмотреть активность в / etc вы бы запустили

$ iwatch / etc

Характеристики

  • командная строка и режим демона
  • XML-файл конфигурации
  • возможность рекурсивного просмотра каталога и просмотра новых созданных каталогов
  • можно указать список исключений
  • Можно использовать регулярное выражение для сравнения имени файла / каталога
  • может выполнить команду, если происходит событие
  • отправить письмо
  • системный журнал
  • печать меток времени

События доступны

 access : file was modified modify : file was modified attrib : file attributes changed close_write : file closed, after being opened in writeable mode close_nowrite : file closed, after being opened in read-only mode close : file closed, regardless of read/write mode open : file was opened moved_from : File was moved away from. moved_to : File was moved to. move : a file/dir within watched directory was moved create : a file was created within watched director delete : a file was deleted within watched directory delete_self : the watched file was deleted unmount : file system on which watched file exists was unmounted q_overflow : Event queued overflowed ignored : File was ignored isdir : event occurred against dir oneshot : only send event once 
1
PenguinCoder

Два ближайших варианта, которые я вижу (встроенные), будут iostatи inotify. iostat просто покажет статистику ввода / вывода для устройства или раздела в системе. Inotify - системный наблюдатель за файлом, который вы можете подключить с помощью скрипта, чтобы предупредить вас об изменениях файла. Вы должны написать свой собственный код события, чтобы он прослушивал чтение / запись файла, а затем что делать с этим сигналом.

Из ссылки / справочной страницы:

Inotify может использоваться для мониторинга отдельных файлов или для мониторинга каталогов. При мониторинге каталога inotify будет возвращать события как для самого каталога, так и для файлов внутри каталога.

Лично я написал бы Python или bash-скрипт для запуска inotify, когда мне нужно было следить за изменениями, и отключал его, когда он не нужен.

К сожалению: * Inotify мониторинг каталогов не является рекурсивным: для мониторинга подкаталогов в каталоге необходимо создать дополнительные наблюдения. Это может занять значительное время для больших деревьев каталогов. * Daniel Beck 12 лет назад 0
0
Feczo

Установите sysstat и используйте команду

sar -B 1 
Извините за поздний комментарий, но это не совсем то, что делает fs_usage ... Я отредактирую вопрос, чтобы включить пример вывода из fs_usage. sar только дает мне некоторые метрики использования файловой системы ... Я хотел бы видеть все системные вызовы и файл, который они сделали на этом. Khai 12 лет назад 0

Похожие вопросы