Неудовлетворённые зависимости - один из способов решения.

Изображение пользователя sawa.

При использовании стороннего ppa бывает ситуация, когда пакеты в этом репозитории перестают обновляться. Но, после удаления такого ppa из списка источников, попытки установить программу из других репозиториев выдают ошибку о неудовлетворённых зависимостях. К этому обычно приводит то, что версии связанных с нужной программой пакетов в старой версии новее версий пакетов в новой.
Решение простое: найти пакеты вызывающие конфликт и понизить их версию.

Мой вариант:
1. Открываю консоль, становлюсь суперюзером и перехожу в /root
sudo su
cd /root

если aptitude не установлен - установите:
apt-get install aptitude
aptitude update
apt-cache gencaches

2. Создаю в файле /root/install.list список всех пакетов в системе:
dpkg --get-selections | awk '{if ($2=="install") print $1}' > install.list
Иногда необходимо исключить какие-то пакеты из обработки. Тогда создаю файлик /root/exclude.list
nano /root/exclude.list
Записываю в него имена пакетов (например):
lugaru
ufoai

В этом случае команда создания списка пакетов /root/install.list принимает такой вид:
dpkg --get-selections | awk '{if ($2=="install") print $1}' | grep -v "`cat /root/exclude.list`" > install.list
3. Запускаю переустановку пакетов из /root/install.list
aptitude reinstall `cat /root/install.list`
Получаю результат выполнения:

В примере проблема с пакетом audacity-data - нет такой версии в используемых репозиториях.
4. Проверяю какие версии доступны:
apt-cache showpkg audacity-data
Вывод:
Для дальнейшей работы интересные вот эти строки:
Provides:
2.0.1-1~ppa1 -
2.0.1-1~ppa0 -
2.0.0-1ubuntu0.1 -
2.0.0-1 -

где 2.0.1-1~ppa1 - текущая версия пакета,
2.0.1-1~ppa0 - версия на которую необходимо откатиться.
5. Откат пакета на старую версию:
aptitude install audacity-data=2.0.1-1~ppa0
Вывод:

В примере от пакета audacity-data зависит только один пакет audacity и aptitude легко справился с зависимостями. Бывают случаи более сложные, когда aptitude не может разрулить зависимости и предлагает снести пол системы. Тогда останавливаю работу aptitude и перед тем как подтвердить удаление создаю файл /root/deleted.list, куда вношу список удаляемых пакетов (в таком же виде как и в install.list) . Выхожу из консоли и перехожу в терминал (Ctrl+Alt+F1). Повторяю выполнение aptitude и соглашаюсь с удалением. После удаления, не перегружая системы, устанавливаю пакеты из списка в /root/deleted.list.
Всё это действо сожрёт уйму трафика и времени если нет кеширующего сервера.
Если есть варианты попроще - пишите.

Комментарии (20)

0
DarkneSS - 2 Декабрь, 2012 - 23:40
Изображение пользователя DarkneSS.

sudo apt-get install -fsudo apt-get dist-upgrade -f

0
sawa - 2 Декабрь, 2012 - 23:51
Изображение пользователя sawa.

Нет.
Смотрю:
aptitude reinstall `cat /root/install.list`
Вижу есть пакет который может привести к неудовлетвореённой зависимости:
E: Не удалось обнаружить файл пакета libbabl-0.1-0. Это может означать, что вам придётся вручную исправить этот пакет.
Запускаю:
apt-get install -f
Вывод - нет проблем:

Т.е. мой алгоритм решения позволяет найти потенциальных виновников до того как "случилось страшное"

+1
DarkneSS - 3 Декабрь, 2012 - 07:56
Изображение пользователя DarkneSS.

Лишний пакет != проблемный пакет. Как поиск мусора ваш метод годится, принято.

+1
dm - 2 Декабрь, 2012 - 23:51
Изображение пользователя dm.

Я тоже сталкивался с описанной ситуацией, выяснял какой пакет вызывает конфликт и понижал его версию через muon

+1
sawa - 3 Декабрь, 2012 - 00:58
Изображение пользователя sawa.

Функции понижения версии пакетов есть ещё и в synaptic. Пользуюсь, когда стою перед фактом что что-то не устанавливается.
Я предлагаю вариант поиска потенциальных конфликтов на внешне благополучной системе. Этот способ :
dpkg --get-selections | awk '{if ($2=="install") print $1}' > install.list
aptitude reinstall `cat /root/install.list`

позволяет легко и быстро найти пакеты которых уже нет в репозиториях.
Хотя не факт что они вызовут в дальнейшем (при обновлении) конфликт. Но весьма вероятно что они уже вызывают конфликты другого рода - из-за несовпадения версий (было, из-за разных версий библиотек, в параметрах системы не отображались настройки принтеров, приходилось ставить через веб морду).
Неплохо если бы была утилитина позволяющая автоматизировать процесс. А вручную - довольно рутинная работа.

0
Michael72 - 27 Июль, 2013 - 08:08
Изображение пользователя Michael72.

Функции понижения версии пакетов есть ещё и в synaptic. Пользуюсь, когда стою перед фактом что что-то не устанавливается.
Я предлагаю вариант поиска потенциальных конфликтов на внешне благополучной системе.Этот способ :
dpkg --get-selections | awk '{if ($2=="install") print $1}' > install.list
aptitude reinstall `cat /root/install.list`

позволяет легко и быстро найти пакеты которых уже нет в репозиториях.

Мне кажется этот список можно найти в Менеджере пакетов Synaptic (или Muon), если на боковой панеле выбрать вкладку "Состояние", а затем смотреть в группе "Установленные (локально или устаревшие)". Аналогично, можно также найти и в aptitude, если запустить без параметров.

0
aslok - 27 Июль, 2013 - 11:30
Изображение пользователя aslok.

В ответ на такую команду аптитюд всё равно пукнет, слишком много пакетов. Если уж переустанавливать всё, то aptitude reinstall должен получать имена пакетов по одному в цикле, а файл должен содержать версии пакетов. Я генерирую файл с именами-версиями так:
alias aptfixver="sudo aptitude search ~i -F '%p' | while read STRING; do VER=\"\$(sudo apt-cache policy \$STRING)\"; LOCAL=\"\$(echo \"\$VER\" | grep '\*\*\*' -A1 | grep /var/lib/dpkg/status | wc -l)\"; if (( \"\$LOCAL\" != 1 )); then continue; fi; CHECK=\"\$(echo \"\$VER\" | grep http -B1 | head -n 1 | grep -v '\*\*\*')\"; if [ -n \"\$CHECK\" ] && (( \$(echo \"\$CHECK\" | wc -l) == 1 )); then NEW_VER=\$(echo \"\$CHECK\" | sed 's/^ \+\(.*\) \+[0-9]\+\$/\1/'); echo \"\$STRING=\$NEW_VER\" >> packages-versions.txt; fi; done;"

Кроме этого пользуюсь такими алиасами:
alias aptitude="sudo aptitude -fV"
alias apti="aptitude --no-gui"
alias aptupd="apti update"
alias aptfull="apti full-upgrade"
alias aptupdfull="aptupd; aptfull"
alias aptinst="apti install"
alias aptfix="aptinst -f"
alias aptreinst="apti reinstall"
alias aptrem="apti remove"
alias aptremfull="apti purge"
alias aptshow="apti show"
alias aptshowfiles="dpkg -L"
alias aptshowver="sudo apt-cache policy"
alias aptclean="apti clean"
alias aptsearch="apti search"
alias aptsearchfile="dpkg -S"

0
Гость - 3 Декабрь, 2012 - 08:41

А я пользуюсь связкой из своего скрипта и пары программ. Перед тем как применить изменения аптитюд спрашивает.

$ sudo aptitude search ~i -F '%p' | while read STRING; do VER="$(sudo apt-cache policy $STRING)"; LOCAL="$(echo "$VER" | grep '\*\*\*' -A1 | grep /var/lib/dpkg/status | wc -l)"; if (( "$LOCAL" != 1 )); then continue; fi; CHECK="$(echo "$VER" | grep '\*\*\*' -A2 | wc -l)"; if (( $CHECK == 3 )); then NEW_VER=$(echo "$VER" | head -n 7 | tail -n 1 | sed 's/^ \+\(.*\) \+[0-9]\+$/\1/'); echo "$STRING=$NEW_VER" >> 1.txt; fi; done;
$ sudo aptitude install `cat 1.txt`
$ sudo aptitude purge `apt-show-versions | grep 'No available version' | sed 's/ .*//' | grep -v teamviewer7 | grep -v subsonic | grep -v qucs | grep -v deadbeef`
$ sudo aptitude purge `deborphan`

Последнюю команду иногда приходится повторять, тоже наверно стоит сделать обвязку

0
aslok - 12 Декабрь, 2012 - 05:31
Изображение пользователя aslok.

Обновил первый скрипт, тут новая версия, если что пишите на мыло.

$ sudo aptitude search ~i -F '%p' | while read STRING; do VER="$(sudo apt-cache policy $STRING)"; LOCAL="$(echo "$VER" | grep '\*\*\*' -A1 | grep /var/lib/dpkg/status | wc -l)"; if (( "$LOCAL" != 1 )); then continue; fi; CHECK="$(echo "$VER" | grep http -B1 | head -n 1 | grep -v '\*\*\*')"; if [ -n "$CHECK" ] && (( $(echo "$CHECK" | wc -l) == 1 )); then NEW_VER=$(echo "$CHECK" | sed 's/^ \+\(.*\) \+[0-9]\+$/\1/'); echo "$STRING=$NEW_VER" >> packages-versions.txt; fi; done;
$ sudo aptitude install `cat packages-versions.txt`

+1
aslok - 12 Декабрь, 2012 - 20:28
Изображение пользователя aslok.

Пару слов, что он делает, если это не совсем очевидно:

1. Ищем все установленные пакеты
2. Если установленная версия пакета доступна в репе, пропускаем пакет
3. Если установленная версия не доступна в репе, но есть другая, доступная - запоминаем доступную версию
4. Генерируем файл packages-versions.txt в котором каждая строчка ПАКЕТ=ДОСТУПНАЯ_ВЕРСИЯ
5. Второй командой требуем установить версии пакетов из файла

Следующие две команды
$ sudo aptitude purge `apt-show-versions | grep 'No available version' | sed 's/ .*//'`
$ sudo aptitude purge `deborphan`

1. Ищем пакеты которые недоступны в репе и удаляем
2. Ищем пакеты (библиотеки) которые установлены автоматически и не используются - удаляем. Эту команду можно повторять снова и снова до полного удовлетворения

+2
Xenomorph - 12 Декабрь, 2012 - 21:11
Изображение пользователя Xenomorph.

Имхо, пакеты, которые недоступны в репозиториях удалять не стоит просто так.

У меня некоторые пакеты установлены не из репозиториев, например, драйвера для принтера или SOFA Statistics Open For All.

+1
aslok - 12 Декабрь, 2012 - 23:10
Изображение пользователя aslok.

Исключения легко дописать в грип, например так:

$ sudo aptitude purge `apt-show-versions | grep 'No available version' | sed 's/ .*//' | grep -v deadbeef\\\|subsonic\\\|teamviewer7`

И как я уже писал, перед тем как применить, можно почитать что аптитюд спрашивает и подкорректировать действия (например если написать +deadbeef он удален не будет)

0
sawa - 12 Декабрь, 2012 - 22:01
Изображение пользователя sawa.

С учетом замечания Xenomorph, возможно нужно доработать - создать файлик со списком "замороженных" пакетов и при создании packages-versions.txt исключать их из перечня кандидатов на удаление.

0
aslok - 12 Декабрь, 2012 - 23:07
Изображение пользователя aslok.

Может быть допишу скрипт, если будет время, идея хорошая. Но лучше придумать, как бы так сделать, чтоб не нужен был этот файлик

0
GreatKir - 3 Декабрь, 2012 - 19:43
Изображение пользователя GreatKir.

Скорее, не по теме, но не могу разобраться, что значит "виртуальный пакет"
Программа не устанавливается в 12.10:
torrentstream-player-data : Зависит: libupnp3 (>= 1.4.3) который является виртуальным пакетом.
                             Зависит: libx264-116 который является виртуальным пакетом. или
                                             libx264-120 который является виртуальным пакетом.

+1
Xenomorph - 3 Декабрь, 2012 - 21:30
Изображение пользователя Xenomorph.

Виртуальный пакет предоставляет на выбор несколько различных программ/библиотек различных версий.
К примеру:
aptitude show djvu-viewer
No current or candidate version found for djvu-viewer
Package: djvu-viewer
State: not a real package
Provided by: atril, djview3, djview4, evince, evince-gtk, okular-extra-backends, zathura-djvu

Посмотреть список виртуальных пакетов можно aptitude search "~v"
Судя по тому, что даже в моём дебиане версии пакетов намного выше, виртуальными эти пакеты названы потому, что в зависимостях они указаны, а в списке пакетов они не существуют, из этого следует вывод, что нужно искать более новую версию torrentstream.

0
rockfan01 - 20 Декабрь, 2014 - 21:02
Изображение пользователя rockfan01.

"aptitude не может разрулить зависимости и предлагает снести пол системы"- чуток не понял, удаляються пакеты/програмы которые связаны с неугодным нам пакетом, вызывающим конфликт, устанавливаем нажный нам пакет, потом доустанавливаем то что пришлось удалить и теперь основной вопрос- но ведь тогда потянеться тот пакет который нужный этим приложениям и вызывал конфликт, как быть? и проканает ли вообще??

+2
AlexBKost - 20 Декабрь, 2014 - 23:09

Тема создана два года назад. Сколько воды утекло с тех пор? Правильно. А как известно, даже в одну воду нельзя войти дважды.
Чтобы понять и проканает ли вообще?? нужно пробовать самому, а потом отписаться для всех. Или сидеть у воды и ждать невесть чего.

0
rockfan01 - 21 Декабрь, 2014 - 13:51
Изображение пользователя rockfan01.

хорошо, но я имел ввиду что решение немного противоречивое, и больше напоминает легендарные танцы с бубном нежели альтернативу, но хорошо я вас понял)

0
sawa - 26 Декабрь, 2014 - 17:55
Изображение пользователя sawa.

Бывают ситуации когда нельзя снести пол системы и заново поставить. Вот сейчас сижу с машинкой вокруг которой в радиусе 200 км ни одной души.
Предлагает снести всё, вплоть до поддержки сети. Соглашусь - потеряю, придётся по морозу и снежным заносам гнать бригаду.
Придётся проверять по пакетику.
В общем, опыт нужен, чтобы понять что-же это за ситуация. Возникает в основном если пользоваться сторонними репозиториями. А раз в основных к сожалению не всё есть, то иногда нужно и в бубен постучать.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры