2016-01-27 2 views
0

Я хотел бы проследить пишет на конкретный файл, поэтому я пришла в голову идея, что я мог бы сделать это:KProbe: ассоциированный обратный датчик с зондом ввода

я создаю зонд на do_sys_open, если filename аргумент соответствует шаблону, который я ищу. Я использую триггер для включения зонда возврата, который извлекает возвращаемый идентификатор дескриптора файла (это $retval). Этот датчик возврата будет иметь фильтр на common_pid, потому что меня интересуют только fd s, возвращенные do_sys_open звонки, которые только что открыли filename Я хочу контролировать. Обратный зонд принимает fd и включает другой датчик на sys_write с фильтром на common_pid и fd. Я надеюсь, что таким образом я смогу отслеживать только write операций над одним файлом, который я контролирую.

Проблема в том, что это не работает с многопоточными процессами. Если один процесс вызывает open дважды в одно и то же время (используя два потока), описанный выше механизм может выйти из строя. Теперь я пытаюсь выяснить способ сделать эту связь между входом do_sys_open и обратным зондом на do_sys_open, и я был бы рад любым предложениям.

PS: Я не уверен, что этот вопрос относится к stackoverflow или unix & linux.

ответ

0

Ваш подход неправильный.

Прежде всего число дескрипторов файлов находятся в процесс, так что вы автомагически поймать практически любой писать что-либо с использованием такого количества Fd, который может или не может привести к записи в файл вы заинтересованы.

Далее , sys_write слишком высок в стеке, чтобы поймать всех законных авторов.

Обычно вы просматриваете индексный файл интересующего вас файла и фильтруете его на основе соответствующей функции записи.

Однако «мониторинг записи в файл» по-прежнему несколько неоднозначен, так как неясно, что бы вам хотелось, если кто-то должен был отменить первоначальное имя и создать новый файл с этим именем. Если вы хотите иметь дело с этим, вам действительно будет лучше, если вы поймаете нити где-нибудь в открытом доступе, посмотрев, какой индод был поднят, и добавив их в свои примитивы, чтобы вы знали, что хотите его контролировать.

В любом случае, мониторинг на основе fd принципиально нарушен.

+0

Большое спасибо за это. Фактически сегодня я пришел к тому же выводу, который должен фильтровать по номеру inode в методе 'vfs_write' и, похоже, работает. Как вы уже упоминали, он не охватывает случай, когда этот файл удаляется и воссоздается, но это нормально, мне это не нужно. –

+1

Вы не должны фильтровать по номеру inode, а указатель на индексный дескриптор. В противном случае вы рискуете путаницей с потоками, записывающими материал в отдельную файловую систему. –

+0

Хорошо, это имеет смысл. Но в таком случае, как я даже знаю адрес памяти этого 'struct inode', который мне нужно будет фильтровать? Должен ли я сначала настроить другой kprobe для вывода адреса этой структуры, а затем я мог бы фильтровать его? Не изменяется ли адрес памяти 'struct inode'? –

Смежные вопросы