apt/unattended-upgrades 停止关闭

gar*_*136 14 apt shutdown unattended-upgrades 16.04

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都没有显示关闭过程(我相信是因为文件系统已经卸载了)

有没有其他人看到或修复过这个问题?疯狂地试图解决它。

小智 13

环顾四周以接近根本原因

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

我确定了相应的文件:

find /etc/systemd -name *unattended*
Run Code Online (Sandbox Code Playgroud)

这给了我相关的 systemd 脚本:

/etc/systemd/system/shutdown.target.wants/unattended-upgrades.service
Run Code Online (Sandbox Code Playgroud)

然后告诉我关闭时执行的脚本:

/usr/share/unattended-upgrades/unattended-upgrade-shutdown
Run Code Online (Sandbox Code Playgroud)

深入调查以找出根本原因

在此脚本中,第 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):
Run Code Online (Sandbox Code Playgroud)

问题:它需要关键字“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/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/无人值守升级关机 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", False):
+ if apt_pkg.config.find_b("Unattended-Upgrade::InstallOnShutdown", false):
         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

  • apt_pkg.config.find_b() 返回一个布尔值而不是一个字符串。“find_b(key[, default=False]) → bool 返回存储在 key 中的布尔值,或者如果请求的选项未设置,则返回 bool 对象默认给出的值。” https://apt.alioth.debian.org/python-apt-doc/library/apt_pkg.html#apt_pkg.config.find_b 所以这不是 unattended-upgrade-shutdown 中的错误,因为检查 False 是正确的。 (5认同)