У меня установлена базовая система Linux. Я хочу запустить очень большой и сложный сторонний скрипт, который внесет много изменений в различные части всей системы. Эти изменения будут включать добавление новых файлов, изменение существующих файлов и удаление существующих файлов. Как только сценарий будет завершен, у меня будет модифицированная система. Модификации будут широкими и существенными.
Мне нужен какой-то отчет обо всех файлах, которые были добавлены, удалены или изменены, и построчный анализ изменений. Что-то вроде вывода утилиты сравнения файлов было бы здорово.
Я предполагаю, что мне нужно сделать своего рода снимок перед запуском скрипта и второй снимок после. Я предполагаю, что тогда я бы подал эти снимки в какой-нибудь инструмент сравнения или подобный ему.
Кто-нибудь знает, какие инструменты использовать и как использовать всю систему?
Я использую Virtualbox, который имеет функцию разностных изображений , хотя я не знаю, смогу ли я приспособить его для этой цели. Более того, я бы предпочел более общее решение, если это возможно.
rsync
для создания моментального снимка и другого запуска после изменений, чтобы сгенерировать отчет об измененных файлах. Дифференцирующая часть, вероятно, будет сложнееОтветы:
Я думаю, что ваша идея не далека от решения. Чтобы наметить возможный способ: я использую
rsnapshot
для резервного копирования. Он создает структуру каталогов (резервных копий) всех или подмножества ваших файлов с точками входа (например)/backup/hourly.1/...
и/backup/hourly.0/...
, где каждая ветвь несет все данные, но с использованием (жестких) ссылок для файлов, где не было внесено никаких изменений. , Выполнение рекурсивнойls
илиfind
обеих структур и сравнение вывода (отсортированного в случае поиска) покажет отсутствующие файлы, а проверка количества ссылок (воls -l
втором столбце) покажет новые файлы (с количеством ссылок). 1). Для получения подробной информации об изменениях в файлах вы можете (для идентифицированных файлов) использовать обычныеdiff
инструменты. Как уже говорилось, это набросок, потребуется некоторая работа для реализации, и могут быть неочевидные причуды, поэтому примите это предложение с недовериемисточник
Я бы, вероятно, сделал это, используя rsync, как это было предложено в одном из комментариев. Rsync имеет режим пробного запуска и функцию контрольной суммы, которую можно использовать для создания точного отчета об изменениях.
Продвигаясь дальше, вы, возможно, могли бы написать сценарий, который выполняет diff для измененных файлов, хотя вам придется избегать двоичных файлов (не знаю, как).
Или вы можете использовать совершенно другой подход ... использовать git. Итак, в вашей «базовой» системе выполните git init в /, а затем запустите стороннюю программу, которую вы можете просто сделать:
использование git даст вам немного гибкости. Сказав, что он может бороться за всю систему и может запутаться в / proc и т.д ..
источник
Существует нечто, называемое libguestfs, которое вы можете использовать для выполнения diff. Это то, что я использовал в прошлом, и теперь я думаю, что операция может быть даже встроена, так что вам не придется использовать оболочку guestfish.
Другой вариант - запустить ваши операции в Docker-контейнере, а затем экспортировать и преобразовать полученные файлы в виде tar-файлов.
Имейте в виду, что если сценарий изменяет системные настройки путем записи в виртуальные файлы, эти изменения не будут отображаться в дереве файлов, и вам нужно что-то еще, чтобы зафиксировать эти изменения. Примером чего-то подобного являются приемлемые правила. Вам понадобится пользовательская логика, чтобы зафиксировать эти изменения.
источник
На странице The Linux Cookbook показана команда find-grep до и после модификации, за которой следует diff. Это очень просто, это может быть отправной точкой, но ваша проблема может быть лучше решена с помощью более сложных решений.
Похоже, что он будет ловить только дополнения и удаления, а не модификации ... ура, drl
источник
Все эти ответы направляются в правильном направлении и одинаково. С таким же успехом можно бросить мои 8 бит ...
Установите базовую систему на virtualbox. После начальной установки и готовности вашей базы загрузите виртуальную машину с другим живым носителем. Затем вы можете скопировать или экспортировать файловую систему без использования изменяющихся каталогов
/proc
.Запустите ваш массивный скрипт и повторите процесс экспорта.
Теперь у вас есть две файловые системы, вы можете использовать различные инструменты сравнения.
diff --brief -Nr /tree1 /tree2
Даст вам хороший список файлов, которые отличаются
stdout
, и список файлов, которые не найдены ни в одном дереве, ни в другомstderr
.Чтобы выяснить, какие фактические изменения произошли, вы можете проанализировать
stdout
выходные данные файлов, которые отличаются, и запустить регулярный анализ дляdiff
них по отдельности, перенаправив вывод в файл. Или вы можете просто просмотреть список и запустить diff для файлов, которые вас особенно интересуют.Вы можете объединить все это в одну команду, используя
git
. Может использоваться без инициализации репо, просто укажите любые 2 директории. Дает хороший цветной вывод, разбит на страницы через меньшее.git diff --no-index /tree1 /tree2
источник