apt / unattended-upgrades останавливает остановку

13

При unattended-upgradesустановке 9 из 10 отключений / перезагрузок зависают при «запуске автоматического отключения обновлений». Это зависание останавливает процесс выключения на 5-10 минут.

Если я отключаю необслуживаемые обновления через /etc/apt/apt.conf.d/20auto-upgrades and/or 50unattended-upgrades, возникают проблемы.

Если я прерываю службу до завершения работы / перезагрузки ( sudo service unattended-upgrades stop), проблема все равно возникает.

Если я удаляю пакет ( sudo apt remove unattended-upgrades), проблема больше не возникает.

Это происходит в только что установленной версии Ubuntu Server 16.04.1(обе unattended-upgradesустанавливаются с помощью графического интерфейса установки или установки автоматических обновлений вручную)

Оба Kern.log & syslogне показывают процесс завершения работы (я полагаю, потому что файловые системы уже размонтированы)

Кто-нибудь еще видел или исправил эту проблему? Схожу с ума, пытаясь устранить неисправность.

garullon245136
источник
Невозможно воспроизвести в тестовой виртуальной машине 16.04.1. Отключение здесь не задерживается.
user535733
Может ли это быть аппаратное обеспечение? Я не совсем уверен, что происходит unattended-upgradesво время выключения.
garullon245136
Мне интересно, почему uu всегда работает во время выключения: uu не демон; это просто скрипт, который запускается на короткое время один раз в день, а затем завершается.
user535733
Кажется, что процесс выключения пытается запустить uu на этапе, когда все файловые системы отключаются. Это не контролируется ссылками /etc/rc6.d/ или /etc/rc0.d/, как Я удалил все ссылки, и процесс все еще работает во время завершения работы.
garullon245136
1
Найдите в /etc/apt/apt/conf.d/50unattended-upgrades опцию «запускать при выключении» (около строки 25). Убедитесь, что это «ложь» или закомментировано.
user535733

Ответы:

14

Оглядываясь вокруг, чтобы приблизиться к основной причине

Проблема, кажется, в скрипте, работающем при выключении.

Я идентифицировал соответствующий файл с:

find /etc/systemd -name *unattended*

который дает мне связанный скрипт systemd:

/etc/systemd/system/shutdown.target.wants/unattended-upgrades.service

который затем сказал мне скрипт, выполняемый при выключении:

/usr/share/unattended-upgrades/unattended-upgrade-shutdown

Расследование глубже, чтобы найти причину

в этом сценарии есть раздел в строке 120, относящийся к разделу в /etc/apt/apt.conf.d/50unattended-upgrades -> Unattended-Upgrade :: InstallOnShutdown

Строка 120 / usr / share / unattended-upgrades / unattended-upgrade-shutdown:

if apt_pkg.config.find_b("Unattended-Upgrade::InstallOnShutdown", False):

Проблема: он ожидает ключевое слово «False», тогда как в apt conf мы должны добавить «false» (точное сравнение строк)!

Решение

Я смог исправить / обойти остановку 3 разными способами:

Обходной путь A

  • напишите «False» вместо «false» в /etc/apt/apt.conf.d/50unattended-upgrades

Этот параметр безопасен при обновлении до тех пор, пока не будет предоставлено реальное исправление, поскольку изменяемый нами файл не перезаписывается обновлением необслуживаемых обновлений. Проблема: Когда основная причина будет устранена, это снова приведет к остановке, поэтому я предлагаю объединить это с обходным решением B.

ИЛИ: Обходной путь B

  • уменьшите время ожидания в /etc/systemd/system/shutdown.target.wants/unattended-upgrades.service со значения по умолчанию до 15 секунд:

vim /etc/systemd/system/shutdown.target.wants/unattended-upgrades.service

[Обслуживание]
Тип = OneShot
ExecStart = / USR / доли / необслуживаемое-обновление / без присмотра-обновления-выключение
TimeoutStartSec = 15

Этот параметр НЕ является безопасным для обновления, поскольку изменяемый нами файл может быть перезаписан обновлением unattended-upgrades. Кроме того, это очень далеко от исправления чего-либо, но это гарантирует, что ваша система не будет ждать несколько минут при завершении работы. Имейте в виду, что после обновления необслуживаемых обновлений вам, возможно, придется установить это снова!

ИЛИ: исправление С (должно быть сообщено вверх по течению)

  • исправьте / usr / share / unattended-upgrades / unattended-upgrades-shutdown для ожидания «ложь» вместо «ложь»

исправления / usr / share / unattended-upgrades / unattended-upgrade-shutdown:

--- / tmp / unattended-upgrade-shutdown 2017-02-03 14: 53: 03.238103238 +0100
+++ / tmp / unattended-upgrade-shutdown_fix 2017-02-03 14: 53: 17.685589001 +0100
@@ -117,7 +117,7 @@
     # запустить его
     р = нет
     apt_pkg.init_config ()
- if apt_pkg.config.find_b («Unattended-Upgrade :: InstallOnShutdown», False):
+ если apt_pkg.config.find_b («Unattended-Upgrade :: InstallOnShutdown», false):
         env = copy.copy (os.environ)
         env ["UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN"] = "1"
         logging.debug («запуск автоматических обновлений в режиме выключения»)

Вывод

Только последнее - настоящее решение. оба других варианта - просто обходные пути, пока не будет реализовано реальное исправление.

Это должно быть сделано в апстриме, и это влияет как на Debian (протестирован на Debian Stretch), так и на Ubuntu (протестирован на Ubuntu 16.04.1) для обоих дистрибутивов.

Я открыл отчет об ошибке здесь: https://bugs.launchpad.net/ubuntu/+source/unattended-upgrades/+bug/1661611

steadfasterX
источник
2
apt_pkg.config.find_b () возвращает логическое значение, а не строку. "find_b (key [, default = False]) → bool Возвращает логическое значение, сохраненное в ключе, или значение, заданное объектом bool по умолчанию, если запрошенная опция не установлена." apt.alioth.debian.org/python-apt-doc/library/… Таким образом, это не ошибка автоматического выключения-обновления, так как проверка на False верна.
Брайан Мюррей
Как увидит любой, кто следует по вышеуказанной ссылке на отчет об ошибке Launchpad, эта проблема на самом деле не была вызвана ошибочным сравнением строк, а вместо этого была связана с ошибкой системного секвенирования, которая, как сообщается, теперь исправлена .
Сампаблокупер
1

В качестве обходного пути я использую этот сценарий, чтобы исправить это:

#!/usr/bin/env bash

sed -i '/if apt_pkg.config.find_b/s/False/false/' /usr/share/unattended-upgrades/unattended-upgrade-shutdown

exit

Надеюсь, это скоро будет передано.

каракал
источник