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

9

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

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

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

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

А потом:

(sudo) revert-modifs fsmodifs.patch

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

Ywen
источник

Ответы:

1

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

BRPocock
источник
Это выглядит сложно ... Разве нельзя просто создать новый раздел, смонтировать старый RO и смонтировать поверх него новый в RW?
Ywen
Да, вы также можете сделать это из однопользовательского режима. Взгляните на unionfs- в основном, файловая система RW принимает все записи, но файловая система RO все еще видна под ней. Если файл изменился, он «мигрирует» в RW fs; если он удален, на RW fs на самом деле есть «волшебный точечный файл», который «маскирует» его. Настройка unionfsможет быть немного обидчивой, поэтому я предложил LiveUSB (он делает эту часть за вас, и у вас есть «чистый» образ системы для запуска)
BRPocock
2

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

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

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

Корит Малин
источник
1

Посмотрите на Installwatch:

http://en.wikipedia.org/wiki/Installwatch#Functionality

http://asic-linux.com.mx/~izto/checkinstall/installwatch.html

qerub
источник
Вы имеете в виду "CheckInstall"? Это работает, когда у меня нет make-файлов? В моем случае (Eclim) установка производилась через установщик jar.
Нет, я имею в виду Installwatch, который является частью CheckInstall.
Qerub
«Installwatch работает с каждой динамически связанной ELF-программой, переопределяя системные вызовы, которые вызывают изменения файловой системы. Некоторые из таких системных вызовов являются open (2) и unlink (2)». Должно работать нормально с JVM.
Qerub
Да, но, видимо, один только Installwatch уже давно не поддерживается. Кроме того, вам нужно CheckInstall, чтобы иметь возможность восстановить журналы InstallWatch. Я все еще должен посмотреть. Спасибо.
1

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

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

Бен Фойгт
источник
Да, но, как кто-то сказал, что, если программа статически связана?
Ywen
0

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

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

Но я не знаю о catch-modifsи revert-modifsкак вы хотите.

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

Василий Старынкевич
источник
Да, я использую apt-get все время. Я говорил не о своих собственных приложениях, а о неупакованных. У меня не всегда есть .deb под рукой.
Упомянутые вами неупакованные приложения должны документировать, какие файлы они используют и как их устанавливать.
^^ Что если они этого не сделают? Я знал, что могу собрать их сам, но это не так просто . Плюс такие команды могут быть полезны для более безопасного тестирования некоторых системных скриптов, которые вы создаете.
Я согласен, что ваше желание интересно, но я не уверен, что оно легко реализуемо ...
0

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

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

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


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