Как заставить «пакеты, [которые] были сохранены», устанавливаться [как] «автоматически»?
TL;DR
В последнее время во время обычного процесса обновления программного обеспечения (т.
apt upgrade
или же
apt dist-upgrade
) Мне стали приходить такие сообщения:
[...]
The following packages have been kept back:
[...]
0 upgraded, 0 newly installed, 0 to remove and [...] not upgraded.
Каковы мои варианты?
Примечание. Это не дубликат множества подобных вопросов, уже заданных здесь. Вы должны рассматривать мой вопрос как продолжение этого вопроса.
У меня была точно такая же проблема в моей основной системе Ubuntu 22.04, что и вопрос, упомянутый выше. Я сменил серверы, попытался вручную установить названный пакет, и как-то вчера проблема решилась. Сегодня, когда я попытался установить какие-либо новые обновления, я получил сообщение о том, что у меня есть 32 пакета, которые были сохранены.
У меня есть аналогичная версия 22.04 (виртуальная) установка Ubuntu, которая сейчас полностью обновлена, и эта проблема там еще не возникает (с аналогичным
/etc/apt/sources.list
файл). Итак, я попытался сравнить пакеты. я взял пакет
gir1.2-gstreamer-1.0
который был «сохранен» в моей основной системе в качестве примера и работал в моей основной системе:
$ sudo apt --installed list | grep gir1.2-gstreamer-1.0
[...]
gir1.2-gstreamer-1.0/jammy,now 1.20.1-1 amd64 [installed,upgradable to: 1.20.3-0ubuntu1]
Эта же команда выдает результат:
gir1.2-gstreamer-1.0/jammy,now 1.20.1-1 amd64 [installed,automatic]
на моей вторичной (виртуальной) системе.
Почему у нас такая разница? И как я могу заставить свою основную систему вести себя как (виртуальная) система, в которой пакет установлен «автоматически»?
Вывод команды
apt-cache policy gir1.2-gstreamer-1.0
в моей "основной" системе выглядит так:
gir1.2-gstreamer-1.0:
Installed: 1.20.1-1
Candidate: 1.20.3-0ubuntu1
Version table:
1.20.3-0ubuntu1 500 (phased 30%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
*** 1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
100 /var/lib/dpkg/status
А на моей "вторичной" (виртуальной) системе так:
gir1.2-gstreamer-1.0:
Installed: 1.20.1-1
Candidate: 1.20.1-1
Version table:
1.20.3-0ubuntu1 1 (phased 30%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
*** 1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
100 /var/lib/dpkg/status
Что означает значение
500
(в
(phased...
линия) имеется в виду?
В обеих системах
grep -ri phased /etc/apt
ничего не возвращает.
После команды
sudo apt update && sudo apt upgrade gir1.2-gstreamer-1.0
был выполнен в моей основной системе:
$ sudo apt --installed list | grep gir1.2-gstreamer-1.0
[...]
gir1.2-gstreamer-1.0/jammy-updates,now 1.20.3-0ubuntu1 amd64 [installed]
$ apt-cache policy gir1.2-gstreamer-1.0
gir1.2-gstreamer-1.0:
Installed: 1.20.3-0ubuntu1
Candidate: 1.20.3-0ubuntu1
Version table:
*** 1.20.3-0ubuntu1 500 (phased 40%)
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Теперь в моей вторичной системе я тоже начал получать это:
$ sudo apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
language-pack-gnome-en
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
3 ответа
Поэтапные обновления — это функция безопасности
- Некоторые пользователи сначала получают обновленные пакеты и имеют возможность сообщить о сломанном пакете, вместо того, чтобы все сразу получили сломанный пакет, а миллионы пользователей ломали головы.
Это для вашей защиты. Не пытайтесь перехитрить его.
- Сохраненные пакеты из-за поэтапных обновлений автоматически разрешатся, загрузятся и установятся в течение недели или около того.
Большинство пользователей не должны НИЧЕГО ДЕЛАТЬ. Он не сломан . Не пытайтесь форсировать обновления. Просто наберитесь терпения и дайте системе работать.
Диагностика — как определить, является ли причиной поэтапное обновление:
- Это просто. Бежать
на одном из ваших задержанных пакетов. Ищите «поэтапный» процент. Он присутствует только в том случае, если пакет в настоящее время фазируется.
$ apt-cache policy gir1.2-gstreamer-1.0
gir1.2-gstreamer-1.0:
Installed: 1.20.3-0ubuntu1
Candidate: 1.20.3-0ubuntu1
Version table:
*** 1.20.3-0ubuntu1 500 (phased 40%) <----------------- There it is!
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
100 /var/lib/dpkg/status
1.20.1-1 500
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Расширенное использование
- Поэтапные обновления можно отключить — это простая настройка, но имейте в виду, что вы отключаете функцию, которая защищает вас от получения поврежденных пакетов. ВЫ предлагаете протестировать эти пакеты!
- Пользователи с несколькими машинами могут совместить их по фазе — это еще одна простая подходящая настройка.
Пример обоих вариантов:
cat <<EOF > /etc/apt/apt.conf.d/80PhasedUpdates
// Enable/Disable phased updates
// Default is Phased Updates enabled. Use these lines to disable.
APT::Get::Never-Include-Phased-Updates: True;
Update-Manager::Never-Include-Phased-Updates;
// To have multiple your machines phase the same, set the same
// string in this field on all those machines
// If commented out or missing, apt will use /etc/machine-id to
// seed the random number generator
APT::Machine-ID "aaaabbbbccccddddeeeeffff";
EOF
Также см. В какой файл конфигурации `apt` следует поместить флаг Never-Include-Phased-Updates?
Конечно, возможно, разница заключается в системе поэтапных обновлений . Посмотрите, будут ли пакеты вести себя одинаково на обеих машинах, если вы запустите эту команду на обеих машинах.
cat <<EOF > /etc/apt/apt.conf.d/80my
APT::Get::Always-Include-Phased-Updates "1";
EOF
Дополнительные сведения о поэтапных обновлениях
Поэтапные обновления в APT в 21.04
APT теперь реализует поэтапные обновления. Раньше только update-manager реализовывал поэтапные обновления...
Это означает, что некоторые обновления будут задерживаться на некоторых машинах, пока они устанавливаются поэтапно. Это определяется значением, полученным из идентификатора машины, имени пакета и версии пакета.
Man-страница для apt_preferences
APT понимает поле Phased-Update-Percentage, которое можно использовать для управления развертыванием новой версии. Это целое число от 0 до 100.
Если у вас есть несколько систем, на которые вы хотите получать один и тот же набор обновлений, вы можете установить для APT::Machine-ID значение UUID, чтобы все они выполнялись одинаково, или установить APT::Get::Never-Include-Phased. -Updates или APT::Get::Always-Include-Phased-Updates в значение true, чтобы APT никогда/всегда не рассматривал поэтапные обновления.
На странице руководства также указано, что версии, которые «не поэтапны», получат
priority 1
, который соответствует вашему
apt-cache policy
выход.
Мне пригодился следующий метод
sudo apt install --only-upgrade <package_name>
См.: https://itsfoss.com/following-packages-have-been-kept-back/