缓解 unattended-upgrade 不终止的问题
unattended-upgrade 是 Debian 和基于 Debian 的发行版的自动软件升级工具,用于后台静默安装安全更新,而默认设置下不安装功能更新。
博主的电脑关机时不时卡在 unattended-upgr ,而每次使用 Magic Sysrq 强制关机也不是长久之计,于是先分析 unattended-upgrade 在干什么:
用 strace
附加到 unattended-upgr 上,发现它并没有和我的预测一样阻塞在某个 IO 操作上,而是不断试图访问并不存在的 apt 源文件,在不断尝试后也没有停止运行,而是继续运行,直到阻止关机。
权宜解决办法( workaround )
解决不了问题?那就解决制造问题的程序。sudo dpkg-reconfigure unattended-upgrade
直接关闭自动更新,从此这个问题不再出现。
分析
根据 Debian Wiki , 用unattended-upgrade -d
可以手动运行此程序以进行调试。
在 apt update
后(解决没有软件包数据库文件的问题)
ignoring ver libc6-dev=2.31-0experimental2 with priority < 0
ignoring ver libaudit1=1:3.0~alpha9-1 with priority < 0
ignoring ver g++=4:10-1 with priority < 0
ignoring ver cpp=4:10-1 with priority < 0
ignoring ver libaudit-common=1:3.0~alpha9-1 with priority < 0
ignoring ver libgnutls30=3.6.14-3 with priority < 0
ignoring ver libc-dev-bin=2.31-0experimental2 with priority < 0
ignoring ver gcc=4:10-1 with priority < 0
ignoring ver libc6=2.31-0experimental2 with priority < 0
adjusting candidate version: libpolkit-gobject-1-0=0.105-26
ignoring ver perl-base=5.32.0-2 with priority < 0
ignoring ver dbus=1.13.18-1 with priority < 0
adjusting candidate version: dbus=1.12.20-1
ignoring ver mariadb-common=1:10.4.13-1~exp1 with priority < 0
ignoring ver libselinux1=3.1~rc1-1 with priority < 0
ignoring ver libdbus-1-3=1.13.18-1 with priority < 0
adjusting candidate version: libdbus-1-3=1.12.20-1
ignoring ver libmariadb3=1:10.4.13-1~exp1 with priority < 0
ignoring ver libsepol1=3.1~rc1-1 with priority < 0
package akonadi-contacts-data upgradable but fails to be marked for upgrade (E:Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.)
sanity check failed for: set()
falling back to adjusting acct's dependencies recursively
原来是存在依赖问题,而这个依赖问题很可能是长期不更新导致的,因为博主的电脑有段时间确实在吃灰……虽然 apt 使用更智能的方式处理包依赖关系,但是也架不住长期不更新。
注:
- 各 Linux 发行版的更新功能基本上远好于 Windows 10 —— 没有“智能”的自动重启,更新完全掌控在用户手上;不需要重启(除了内核更新,当然,用了 livepatch 除外);可以知道在处理哪一个软件包而不是被一个百分比和“这需要一点时间”(其实是几个小时,尤其是当你没有备用电脑的时候)敷衍
- 即便如此,非常不建议在桌面环境下进行全系统更新。更新时,你会发现桌面的应用图标消失,甚至应用窗口直接蒸发。如果终端窗口蒸发了,更新会直接终止——最好在 tty 上更新,实在不行也要用 tmux 之类的终端复用器——即使终端被关了,里面的进程仍旧正常运行,而不会被 SIGHUP 中止。
- 对滚动更新的发行版(例如 Arch Linux,Debian 的 stable,testing,unstable,experimental 版本):避免长期不更新。