[Devel-conf] apt, группы пакетов и пересчёт места на диске

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Окт 22 22:19:46 MSD 2007


On Thu, Oct 18, 2007 at 11:11:11AM +0400, Stanislav Ievlev wrote:
> Привет всем!
> (Я добавил в копию Лёшу Турбина, ибо ниже следует вопрос про apt)

Я вообще-то подписан на этот список со времён царя Гороха, когда voins
писал http-сервер на Си+плюс, а от меня ждали чародейства и волшебства
в роли пиэма.  Надо было на перле его писать, для ИВК дело бы пошло
проще, а так всё равно всё десять раз уже пределали, но сингл писо коуд
сэвайвд.

Кстати я почему-то думал что первым делом нужно реализовать грамотный
разбор config-файлов (по BNF-синтаксису, а не по строковым регулярным
выражениям).  Интересно, что к этому вопросу с тех пор не возвращались.

> Вообще возможны два пути:
> 1. Подготовить всё заранее (списки пакетов и их размеры, замкнутые при
> помощи apt) и потом пользоваться только rpm (естественно
> предварительно проводя операцию объединения выбранных списков и
> исключения из них basesystem)
> 
> Собственно, это практически тоже самое что и установка базовой
> системы. Есть некоторый список (косвенно используется apt для
> замыкания его), и rpm "тупо" ставит пакеты по этому списку.

Смысл прегенерации?  Повысить респонсивность гуя?
 
> 2. Попытаться использовать apt.
> apt-get использовать невозможно - ибо он слишком медленно считывает
> свои индексы. Остаются apt-shell и apt-pipe.

Ага.  Это очень проклятая тема.  Код apt-get и apt-shell/apt-pipe
сейчас рассинхронизирован.  То есть там фактически зашито два разных
алгоритма разрешения зависимостей.  Код в apt-get лучше разрешает
первичные виртуальные зависимости (указанные в командной строке).
Ограничивается ли эта рассинхронизация первичными виртуальными
зависимостями, я сходу сказать не могу.  Но, строго говоря,
apt-shell/apt-pipe всерьез использовать нежелательно.

У меня есть свой фирменный хак, который позволяет использовать apt-get
без перечитывания хешей -- query-rebuild.git.  Там написан скрипт на
lua, который ФОРАКЕТ apt!  Штатно этот хак пока не работает, потому-что,
во первых, там есть патч к апту, а во-вторых, на время использования
этого хака нужно делать chmod -w /var/lib/rpm, потому что в противном
случае libapt-pkg НЕ ПЕРЕНОСИТ ФОРКА по части librpm/libdb4.

В общем рекомендовать этот хак я тоже не могу.  Я делал его для
другого -- он обещает ГРОМАДНУЮ экономию для т.н. "полной пересборки
сизифа".

> Бакенд должен работать в интерактивным "apt-shell", постоянно висящем
> в фоне. apt-shell не шибко готов к такому развороту событий, а потому
> тоже отпадает.
> Остался старый добрый apt-pipe. За ним нужен глаз да глаз, надо не
> забывать про необходимость вычитывание errors (apt-pipe использует
> единый канал для stdout и stderr). И главное надо хорошенько потом его
> грохнуть под конец работы, желательно подкрепить это грохание
> завершающим kill ;)
> 
> Как теперь можно пробовать работать.
> Выбрали группы пакетов - apt-pipe сказали install - узнали сколько
> нужно места на диске.
> Убрали группу пакетов ... и вот тут очередной "ой". Одно дело убрать
> одну группу, второе дело - фактически откатить "транзакцию". Есть
> только один способ - сбросить всё на начало и поставить все оставшиеся
> выделенными группы. А операции reset в apt-shell/apt-pipe нет.
> 
> В alterator-packages применялся фокус "давайте грохнем apt-pipe".
> Сразу понятно что по скорости apt-pipe сразу становится сопоставим с
> apt-get.

Конечно.  apt-pipe в таком ракурсе ничем не лучше apt-get.  То есть он
позволяет инкрементно расставлять галочки, но суммарный размер галочек
всё ещё очень трудно.

> Есть в apt-shell операция keep. Можно было бы сделать фокус, когда
> скормить keep всю пачку выделенных пакетов, но:
> 1. Передать все пакеты целиком невозможно ибо у apt-pipe ограниченна
> длина сообщения, при передаче "пачками" скорость "обнуления"
> сопоставима с 'убиванием' и запуском apt-pipe заново.
> 2. Не очень понятно на самом деле как keep влияет на алгоритм apt.
> Ведь keep - это аналог hold, но не сброс состояния на исходное.
> 
> Отсюда мораль. Надо разбираться с keep и реализовать в
> apt-shell/apt-pipe новую операцию reset, и желательно делать это
> правильным образом.
> 
> Или не париться и мириться с тем что при щелчке по очередному
> checkbox'у вылетает надпись со словами "пожалуйста подождите, сейчас я
> всё сделаю.... ", но тогда и apt-pipe не нужен ;)
> 
> Что скажете?

Хм.  Как ты это вообще себе представляешь?  Я поставил галочку на
пакете.  apt дал транзитивное замыкание зависимостей этого пакета.
Потом я снял галочку на пакете, что я имел в виду?  А что если я две
галочки подряд поставил а потом в обратном порядке их снял?  А в прямом?

То есть нужно хранить два списка пакетов.  Первый список -- это куда
я поставил галочки.  Второй список -- это то что выплюнул апт по
замыканию.  Второй список каждый раз существует лишь вторично.
То есть второй список каждый раз "сбревается" аккурат под iff required
for selected packages.

Кажется в дебиане есть какое-то такое различие между selected
и installed.  А может быть и нет.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel-conf/attachments/20071022/482f0e43/attachment-0002.bin>


Подробная информация о списке рассылки devel-conf