Я хотел бы иметь возможность при запуске такой программы, как установщик, отслеживать список изменений, внесенных в мою файловую систему, чтобы потом я мог отменить их.
РЕДАКТИРОВАТЬ: Это касается неупакованный программа. Я использую apt-get, насколько могу.
В идеале я бы хотел сделать что-то вроде:
(sudo) catch-modifs some-installer.bin > fsmodifs.patch
А потом:
(sudo) revert-modifs fsmodifs.patch
Есть ли удобный способ сделать это?
Может взглянуть на tripwire? Tripwire более пассивен, чем ваш активный пример, но он все равно может работать для вас.
http://www.linuxjournal.com/article/8758
Tripwire - это система обнаружения вторжений (IDS), которая постоянно и автоматически держит под контролем важные системные файлы и отчеты, если они были уничтожены или изменены взломщиком (или по ошибке). Это позволяет системному администратору немедленно узнать, что было взломано, и исправить это.
Использовать LD_PRELOAD
для загрузки библиотеки, которая перехватывает open
функция библиотеки и изменяет путь / регистрирует вывод / делает резервную копию перед открытием файла.
Взгляните на исходный код для strace
.
Взгляните на Installwatch:
http://en.wikipedia.org/wiki/Installwatch#Functionality
http://asic-linux.com.mx/~izto/checkinstall/installwatch.html
Возможно, самый простой (?) Способ сделать это - загрузиться с LiveUSB с «постоянным разделом данных». (Или, чтобы воспроизвести эффект самостоятельно, в chroot jail: смонтируйте слой rw поверх слоя ro.) Сделайте снимок файловой системы rw - которая должна быть очень тонкой после новой загрузки - затем запустите программу установки. Каждый файл, который он изменяет или создает, будет находиться в оверлейном разделе rw «постоянные данные». Даже удаленные файлы будут отображаться как «волшебные файлы точек».
Если установщик использует какое-либо средство упаковки (например, для .deb
пакеты для Debian / Ubuntu / ..., .rpm
пакеты для RedHat / CentOS / ... и т. д.), то установщик пакетов должен знать, что делать при установке и удалении. И я считаю, что тебе следует использовать существующие системы упаковки, а не изобретайте свой собственный. (В Linux обычно нет установщиков, как в Windows).
Если вы действительно хотите отслеживать изменения файла, внесенные каким-либо процессом, вы можете использовать strace
, или ltrace
чтобы поймать системные вызовы. Вы также можете inotify и сопутствующие объекты.
Но я не знаю catch-modifs
& revert-modifs
Как ты хочешь.
Я предлагаю не создавать установщик для вашего приложения, а использовать диспетчер пакетов, следовательно, предоставить .deb
(и / или .rpm
) пакеты для вашего приложения. Они справятся с проблемами зависимости лучше, чем ваш собственный установщик.
Самый простой способ добиться желаемого: установить «ненадежное» приложение в совершенно новый экземпляр виртуальной машины (рабочая станция VMWare, Oracle VirtualBox и т. Д.).
Когда вы решите, что вам больше не нужно приложение, удалите виртуальную машину.
Другие ваши альтернативы - перехват системных вызовов доступа к файлам - скорее всего, будут неполными и подвержены ошибкам. Будьте особенно осторожны с любым решением, для работы которого требуется динамическое связывание (как это, похоже, делает Installwatch). Установщик может вполне законно выполнять прямые системные вызовы или иметь статическую связь.