apt /无人值守升级使关机停顿


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通过安装GUI进行安装或通过无人参与的升级手动安装)

两者Kern.log & syslog都没有显示关闭过程(我相信是因为文件系统已经卸载)

是否有其他人看到或解决了此问题?疯狂尝试对其进行故障排除。


无法在16.04.1测试VM中复制。关机不延迟。
user535733 '17

难道是基于硬件的?我不完全了解unattended-upgrades关机期间会发生什么。
garullon245136 '02

我想知道为什么uu在关闭时总是运行:uu不是守护进程;它只是每天短暂运行一次然后终止的脚本。
user535733 '02

在所有文件系统都被卸载的阶段,关闭进程似乎试图运行uu。这似乎不受/etc/rc6.d/或/etc/rc0.d/链接的控制,因为我删除了所有链接,并且该过程在关机期间仍然运行。
garullon245136 '02

1
在/etc/apt/apt/conf.d/50unattended-upgrades中查找“在关机时运行uu”选项(第25行附近)。确保它为“假”或已注释掉。
user535733 '02

Answers:


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中的部分相关

/ usr / share / unattended-upgrades / unattended-upgrade-shutdown的第120行:

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

问题:它期望关键字“ False”,而在apt conf中,我们应该添加“ false”(精确的字符串比较)!

我可以通过3种不同的方式修复/解决停机问题:

解决方法A

  • 在/etc/apt/apt.conf.d/50unattended-upgrades中写“ False”而不是“ false”

此设置在提供真正的修补程序之前是安全的,因为我们在此处更改的文件不会因无人值守的升级而被覆盖。问题:根本原因得到解决后,这将导致停机再次停止,因此我建议将其与解决方法B结合使用。

或:解决方法B

  • 将/etc/systemd/system/shutdown.target.wants/unattended-upgrades.service中的等待时间从默认值减少到15秒:

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

[服务]
类型=单发
ExecStart = / usr / share / unattended-upgrades / unattended-upgrade-shutdown
TimeoutStartSec = 15

此设置并非安全升级,因为我们在此处更改的文件可能会因无人值守升级而被覆盖。除此之外,它确实还不能解决问题,但可以确保系统在关闭时不会等待几分钟。请记住,在无人值守升级之后,您可能必须重新设置!

或:修复C(必须在上游报告)

  • 修复/ usr / share / unattended-upgrades / unattended-upgrades-shutdown以期望“ false”而不是“ False”

修补/ 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 @@
     # 运行
     p =无
     apt_pkg.init_config()
-如果apt_pkg.config.find_b(“ Unattended-Upgrade :: InstallOnShutdown”,否):
+如果apt_pkg.config.find_b(“ Unattended-Upgrade :: InstallOnShutdown”,否):
         env = copy.copy(os.environ)
         env [“ UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN”] =“ 1”
         logging.debug(“在关机模式下启动无人值守的升级”)

结论

tbh只有最后一个才是真正的解决方案。其他两个选项只是解决方法,直到实施真正的修复。

这必须在上游完成,因为这会影响两个发行版的Debian(在Debian Stretch上测试)和Ubuntu(在Ubuntu 16.04.1上测试)。

我在这里打开了一个错误报告:https : //bugs.launchpad.net/ubuntu/+source/unattended-upgrades/+bug/1661611


2
apt_pkg.config.find_b()返回布尔值而不是字符串。“” find_b(key [,default = False])→bool返回存储在key处的布尔值,或者如果未设置请求的选项,则由bool对象默认给定的值。 apt.alioth.debian.org/python-apt-doc/library/… 因此在无人值守升级关机中不是错误,因为检查False是正确的。
Brian Murray

遵循上述Launchpad错误报告链接的任何人都将看到,该问题实际上并非由字符串比较失败引起的,而是由于系统级排序错误已引起的,据报道,该错误现已修复
sampablokuper

1

作为解决方法,我使用此脚本对其进行修复:

#!/usr/bin/env bash

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

exit

希望它将很快成为上游。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.