Есть несколько способов решения этой проблемы.
поиск пакетов
Если подозревается, что пакет вызвал какие-то изменения, проверьте пакеты, чтобы узнать, принадлежат ли они данному файлу; RPM содержит %files
раздел, который подробно описывает, для каких файлов данный пакет является официальным. Это можно запросить с помощью rpm -ql
. Например, грубая сила, чтобы найти, какой пакет (если есть), /etc/passwd
может выглядеть так:
$ rpm -qa | while read p; do rpm -ql $p | grep -q /etc/passwd && echo $p; done setup-2.8.71-9.el7.noarch
Однако этот метод не найдет файлы, которые были косвенно изменены пакетом; RPM содержит сценарии, которые могут выполнять произвольные действия (или вызывать произвольные другие биты кода, которые выполняют поиск изменений). Эти сценарии могут быть перечислены с rpm -q --scripts
последующим проверкой кода. Это может помочь ограничить поиск только теми пакетами, которые были недавно установлены (проверьте журналы, для каких это пакетов), так как может быть много кода для просмотра.
отладка ядра
Ядро linux предлагает различные средства отладки, основанные на ядре, которые могут быть проинструктированы, чтобы сказать вам, если что-то касается данного файла. С помощью этого метода соответствующего кода SystemTap
или sysdig
или что бы настроить, а затем будет ждать, что сказать вам, что процесс изменил файл. Например, sysdig
если что-то изменяет интересующий вас каталог:
# sysdig "fd.directory contains /var/lib/php"
должен показывать подробности (которые можно настроить с помощью -p
флага) о системных вызовах, связанных с этим каталогом. Эту команду нужно будет где-то запустить, возможно, в tmux
сеансе или в виде пользовательской службы, чтобы она запускалась автоматически до тех пор, пока не будет найден нарушающий код. (Также вам может понадобиться ограничить вывод отладочной информации, поскольку отладка ядра может привести к обильному объему информации, если поиск слишком широк и команда остается запущенной в течение длительных периодов времени.)