У меня Debian Jessie и добавлены бэкпорты (согласноэти инструкции):
echo "deb http://http.debian.net/debian jessie-backports main contrib non-free" | sudo tee /etc/apt/sources.list.d/backports.list
(Я сделал это, чтобы получить более новое ядро, поскольку оно мне было нужно для некоторого оборудования в моем ноутбуке.)
В инструкциях сказано, что ничего не должно произойти, если я явно не попрошу бэкпортированный пакет, например apt-get -t jessie-backports install "package"
.
Однако теперь у меня, похоже, вся загрузка моей системы из бэкпортов, и один пакет был удален, поскольку он зависит от точной версии чего-то, что было обновлено до бэкпортов.
Итак, мой вопрос:
- Как мне сначала остановить его, чтобы больше не устанавливались бэкпорты?
- Как удалить существующие бэкпорты?
Примечание: это возвращает список установленных пакетов из бэкпортов (и в формате, который можно передать apt-get install
, по какой-то причине установка sudo apt-get install
echo в конце конвейера не работает):
cat /var/log/dpkg.log.1 |grep -v linux | grep -v xserver | grep -v firmware | grep "status installed" | grep bpo | cut -d" " -f 5 | cut -d: -f 1 | xargs -i{} -n1 bash -c "dpkg-query -s {} >/dev/null && echo {}" | sed -r -e "s~.*~\0/jessie~" | xargs echo
Осторожность:
Некоторые пакеты устанавливаются автоматически, поэтому если вы переустановите их все, то эти автоматически установленные пакеты будут помечены как установленные вручную. Таким образом, они не будут удалены, когда не нужны.
Есть ли у кого-нибудь идеи, как решить эту проблему?
решение1
Попробуйте добавить следующее в
/etc/apt/apt.conf
файл или в/etc/apt/apt.conf.d
:APT::Default-Release "jessie";
Чтобы удалить существующие бэкпорты, вам нужно будет получить список того, какие из них были установлены, и какую версию они заменили. К счастью, эту информацию можно очень легко извлечь из
/var/log/dpkg.log
eg grep ' upgrade ' /var/log/dpkg.log
выдаст вам много строк, подобных следующим:
2016-02-15 11:06:32 upgrade python-numpy:amd64 1:1.11.0~b2-1 1:1.11.0~b3-1
Здесь говорится, что в 11:06 утра 15 февраля я обновил python-numpy с версии 1:1.11.0~b2-1 до версии 1:1.11.0~b3-1.
Если бы я хотел вернуться к предыдущей версии, то я бы выполнил:
apt-get install python-numpy=1:1.11.0~b2-1
ПРИМЕЧАНИЕ: в этом конкретном случае это, вероятно, не сработает, поскольку я запускаю Debian sid
aka, unstable
поэтому старая версия, вероятно, больше не доступна в репозитории deb. Если вы запускаете jessie
и переустанавливаете версию пакета jessie в качестве понижения до версии jessie-backports, это будет работать так, как и ожидалось.
Аналогично, если пакет был удален, вы можете найти его и его точную версию, выполнив команду grep для remove
in /var/log/dpkg.log
.
Массовое понижение версии многих пакетов может быть в значительной степени автоматизировано с использованием стандартных инструментов, таких как awk
и grep
. Например, если вы знаете, что все установленные вами обновления jessie-backports были сделаны в определенный день (например, 2016-02-15), то вы можете выполнить понижение до предыдущих версий с помощью чего-то вроде:
apt-get -d -u install $(awk '/2016-02-15 ..:..:.. upgrade / {print $4 "=" $5}'
/var/log/dpkg.log)
(добавлены перевод строки и отступ, чтобы избежать горизонтальной полосы прокрутки)
ОБРАТИТЕ ВНИМАНИЕ на использование параметра -d
( --download-only
). Повторно выполните команду и удалите этот параметр после того, как убедитесь, что он apt-get install
сделает то, что вы хотите, и ТОЛЬКО то, что вы хотите.
Я бы также рекомендовал awk
сначала запустить только часть этой команды, чтобы вы могли увидеть список точных пакетов и версий, которые будут переустановлены.
решение2
Похоже, вы не правильно настроили /etc/apt/preferences
. Следующее не позволит ничего установить из jessie-backports, ожидая, что ему скажут установить (например, бэкпортированное ядро). У вас все равно будут проблемы, если указанные пакеты требуют других пакетов из бэкпортов, которые не перечислены.
Package: *
Pin: release n=jessie-backports
Pin-Priority: -1
Package: *
Pin: release n=jessie
Pin-Priority: 1000
# this will allow you to not have to use '-t jessie-backports install'
Package: linux-doc linux-headers-amd64 linux-image-amd64 linux-source
Pin: release n=jessie-backports
Pin-Priority: 1000
Если вы хотите получить список установленных бэкпортированных пакетов, вы можете использовать следующий скрипт (или его части):
chmod a+x name_of_script ./name_of_script > name_of_output_file
#!/bin/bash
RELEASES="jessie-backports"
echo "Searching for installed packages from" >&2
echo $RELEASES | sed s/^/" * "/ | sed s/\|/"\n * "/g >&2
for package in $(dpkg -l | grep -i ^ii | awk '{print $2}')
do
check=$( apt-cache policy $package 2>&1 | grep -i -A 1 "[*]" | egrep $RELEASES )
if [ "$check" == "" ] ; then
echo -ne "." >&2
else
echo -ne "#" >&2
echo
apt-cache policy $package
fi
done
echo >&2
echo
Если вы хотите понизить версию любого из пакетов, перечисленных в приведенном выше скрипте, добавьте следующее /etc/apt/preferences
:
Package: package1 package2 package3
Pin: release n=jessie
Pin-Priority: 1000
Затем выполните:
sudo apt-get upgrade
решение3
Проверьте конфигурацию закрепления для apt в /etc/apt/preferences и /etc/apt/preferences.d/
Возможно ли, что вы добавили пользовательскую конфигурацию закрепления и забыли об этом? Это единственный способ, который я могу придумать, чтобы заставить apt предпочесть backports, как он, похоже, делает у вас. В противном случае, это просто вытягивание зависимостей, которые требуются указанным вами пакетам.
Официальные бэкпорты уже закреплены ниже (100), чем jessie в файле релиза бэкпортированных пакетов в репозитории бэкпортов. Вам не нужно выполнять какую-либо конфигурацию apt, чтобы apt предпочитал jessie, а не jessie-backports.