Я собираюсь внести некоторые изменения в систему и хочу записать текущее состояние моей системы. Есть ли удобный способ записать это? Я хочу отслеживать такую информацию, как
/etc/apt/sources.list
) они были установлены изКороче говоря, я хотел бы сохранить как можно больше базы данных aptitude. Как лучше всего это сделать? Было бы неплохо, если бы результирующие записи были легко читаемыми, хотя это и не очень важно. Было бы очень хорошо, если бы его можно было легко редактировать с помощью инструмента SCM, такого как git
.
Eсть вопрос суперпользователя это частично отвечает на этот вопрос, но предоставляет только список установленных пакетов.
Основываясь на ответе @ptman, я определил следующее:
/etc/apt
и /var/lib/...
, выполнит подмножество того, что aptitude-create-state-bundle
делает.apt-cache policy
просто кажется, что дает информацию о приоритете, поэтому мне нужно что-то более полное; aptitude-create-state-bundle
Казалось бы, билет. Однако было бы полезно иметь способ проанализировать пакет, чтобы получить информацию, например, предоставленную apt-cache policy
.Я запустил репозиторий 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
делает и как его использовать.
Я использовал эту систему, но она кажется немного громоздкой, поскольку репозиторий .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, кроме серверов.