LINUX.ORG.RU

Не понимаю поведение apt (dpkg)

 


3

2

Привет, ЛОР!
Я хочу поговорить с тобой о удивительном поведении пакетного менеджера в Debian (и Debian-based дистрибутивах).

Я долго пытался поймать подобное поведение, но всё же мне удалось.

Надеюсь, кто-то из заядлых дебианщиков объяснит мне, какого хчем такое поведение обусловлено и как можно этого избежать.


Итак:

1. Я решил установить пакет photocollage, пакетный менеджер (конечно же, с опцией --no-install-recommends в конфиге) любезно установил этот пакет с удоволетворением всех зависимостей:

➤  sudo apt install photocollage                                                                                                                                 
[sudo] password for ann: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libimagequant0 python3-pil
Suggested packages:
  python-pil-doc python3-pil-dbg
Recommended packages:
  python3-olefile
The following NEW packages will be installed:
  libimagequant0 photocollage python3-pil
0 upgraded, 3 newly installed, 0 to remove and 12 not upgraded.
Need to get 591 kB of archives.
After this operation, 2,103 kB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://ftp.ee.debian.org/debian stable/main amd64 libimagequant0 amd64 2.12.2-1.1 [32.5 kB]
Get:2 http://ftp.ee.debian.org/debian stable/main amd64 python3-pil amd64 5.4.1-2 [395 kB]
Get:3 http://ftp.ee.debian.org/debian stable/main amd64 photocollage all 1.4.3-2.1 [164 kB]
Fetched 591 kB in 0s (1,927 kB/s)     
Selecting previously unselected package libimagequant0:amd64.
(Reading database ... 118144 files and directories currently installed.)
Preparing to unpack .../libimagequant0_2.12.2-1.1_amd64.deb ...
Unpacking libimagequant0:amd64 (2.12.2-1.1) ...
Selecting previously unselected package python3-pil:amd64.
Preparing to unpack .../python3-pil_5.4.1-2_amd64.deb ...
Unpacking python3-pil:amd64 (5.4.1-2) ...
Selecting previously unselected package photocollage.
Preparing to unpack .../photocollage_1.4.3-2.1_all.deb ...
Unpacking photocollage (1.4.3-2.1) ...
Setting up libimagequant0:amd64 (2.12.2-1.1) ...
Setting up python3-pil:amd64 (5.4.1-2) ...
Setting up photocollage (1.4.3-2.1) ...
Processing triggers for libc-bin (2.29-7) ...
Processing triggers for desktop-file-utils (0.23-4) ...
Processing triggers for mime-support (3.62) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...


2. Я попробовал эту программу в действии и мне не понравился результат — логично, что я захочу её удалить (подразумевая и все её зависимости, которые мне больше не нужны):

➤  sudo apt purge photocollage                                                                                                                                   
[sudo] password for ann: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  photocollage*
0 upgraded, 0 newly installed, 1 to remove and 12 not upgraded.
After this operation, 550 kB disk space will be freed.
Do you want to continue? [Y/n] 
(Reading database ... 118289 files and directories currently installed.)
Removing photocollage (1.4.3-2.1) ...
Processing triggers for mime-support (3.62) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for desktop-file-utils (0.23-4) ...


И тут, эээ, интересный вопрос.

Какого, собственно, фига apt удаляет пакет, но не удаляет его зависимости? Это вообще законно?

Сколько ещё пакетов были установлены как зависимости, но не удалены вместе с тем пакетом, с которым были установлены? Доколе?

★★★★☆

history.log:

Start-Date: 2020-01-16  23:42:54
Commandline: apt install photocollage
Requested-By: ann (1000)
Install: python3-pil:amd64 (5.4.1-2, automatic), libimagequant0:amd64 (2.12.2-1.1, automatic), photocollage:amd64 (1.4.3-2.1)
End-Date: 2020-01-16  23:42:55

Start-Date: 2020-01-17  00:01:07
Commandline: apt purge photocollage
Requested-By: ann (1000)
Purge: photocollage:amd64 (1.4.3-2.1)
End-Date: 2020-01-17  00:01:08


dpkg -l|grep libimagequant0:
➤  dpkg -l|grep libimagequant0                                                                                                                                   
ii  libimagequant0:amd64                 2.12.2-1.1                          amd64        palette quantization library

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от anonymous

Да, в нормальном случае команда apt purge photocollage должна была пометить пакеты-зависимости libimagequant0 python3-pil для удаления (которое можно было бы произвести через apt autoremove), но нет, почему-то этого не сделала.

Я и хочу узнать, почему.

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от annerleen

но нет, почему-то этого не сделала.

У меня сделала. Да и у тебя, наверняка, тоже:

# apt list python3-pil
Listing... Done
python3-pil/testing,now 6.2.1-2+b1 amd64 [installed,automatic]
python3-pil/testing 6.2.1-2+b1 armhf
python3-pil/testing 6.2.1-2+b1 i386

Помечено: automatic.

При удалении напоминается о apt autoremove.

# apt purge photocollage
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libimagequant0 python3-pil
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  photocollage*
0 upgraded, 0 newly installed, 1 to remove and 2054 not upgraded.
After this operation, 550 kB disk space will be freed.
Do you want to continue? [Y/n] 

The following packages were automatically installed and are no longer required

Т.е. если в системе уже установлены пакеты, которые рекомендуют python3-pil, то последнее условие перестаёт выполняться. А т.к. они уже установлены, то --no-install-recommends здесь не помогает. Отсюда, предположу, и невозможность простого удаления подобных зависимостей.

gag ★★★★★
()
Ответ на: комментарий от gag

Но у меня с самого первого дня система «живёт» с

--no-install-recommends


Получается, что если есть какой-то пакет, установленный безусловно, который recommends python3-pil, то при установке последнего зависимостью для какого-либо другого пакета, при его (пакета) удалении, python3-pil не удалится?

Что за идиотизм?

annerleen ★★★★☆
() автор топика
Последнее исправление: annerleen (всего исправлений: 1)
Ответ на: комментарий от annerleen

Ага, apt не запоминает для каждого пакета эту доп. информацию, и потом не различает «automatic» для какого именно пакета было установлено. Вот было бы «automatic-for-dependency» и «automatic-for-recommends», тогда, наверняка, можно было бы. Но и это было бы слишком грубое разделение, и были бы недовольные.

gag ★★★★★
()
Ответ на: комментарий от anonymous

Да нет, я теперь хочу выпилить Дебиан с десктопа, только вот чем заменить — пока ума не приложу.

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от anonymous

Anonimus

Кто это?

gentoo

Я слишком тупой для Дженты.

annerleen ★★★★☆
() автор топика

Сейчас фанбои Дебиана объяснят тебе, что так и должно быть, а в Федоре дела ещё хуже.

На самом деле, как я понял, зависимости имеют свойство прилипать.

  • Допустим, ты установил пакет альфа. У него есть recommended или suggested зависимость икс, но ты её не устанавливаешь.
  • Через месяц ты ставишь пакет бета, а пакет икс у неё уже в жёстких зависимостях и, собственно, устанавливается.
  • Тебе бета не понравилась, ты её удаляешь.
  • икс не удаляется, так как теперь считается зависимостью альфы. Грубо говоря, икс прилипла к альфе.

Это одна из причин, почему пакетные помойки — зло, поэтому от них нужно избавляться.

Thetan ★★★
()
Ответ на: комментарий от anonymous

Suggest'ы по-дефолту отключены, емнип, но я на всякий случай ещё явно отключил их в конфиге вместе с recommends.

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от Thetan

Это какбэ понятно.
Но у меня система с первых минут жизни живёт с

APT::Install-Recommends "0";
APT::Install-Suggests "0";


И я почему-то был уверен, что если икс в suggests/recommends и установлено не явно, а как жёсткая зависимость, то оно должно быть удалено в случае удаления пакета, в чьих зависимостях оно было.

Где я не прав? (лев)

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от annerleen

Скорее всего, apt remove просто плевать на эти опции, учитывая, с какого слова они начинаются. К тому же, apt remove не может знать, зависимость была установлена до назначения этих опций или после.

  • Установил первый пакет; отключил рекомендованные; установил второй пакет; удалил второй пакет (удалять икс не нужно).
  • Отключил рекомендованные; установил первый пакет; установил второй пакет; удалил второй пакет (удалять икс нужно).

Эти два сценария нужно как-то отличить, чего apt remove не умеет.

Thetan ★★★
()
Ответ на: комментарий от annerleen

Арчик, у которого в силу простоты пакетного менеджера таких проблем нет. Для Xfce с ч/б обоиной самое то. Гигиену обновлений, главное, соблюдать.

Thetan ★★★
()
Ответ на: комментарий от annerleen

Я и хочу узнать, почему.

Aptitude why легко ответит на этот вопрос..

Polugnom ★★★★★
()

Ответы не читал. Поясняю как я это вижу. Устанавливая пакет А в систему, при условии, что у пакета А есть обязательные зависимости Б, В и необязательные (рекомендованные) Г, Д, ты, при установке с ключем --no-install-recommends получаешь в системе пакеты А, Б и В. Когда ты удаляешь пакет А, ПМ проверяет, не являются ли рекомендованными пакеты Б и В для других пакетов, установленных в системе. Если пакеты Б и В никому не нужны, кроме пакета А, в каком-либо виде, они могут быть удалены или сразу вместе с пакетом А --auto-remove, или после удаления пакета А отдельной операцией apt autoremove.

Мне такое поведение апта не нравится, хотя я его понимаю. Видимо, есть какие-то сложности в реализации или философские причины, по которым апт не имеет опций или ключей для удаление рекомендованных. Подозреваю, что это связано с тем, что рекомендованные пакеты в принципе не отслеживаются аптом, поэтому если в системе они хоть кому-то нужны, то они остаются, даже если они было притянуты при установке пакета после установки других пакетов, для которых этот пакет является рекоммендованным.

Мое решение этой ситуации - у меня есть скрипт, который парсит по изменению /var/log/apt/history.log и отслеживает зависимости, установленные с пакетом. Если мне нужно удалить установленный пакет, я смогу разом удалить все, что с ним прилетело. Единственный минус моей реализации - пакеты нужно устанавливать по одному, т. е. apt install package1, но можно заморочиться и разделить, а можно делать хак, и ставить много пакетов в цикле.

anonymous
()

Дело в том, что APT по умолчанию не удаляет автоматически установленные пакеты, если их транзитивно рекомендует или даже предлагает какой-то из установленных вручную пакетов. Это сделано специально в качестве меры предосторожности, чтобы автоудаление «хвостов» не затрагивало не связанные с изначально удалённым пакеты.

Данное поведение настраивается. Вам следует создать в /etc/apt/apt.conf.d/ файл со следующим содержимым:

APT::AutoRemove::RecommendsImportant "false";
APT::AutoRemove::SuggestsImportant "false";
Rootlexx ★★★★★
()
Ответ на: комментарий от Thetan

Это одна из причин, почему пакетные помойки — зло, поэтому от них нужно избавляться.

Всё бы хорошо, но snap и flatpak не удаляют даже то, что уже не требуется ни одному приложению. В общем, всё как всегда в этом вашем.

anonymous
()
Ответ на: комментарий от Deleted

Установщик манжары уже научился не падать при попытке поставить систему на шифрованный раздел?

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от Rootlexx

А теперь почитай что делают эти функции и попробуй провести опыт по удалению. Как не получится, приходи, расскажу почему.

anonymous
()
Ответ на: комментарий от Rootlexx

А вот это, кстати, похоже на решение того, на что я негодую.
Спасибо.

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от anonymous

А теперь почитай что делают эти функции

Я и так в курсе, что делают эти конфигурационные параметры.

попробуй провести опыт по удалению

У меня с самого начала SuggestsImportant "false" - всё прекрасно удаляется.

Как не получится, приходи, расскажу почему.

Ну попробуйте.

Rootlexx ★★★★★
()
Ответ на: комментарий от Thetan

Не вижу здесь этих директив.

Не все директивы описаны в man apt.conf.

Здесь есть. Указано:

The following configuration options are used by aptitude.

См. /usr/share/doc/apt/examples/configure-index.gz.

Rootlexx ★★★★★
()
Ответ на: комментарий от Deleted

aptitude умеет в тэги, с ними удобно. но aptitude бывает крайне опасен.

Почему все стремятся рассказать мне то, что я и так уже знаю? :)

Rootlexx ★★★★★
()

Отмечаю тему как решённую

APT::AutoRemove::RecommendsImportant "false";
APT::AutoRemove::SuggestsImportant "false";
annerleen ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.