Как заставить «пакеты, [которые] были сохранены», устанавливаться [как] «автоматически»?

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/

Другие вопросы по тегам