环顾四周,寻找根本原因

环顾四周,寻找根本原因

安装后unattended-upgrades,10 次关机/重启中有 9 次会在“启动无人值守升级关机”时挂起。此挂起会使关机过程停滞 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.1unattended-upgrades通过安装 GUI 或手动安装无人值守升级安装)

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

有其他人遇到或修复过这个问题吗?我快疯了,想解决它。

答案1

环顾四周,寻找根本原因

问题似乎出在关机时运行的脚本。

我识别了相应的文件:

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

[服务]
类型=oneshot
ExecStart=/usr/share/无人值守升级/无人值守升级关闭
超时开始时间=15

此设置不适用于升级,因为我们在此处更改的文件可能会被无人值守升级的更新覆盖。除此之外,它确实无法修复某些问题,但它可以确保您的系统在关闭时不会等待几分钟。请记住,在无人值守升级后,您可能需要再次设置它!

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

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

修补/usr/share/unattended-upgrades/unattended-upgrade-shutdown:

--- /tmp/无人值守升级关闭 2017-02-03 14:53:03.238103238 +0100
+++ /tmp/无人值守升级-关闭_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", False):
+ 如果 apt_pkg.config.find_b("无人值守升级::InstallOnShutdown", false):
         env = 复制.复制(os.environ)
         环境[“UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN”] = “1”
         logs.debug("在关机模式下启动无人值守升级")

结论

老实说,只有最后一个才是真正的解决方案。其他两个选项都只是解决方法,直到真正的解决方案得以实施。

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

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

答案2

答案3

作为一种解决方法,我使用这个脚本来修复它:

#!/usr/bin/env bash

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

exit

希望它能很快被上游。

相关内容