Я хотел бы проследить пишет на конкретный файл, поэтому я пришла в голову идея, что я мог бы сделать это: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.
Большое спасибо за это. Фактически сегодня я пришел к тому же выводу, который должен фильтровать по номеру inode в методе 'vfs_write' и, похоже, работает. Как вы уже упоминали, он не охватывает случай, когда этот файл удаляется и воссоздается, но это нормально, мне это не нужно. –
Вы не должны фильтровать по номеру inode, а указатель на индексный дескриптор. В противном случае вы рискуете путаницей с потоками, записывающими материал в отдельную файловую систему. –
Хорошо, это имеет смысл. Но в таком случае, как я даже знаю адрес памяти этого 'struct inode', который мне нужно будет фильтровать? Должен ли я сначала настроить другой kprobe для вывода адреса этой структуры, а затем я мог бы фильтровать его? Не изменяется ли адрес памяти 'struct inode'? –