[devel] rpmlib(...) & apt

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Июл 20 15:34:42 MSD 2008


On Sun, Jul 20, 2008 at 03:18:48PM +0400, Alexander Bokovoy wrote:
> > Я утверждаю, что lzma ничего не сломал.
> >
> > Была только тонкость с обновлением rpm (нужно перегенерировать или
> > удалить кеш апта), но мы эту тонкость добили.
> Апгрейд сизифа месячной давности до текущего все равно приводит к
> тому, что нужно совершать пассы с --reinstall, иначе все пакеты,
> перепакованные с lzma не устанавливаются, а kept back. Причем, не
> apt-get --reinstall update, а с apt-get dist-upgrade --reinstall, а то
> и другие варианты.

Нет, ты чего-то не понял.  Проблема в кеше апта, а именно, в том,
что все зависимости вида 'rpmlib(...)' на самом деле *удаляются*
вообще из кеша апта при его генерации и дальше никак не участвуют
в разрешении зависимостей.  При этом удаление из кеша зависимостей
rpmlib(...) происходит на основе вызова rpmCheckRpmlibProvides()
из *текущей* библиотеки librpm (установленной в хост-системе).

apt/apt-pkg/rpm/rpmlistparser.cc:
   429	      if (namel[i][0] == 'r' && strncmp(namel[i], "rpmlib", 6) == 0)
   430	      {
   431	#if RPM_VERSION >= 0x040404
   432	        rpmds rpmlibProv = NULL;
   433	        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
   434	                               namel[i], verl?verl[i]:NULL, flagl[i]);
   435	        rpmdsRpmlib(&rpmlibProv, NULL);
   436	        int res = rpmdsSearch(rpmlibProv, ds) >= 0;
   437	        rpmdsFree(ds);
   438	        rpmdsFree(rpmlibProv);
   439	#elif RPM_VERSION >= 0x040100
   440		 rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
   441				        namel[i], verl?verl[i]:NULL, flagl[i]);
   442		 int res = rpmCheckRpmlibProvides(ds);
   443		 rpmdsFree(ds);
   444	#else
   445		 int res = rpmCheckRpmlibProvides(namel[i], verl?verl[i]:NULL,
   446						  flagl[i]);
   447	#endif
   448		 if (res) continue;
   449	      }

В строке 448 зависимость rpmlib(...) игнорируется, если она разрешена
относительно установленной библиотеки librpm.

После обновления librpm нужно перегенерировать (или просто удалить)
кеш апт, чтобы в новом кеше игнорировались в том числе и новые
зависимости rpmlib(...), предоставляемые новой библиотекой librpm.

> Решением это слабо можно назвать.

Любая новая фича rpm, выраженная в зависимостях вида rpmlib(...),
вызовет точно такую же проблему у апта.  На самом деле я считаю это
определнной кривизной апта.

Решение же абсолютно правильное -- либо запустить "странную команду",
которая перегенерирует кеш апта, либо просто удалить кеш вручную --
rm -f /var/cache/apt/*.bin

apt/apt-pkg/pkgcachegen.cc:
   600	/* This just verifies that each file in the list of index files exists,
   601	   has matching attributes with the cache and the cache does not have
   602	   any extra files. */
   603	static bool CheckValidity(string CacheFile, FileIterator Start, 
   604	                          FileIterator End,MMap **OutMap = 0)
   605	{
   606	   // No file, certainly invalid
   607	   if (CacheFile.empty() == true || FileExists(CacheFile) == false)
   608	      return false;
   609	   
   610	   // CNC:2003-02-20 - When --reinstall is used during a cache building
   611	   //		       process, the algorithm is sligthly changed to
   612	   //		       order the "better" architectures before, even if
   613	   //		       they are already in the system. Thus, we rebuild
   614	   //		       the cache when it's used.
   615	   bool ReInstall = _config->FindB("APT::Get::ReInstall", false);
   616	   if (ReInstall == true)
   617	      return false;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20080720/604d3793/attachment-0002.bin>


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