7

Есть ли в 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   

Есть идеи?

5 ответов5

4

Вы можете использовать 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 .

3

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

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

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

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

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

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

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

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

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

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

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

3

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

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

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

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

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

0

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

sar -B 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .