Вычислить список различий между пакетами, установленными на двух хостах
Я просто добавляю некоторые проблемы с моими виртуальными серверами Debian и добавляю, чтобы переустановить их все с нуля. Однако у меня все еще был доступ к старой версии, и я смог получить список установленных пакетов.
Чтобы облегчить процесс восстановления виртуального сервера в будущем, я хотел бы создать список конкретных пакетов для каждого из моих серверов.
Чтобы лучше объяснить, чего я хочу достичь. У меня уже есть автоматизированный процесс создания нового виртуального сервера с некоторыми базовыми пакетами и конфигурациями, которые используются повсеместно. Теперь я хочу сохранить дельту с этим "скелетом", чтобы упростить переустановку конкретного сервера.
Настоящим плюсом будет также сохранение измененных файлов конфигурации из настроек по умолчанию, но я могу жить только со списком пакетов.
Короче говоря, я хочу создать список пакетов, установленных на хосте, но не на другом.
Будет действительно здорово, если список содержит только установленные вручную пакеты, а не список всех зависимостей.
Если у вас есть некоторые инструменты, предназначенные для решения этой конкретной задачи, не стесняйтесь предлагать их, но я хочу, чтобы зависимость была как можно меньше. Для информации - это не виртуальные серверы, а контейнеры LXC.
5 ответов
На эталонной установке (только один раз):
dpkg-query -W -f='${Package}\n' | sort > baselist.txt
(Следующее предполагает bash
)
Чтобы получить пакеты, добавленные из эталонной установки (это не показывает, что было удалено):
comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)
Еще лучше, избегая копирования baselist.txt
:
comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)
На старом сервере запустите:
dpkg --get-selection> старый список пакетов
скопируйте вышеуказанный файл на новый сервер и запустите его на новом сервере:
dpkg --set-selections <старый-пакет-список
apt-get update
dselect update
Кроме того, не забудьте добавить все дополнительные репозитории из /etc/apt/sources.list
со старого сервера на новый, а также перед миграцией пакетов, если вы этого не сделаете, то большинство пакетов останутся неустановленными.
Вы можете использовать следующую команду, чтобы получить полный список пакетов на обоих серверах:
dpkg -l | sort > old_file
dpkg -l | sort > new_file
Затем вы можете получить различия, используя:
diff -Nur old_file new_file > changes.txt
Вы можете отфильтровать необходимые изменения, используя grep. Кроме того, diff можно использовать для получения изменений в файлах конфигурации и создания патчей для применения при необходимости. Кстати, diff может сравнивать две папки, а не только два файла.
План разработан специально для ваших нужд. Он выплевывает описание установленных пакетов и конфигурационных файлов, которые были изменены. Он может преобразовать эти описания в сценарии Puppet или Chef, чтобы применить их к чистым коробкам.
Также найден этот полезный пакет, описание которого выглядит следующим образом:
Скрипт Bash, который сравнивает дерево файловой системы пакета Debian с текущим деревом файловой системы, печатая унифицированные различия для файлов, которые отличаются.
https://code.google.com/p/dpkg-diffs/
Просто один файл bash, который вы можете вставить в свой PATH где-нибудь и запустить - кажется, работает для меня, и он не слишком старый.
Надеюсь, это кому-нибудь поможет.