cppmm 21.02.2012 08:17
Скрипты — Восстановление базы установленных пакетов в debian
Сегодня ночью немного попрактиковался в костылеписании из-за собственной невнимательности. Подумал, может быть тут тоже кому будет интересно.Под катом скрипт для восстановления базы установленных пакетов dpkg в debian'е(и краткая история его появления).
Решил тут перейти на нетбуке со стабильной ветки debian'а на тестинг. Так как на моей eeepc'шке всего 4 гига флешка внутри, места для dist-upgrade не хватило бы. Но я уже обновлял его с lenny до squeeze в своё время, так что это не проблема. Беру обычную флешку, форматирую в ext3, подключаю и тут я допускаю первую ошибку. Вместо того, чтобы просто примонтировать эту флешку как /var/cache/apt/archives, я копирую на неё содержимое /var/ и командую mount /dev/sdb1 /var/. Само по себе это тоже не проблема. Я спокойненько обновился, отмонтировал флешку и ребутнулся. Это было второй ошибкой. Дело в том, что помимо всего прочего на /var/ лежит база установленных пакетов dpkg. Находится она в /var/lib/dpkg/status. И тут я понимаю, что после того, как система обновилась, я допустил третью ошибку. Мне понадобилась флешка и я её снова форматнул.
Итак, ситуация. На нетбуке установлен Debian Wheezy. Но dpkg думает, что там squeeze(я же монтировал просто поверх /var/, и всё, что там было, осталось неизменным). В итоге dpkg и apt в ступоре. Они смотрят в базы установленных пакетов, сравнивают их с репами и понимают, что надо обновляться. Но при попытке что-нибудь установить или обновить, dpkg проверяет установленные файлы и понимает, что они не соответствуют тому, что у него в базе(версии-то разные) и отказывается что-либо делать. И я его понимаю. Например, он ругается на libc6. Он же видит, что у меня динамический линковщик ссылается на определённую библиотеку. Но у него в базе говорится, что стоит другая библиотека. Поэтому dpkg честно выдаёт "Ты там разберись сперва с тем, что в обход меня поставил, а потом уже обновляйся, а то я тебе всё сломать могу". Итого - система как бы работает, но пакетный менеджер как бы умер.
Есть два выхода. Каким-то образом восстановить dpkg или переустановить всё с нуля, забекапив конфиги. В случае со вторым вариантом, желательно ещё узнать, какие пакет у меня были установлены, чтобы потом не сидеть и не вспоминать, чего там где было. И пока я думал, как же вытащить список пакетов, в голову пришла идея "если у меня будет список пакетов, зачем переустанавливать? Можно же просто записать их в базу dpkg и работать дальше". На том и порешили.
Для начала надо получить список. Чем славится debian(ну и любой нормальный linux)? Правильно. Тем, что у него на каждый пакет обязательно существует документация. И находится она прямо в системе. Не нужно ни интернетов, ни толстых книжек. Всё с собой. А это значит, что мне нужно посмотреть, на что у меня есть доки и я узнаю, какие у меня стоят пакеты. Решение для первой части проблемы есть.
Но это даст мне только названия пакетов. А для dpkg нужно версии, зависимости и ещё целую кучу всякой информации. И лучшее место, где взять эту информацию - репы. Собственно, это всё тоже уже в системе. Мы получаем все версии, описания, зависимости и т.д., когда командуем apt-get update. И, к счастью, для этой команды не важно - есть там что-то в базе установленного или нет. Она работает и так.
Осталось дело за малым - написать скрипт, который пройдётся по докам, соберёт имена, а потом с этими именами пробежится по спискам пакетов из реп, распарсит это дело и сложит в нужном виде в базу dpkg.
Собственно, вот этот скрипт.
Небольшие пояснения. Сначала мы указываем пути, где лежит документация и где списки пакетов, скачанные с реп при обновлении. Потом получаем список пакетов и начинаем по очереди для каждого из них искать информацию, складывать её в хеш, из которого потом в свою очередь записывать в файл в формате, необходимом dpkg. Вот и всё. Запускается скрипт без параметров, работает долго, на выходе выдаёт файл status, который надо положить в /var/lib/dpkg/.
Какие можно из всего этого сделать выводы?
1. Не начинайте делать серьёзных вещей в два-три часа ночи. По невнимательности можно допустить несколько казалось бы мелких ошибки, из-за которых потом придётся долго отдуваться.
2. GNU/Linux - система неубиваемая. Даже после конца света, она будет работать, хотя, может быть, людей уже и не останется.
Daria 21.02.2012 13:12 #
+ 3 -
отличный интригуюший детектив. с удовольствием прочитала.