Разные системы Linux

8

У меня установлена ​​базовая система Linux. Я хочу запустить очень большой и сложный сторонний скрипт, который внесет много изменений в различные части всей системы. Эти изменения будут включать добавление новых файлов, изменение существующих файлов и удаление существующих файлов. Как только сценарий будет завершен, у меня будет модифицированная система. Модификации будут широкими и существенными.

Мне нужен какой-то отчет обо всех файлах, которые были добавлены, удалены или изменены, и построчный анализ изменений. Что-то вроде вывода утилиты сравнения файлов было бы здорово.

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

Кто-нибудь знает, какие инструменты использовать и как использовать всю систему?

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


источник
Разностные изображения (или снимки) - это не то, что вам нужно. Их цель - создать как можно меньший бинарный diff, а не подробный текстовый diff.
Дмитрий Григорьев
@DmitryGrigoryev Это впечатление, которое я получил от ссылки. Спасибо за подтверждение этого для меня.
На самом деле то, что вы хотите, довольно легко, но сложно достичь. Учитывая ресурсы, я бы установил две системы точно так же. Включите аудит файловой системы в системе, в которой будут изменены файлы. Получить отчет из аудита, чтобы определить, что было добавлено / modfiry / delete. Затем сравните эти файлы с другой установленной системой.
BitsOfNix
1
Вы можете использовать rsyncдля создания моментального снимка и другого запуска после изменений, чтобы сгенерировать отчет об измененных файлах. Дифференцирующая часть, вероятно, будет сложнее
FloHimself

Ответы:

1

Я думаю, что ваша идея не далека от решения. Чтобы наметить возможный способ: я использую rsnapshotдля резервного копирования. Он создает структуру каталогов (резервных копий) всех или подмножества ваших файлов с точками входа (например) /backup/hourly.1/...и /backup/hourly.0/..., где каждая ветвь несет все данные, но с использованием (жестких) ссылок для файлов, где не было внесено никаких изменений. , Выполнение рекурсивной lsили findобеих структур и сравнение вывода (отсортированного в случае поиска) покажет отсутствующие файлы, а проверка количества ссылок (во ls -lвтором столбце) покажет новые файлы (с количеством ссылок). 1). Для получения подробной информации об изменениях в файлах вы можете (для идентифицированных файлов) использовать обычныеdiffинструменты. Как уже говорилось, это набросок, потребуется некоторая работа для реализации, и могут быть неочевидные причуды, поэтому примите это предложение с недоверием

Janis
источник
0

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

Продвигаясь дальше, вы, возможно, могли бы написать сценарий, который выполняет diff для измененных файлов, хотя вам придется избегать двоичных файлов (не знаю, как).

Или вы можете использовать совершенно другой подход ... использовать git. Итак, в вашей «базовой» системе выполните git init в /, а затем запустите стороннюю программу, которую вы можете просто сделать:

git status > /tmp/changed-files.txt
git diff > /tmp/changes.txt

использование git даст вам немного гибкости. Сказав, что он может бороться за всю систему и может запутаться в / proc и т.д ..

Джон Хант
источник
0

Существует нечто, называемое libguestfs, которое вы можете использовать для выполнения diff. Это то, что я использовал в прошлом, и теперь я думаю, что операция может быть даже встроена, так что вам не придется использовать оболочку guestfish.

Другой вариант - запустить ваши операции в Docker-контейнере, а затем экспортировать и преобразовать полученные файлы в виде tar-файлов.

Имейте в виду, что если сценарий изменяет системные настройки путем записи в виртуальные файлы, эти изменения не будут отображаться в дереве файлов, и вам нужно что-то еще, чтобы зафиксировать эти изменения. Примером чего-то подобного являются приемлемые правила. Вам понадобится пользовательская логика, чтобы зафиксировать эти изменения.

davidk01
источник
За исключением случаев, когда правило является постоянным, оно должно быть где-то сохранено, чтобы его можно было повторно запустить / повторно включить после запуска сети и т. Д.
ivanivan
0

На странице The Linux Cookbook показана команда find-grep до и после модификации, за которой следует diff. Это очень просто, это может быть отправной точкой, но ваша проблема может быть лучше решена с помощью более сложных решений.

Похоже, что он будет ловить только дополнения и удаления, а не модификации ... ура, drl

DRL
источник
0

Все эти ответы направляются в правильном направлении и одинаково. С таким же успехом можно бросить мои 8 бит ...

Установите базовую систему на virtualbox. После начальной установки и готовности вашей базы загрузите виртуальную машину с другим живым носителем. Затем вы можете скопировать или экспортировать файловую систему без использования изменяющихся каталогов /proc.

Запустите ваш массивный скрипт и повторите процесс экспорта.

Теперь у вас есть две файловые системы, вы можете использовать различные инструменты сравнения.

diff --brief -Nr /tree1 /tree2

Даст вам хороший список файлов, которые отличаются stdout, и список файлов, которые не найдены ни в одном дереве, ни в другом stderr.

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

Вы можете объединить все это в одну команду, используя git. Может использоваться без инициализации репо, просто укажите любые 2 директории. Дает хороший цветной вывод, разбит на страницы через меньшее.

git diff --no-index /tree1 /tree2

ivanivan
источник