Отслеживание, сохранение и возврат изменений файловой системы, выполненных программой под Linux

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

РЕДАКТИРОВАТЬ: Это касается неупакованной программы. Я использую apt-get настолько далеко, насколько могу.

В идеале я хотел бы иметь возможность сделать что-то вроде:

(sudo) catch-modifs some-installer.bin > fsmodifs.patch

А потом:

(sudo) revert-modifs fsmodifs.patch

Есть ли удобный способ сделать это?

6 ответов

Решение

Возможно, самый простой (?) Способ сделать это - загрузить LiveUSB с "постоянным разделом данных". (Или, чтобы воспроизвести эффект самостоятельно, в изолированной тюрьме: смонтируйте слой rw поверх слоя ro.) Сделайте снимок файловой системы rw - которая должна быть очень тонкой после новой загрузки - затем запустите программу установки. Каждый файл, который он изменяет или создает, будет находиться на оверлейном разделе "постоянные данные". Даже удаленные файлы будут отображаться как "волшебные точечные файлы".

Может быть, взглянуть на tripwire? Tripwire более пассивен, чем ваш активный пример, но все же может работать на вас.

http://www.linuxjournal.com/article/8758

Tripwire - это система обнаружения вторжений (IDS), которая постоянно и автоматически держит под контролем ваши критические системные файлы и отчеты, если они были уничтожены или изменены взломщиком (или по ошибке). Это позволяет системному администратору сразу узнать, что было взломано, и исправить это.

Использование LD_PRELOAD загрузить библиотеку, которая перехватывает open Функция библиотеки и изменяет путь / регистрирует вывод / делает резервную копию перед открытием файла.

Посмотрите на исходный код strace,

Самый простой способ достичь желаемого: установить "ненадежное" приложение в совершенно новый экземпляр виртуальной машины (рабочая станция VMWare, Oracle VirtualBox и т. Д.).

Когда вы решите, что вам больше не нужно приложение, удалите виртуальную машину.

Другие ваши альтернативы - перехват системных обращений к файлу - скорее всего будут подвержены ошибкам и неполны. Будьте особенно осторожны с любым решением, для работы которого требуется динамическое связывание (как, по-видимому, делает Installwatch). Установщик может вполне законно выполнять прямые системные вызовы или быть статически связанным.

Если установщик использует какой-либо упаковочный объект (т.е. для .deb пакеты для Debian/Ubuntu/..., .rpm пакеты для RedHat/CentOS/... и т. д.), тогда установщик пакета должен знать, что делать при установке и удалении. И я считаю, что вы должны использовать существующие упаковочные системы, а не изобретать свою собственную. (Обычно в Linux нет инсталляторов, как в Windows).

Если вы действительно хотите следить за изменениями файлов, внесенными каким-либо процессом, вы можете использовать strace, или же ltrace ловить системные вызовы. Вы также можете inotify и связанных объектов.

Но я не знаю о catch-modifs & revert-modifs Как ты хочешь.

Я предлагаю не делать установщик для вашего приложения, а использовать менеджер пакетов, следовательно, чтобы обеспечить .deb (И / или .rpm) пакеты для вашего приложения. Они будут обрабатывать проблемы зависимости лучше, чем ваш собственный установщик.

Другие вопросы по тегам