[devel] [#210919] EPERM (try 4) apt.git=0.5.15lorg2-alt59 synaptic.git=0.58-alt17 ...

Aleksei Nikiforov darktemplar на altlinux.org
Пт Авг 3 11:28:05 MSK 2018


03.08.2018 08:54, Sergey Afonin пишет:
> On Thursday 02 August 2018, Anton Farygin wrote:
> 
>> Но самое клёвое в этом apt - это apt-get autoremove
>> работает для всех зависимостей, которые были установлены после
>> обновления apt'а.
>   
> А по какому принципу выбирается, кого remove ?
> 

Все пакеты делятся на autoinstalled и manually installed. Если пакет не 
помечен явно, он считается manually installed. Т.е. установленные до 
перехода на новую версию apt пакеты автоматически удаляться не должны.

При установке пакетов через apt, все пакеты, которые устанавливаются для 
удовлетворения зависимостей других пакетов, и при этом явно не указаны 
для установки, помечаются как autoinstalled. Например, при установке 
пакета A, также требуется установить пакеты B и C, при этом пакеты B и C 
будут помечены autoinstalled. Если же запросить установку пакетов A и B, 
то только пакет C будет помечен autoinstalled.

Также метку auto/manually installed можно смотреть или изменять через 
новую утилиту apt-mark.

При dist-upgrade, если один пакет заменяет другой, то если хоть один из 
них уже был помечен manually installed, то заменяющий пакет также будет 
помечен manually installed. Данное поведение можно изменить через конфиг.

При вызове autoremove алгоритм следующий:
1) собирается полный список установленных пакетов, информация о них, и 
их метки auto/manually installed в том числе.
2) Создаётся второй список пакетов, куда из первого списка добавляются 
все пакеты, которые помечены manually installed, а также рекурсивно 
добавляются все пакеты, которые являются их зависимостями.
Если же какую-то зависимость могут удовлетворить несколько пакетов 
(virtual provides), и несколько таких пакетов установлено в системе, то 
временно такая неразрешённая зависимость складывается в отдельный третий 
список.
Если у какого-то пакета при этом остались неудовлетворённые зависимости, 
кроме пока-что отложенных виртуальных, то autoremove завершается с ошибкой.
3) После этого делается несколько проходов по списку неразрешённых 
virtual provides, пока он не опустеет или не обнаружится неразрешимых 
зависимостей. Делается это для выбора того, какой из нескольких пакетов, 
предоставляющих virtual provide, останется в системе. Для каждой 
зависимости получается список установленных пакетов, которые могут 
предоставить её, и из этого списка убираются пакеты, у которых в системе 
установлены не все зависимости.
Если хотя бы один из пакетов этого списка уже попал в список из пункта 
2, то остальные пакеты не проверяются: уже есть кандидат для 
удовлетворения данной виртуальной зависимости, который останется в системе.
Если пакетов для удовлетворения виртуальной зависимости не останется 
после удаления из списка пакетов с недостающими зависимостями, то 
autoremove завершается с ошибкой.
Если остался только 1 пакет, то соответственно выбирается он.
Если пакетов в списке осталось 2 или более, то проверяются версии 
пакетов, и выбирается более старшая версия. Если есть несколько пакетов 
с самой старшей версией, то выбирается первый из таких пакетов. Эту 
логику можно и далее улучшить или снабдить настройками в случае 
необходимости.
4) После всех этих действий, если autoremove не завершился с ошибкой, 
есть 2 списка пакетов - список всех установленных пакетов и список всех 
отобранных пакетов, которые нужно оставить. autoremove проходится по 
первому списку, и если пакета нет во втором списке, помечает пакет для 
удаления. После этого autoremove запрашивает подтверждение пользователя 
для удаления всех помеченных пакетов.

С уважением,
Алексей Никифоров


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