Назад | Перейти на главную страницу

Создание записи о полном (-ишем) состоянии управления пакетами

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

Короче говоря, я хотел бы сохранить как можно больше базы данных aptitude. Как лучше всего это сделать? Было бы неплохо, если бы результирующие записи были легко читаемыми, хотя это и не очень важно. Было бы очень хорошо, если бы его можно было легко редактировать с помощью инструмента SCM, такого как git.

Eсть вопрос суперпользователя это частично отвечает на этот вопрос, но предоставляет только список установленных пакетов.

Обновить

Основываясь на ответе @ptman, я определил следующее:

Я запустил репозиторий git (используя setgitperms.perl hook util), который содержит извлеченное содержимое aptitude-create-state-bundle, например, я

sudo aptitude-create-state-bundle --force-gzip /dev/stdout | sudo tar xzv

для создания содержимого каталога перед запуском git add . && git add -u .. Это немного медленно, так как он сжимает и распаковывает все, я, вероятно, изменю его, чтобы просто получить список файлов с --print-inputs вариант, а затем скопируйте или жестко свяжите эти файлы в репозиторий git.

Этот подход работает очень хорошо: после запуска git gc --aggressive, Я получаю каталог .git, размер которого составляет 2/3 размера исходного архива. Это было сделано после второго коммита, который записал состояние после установки puppet и его зависимости. Достаточно легко увидеть, что изменилось, просто посмотрев разницу, это отличный способ узнать, что aptitude действительно делает при выполнении операций. Я думаю, что есть способ разместить хуки в самом apt (à la etckeeper), поэтому я могу использовать это средство для обновления репо при каждой операции apt.

Одна небольшая проблема заключается в том, что даже при включенном хуке setgitperms временные метки не записываются этой системой. Поэтому я добавил вторую команду к моему хуку предварительной фиксации, чтобы выгрузить длинный список каталогов в файл с именем .ls в корневом каталоге репо:

find * | xargs -d \\n ls -ld >.ls

Я не уверен, действительно ли это необходимо, я делаю это только на случай aptitude-run-state-bundle использует временные метки определенным образом. Кто-нибудь знает, правда ли это? Даже в этом случае это кажется маловероятным, поскольку временные метки извлеченных файлов всегда будут как минимум такими же новыми, как и исходные временные метки этих файлов, когда они были зафиксированы.

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

обновление 2

Я использовал эту систему, но она кажется немного громоздкой, поскольку репозиторий .git растет довольно быстро. После 12 коммитов каталог .git (после сжатия с использованием git gc --aggressive) увеличился с первоначального размера (IIRC) 15-20 МБ до примерно 60 МБ.

Похоже, что большая часть объема, по-видимому, связана с различиями в двух больших (~ 15 МБ) двоичных файлах, и мне интересно, необходимы ли эти файлы для сохранения состояния упаковки системы. Вот эти файлы:

var/cache/apt/pkgcache.bin
var/cache/apt/srcpkgcache.bin

Можно ли будет восстановить репо с помощью aptitude-run-state-bundle если этих файлов нет в архиве? Можно ли добавить текущие версии системы в тарбол, чтобы этот тарбол мог использовать aptitude-run-state-bundle (если, конечно, текущие версии системы не повреждены)?

Обратите внимание на следующие инструменты:

dpkg --get-selections
aptitude-create-state-bundle
dpkg -l
dpkg -l |tail -n +6 | awk '{ print $2 }' | xargs apt-cache policy

Резервное копирование /etc/apt и /var/lib/{apt,dpkg,aptitude}.

Использовать кукольный. Используя этот инструмент, вы можете запросить систему и составить список ее текущего состояния. Затем этот список можно использовать для клонирования системы. Это похоже на buildout, кроме серверов.