在 Debian 和 Ubuntu 上通过无人值守升级进行自动更新
在此页
- 适合忙碌的管理员的简单方法
- 在哪里可以找到文档
- 高级配置
- 发送电子邮件
- 添加存储库
- 控制时间
- 自动重启
Linux 版本经常获得更新,应及时安装安全更新。 Debian 和 Ubuntu 使用 APT 系统,虽然手动安装所有待定更新相对容易,但管理员可能不记得这样做或者更喜欢晚上睡觉而不是检查更新。本文主要针对服务器安装。
使用无人值守升级时,仍然可以使用 apt upgrade 手动更新和安装软件包。如果从命令行使用 apt 时由无人值守升级启动的升级恰好正在运行,则 apt 系统会通知用户操作已经在进行中,用户必须等到它完成才能继续发出 apt 命令。
忙碌的管理员的简单方法
安装无人值守升级,检查它是否已启用,并从日志文件监控它们的工作。
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
dpkg-reconfigure - 命令显示对话框询问是否自动下载和安装稳定的安全更新。检查它是否回答是。
无人值守升级每天随机检查两次更新,并安装稳定的安全更新。
通过读取目录 /var/log/unattended-upgrades/ 和文件 /var/log/dpkg.log 中的日志文件来监控正在发生的事情。
在哪里可以找到文档
配置文件/etc/apt/apt.conf.d/50unattended-upgrades 在注释中有文档。本文档从现在起将该文件称为 50unattended-upgrades。
自述文件 /usr/share/doc/unattended-upgrades/README.md.gz 包含有用的说明。它可以用命令 zless(可从包 gzip 获得)读取。本文档从现在起将该文件称为 README。
Debian wiki 有一个页面 https://wiki.debian.org/UnattendedUpgrades。
Ubuntu 服务器文档页面有一章关于无人值守升级的“自动更新”。
无人值守升级手册页,man 无人值守升级。
高级配置
使用简单的方法,您会注意到并非所有升级都是自动安装的。除了安装更新之外,您可能还希望更好地控制自动发生的事情。
配置文件 /etc/apt/apt.conf.d/50unattended-upgrades 在注释中包含文档,因此请阅读该文件以检查可用的配置。非常有用的是配置无人值守升级以在发生某些事情时发送电子邮件。
重要的是要知道配置文件是由 unattended-upgrades 包安装或升级创建的,因此当 unattended-upgrades 本身升级或进入下一个操作系统版本时,在此文件中进行的编辑会导致必须手动解决的冲突。文档文件 README 建议创建文件 52unattended-upgrades-local 而不是修改原始配置文件。
如果需要,您可以检查文件 /etc/apt/apt.conf.d/20auto-upgrades 是否包含以下行:
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";
如果您运行 dpkg-reconfigure -command 并回答是,那么这些行应该在那里。这些行控制启用无人值守升级。
发送电子邮件
要发送电子邮件才能工作,主机必须有一个可以发送电子邮件的工作电子邮件系统。先验证一下。
通过编辑配置文件 52unattended-upgrades-local 启用从无人值守升级发送电子邮件(如果目录 /etc/apt/apt.conf/ 中不存在该文件,则创建该文件)。复制行
//Unattended-Upgrade::Mail "";
来自 50unattended-upgrades,取消注释,并在 \-引号之间添加目标电子邮件地址。
还有一个设置可以配置在无人参与升级时是否始终发送电子邮件,或者仅在出现错误时发送。
// Set this value to "true" to get emails only on errors. Default // is to always send a mail if Unattended-Upgrade::Mail is set //Unattended-Upgrade::MailOnlyOnError "false";
如果要更改设置,请将这些行复制到 52unattended-upgrades-local,取消注释设置行并将“false”更改为“true”。
检查与
unattended-upgrade --dry-run -d
修改配置文件后是个好主意。
至少在 Debian 10、11 和 Ubuntu 22.04 上,无人值守升级安装会在目录 /usr/bin/ 和/或 /bin/ 中生成符号链接无人值守升级到无人值守升级,因此这两个命令的工作原理相同。
$ ls -lhi /bin/unattended-upgrade* 11404505 -rwxr-xr-x 1 root root 98K tammi 15 2022 /bin/unattended-upgrade 11407087 lrwxrwxrwx 1 root root 18 tammi 15 2022 /bin/unattended-upgrades -> unattended-upgrade
添加存储库
通过向 Unattended-Upgrade::Origins-Pattern 添加行来添加要自动更新的存储库。配置文件中有关于此的文档。
README 指示后面的配置文件 52unattended-upgrades-local 中的设置覆盖默认设置。我尝试发现设置 Unattended-Upgfade::Origins-Pattern 并没有完全覆盖默认文件中的设置,而是将其添加到默认值中。所以没有必要复制完整的默认 Unattended-Upgrade::Origins-Pattern,可以添加它。
例如,当从官方 GoAccess 存储库安装包 goaccess 时,它不会自动升级。如果它是从通常的 Debian 存储库安装的(两者都可用),它将自动升级。将 GoAccess 存储库添加到 Origins-Pattern 使无人值守升级进行升级。
使用 apt list --upgradable 检查情况:
:~# LANG=C apt list --upgradable Listing... Done goaccess/unknown 2:1.6.3-buster amd64 [upgradable from: 2:1.6.2-buster] php-tcpdf/buster-backports 6.5.0+dfsg1-1~bpo10+1 all [upgradable from: 6.3.5+dfsg1-1~bpo10+1] :~#
所以有两个包没有通过无人值守升级自动升级。检查 goaccess 显示它来自 GoAccess Official Repository(以及来自通常的 Debian 存储库的旧版本)。
:~# LANG=C apt policy goaccess goaccess: Installed: 2:1.6.2-buster Candidate: 2:1.6.3-buster Version table: 2:1.6.3-buster 500 500 https://deb.goaccess.io buster/main amd64 Packages *** 2:1.6.2-buster 100 100 /var/lib/dpkg/status 1:1.2-4+b10 500 500 http://mirror.hetzner.de/debian/packages buster/main amd64 Packages 500 http://deb.debian.org/debian buster/main amd64 Packages :~#
运行 unattended-upgrade --dry-run -d 显示未安装的软件包的来源。这可能有助于找出需要添加到 Origins-Pattern 中的内容。
检查最新运行的无人值守升级的日志显示了自动升级时考虑的来源:
2022-09-05 08:28:08,955 INFO Checking if system is running on battery is skipped. Please install powermgmt-base package to check power status and skip installing updates when the system is running on battery. 2022-09-05 08:28:08,960 INFO Initial blacklist : 2022-09-05 08:28:08,960 INFO Initial whitelist: 2022-09-05 08:28:08,960 INFO Starting unattended upgrades script 2022-09-05 08:28:08,960 INFO Allowed origins are: origin=Debian,codename=buster,label=Debian, origin=Debian,codename=buster,label=Debian-Security
GoAccess 存储库还不存在,所以现在我将它添加到 /etc/apt/apt.conf.d/52unattended-upgrades-local。
顺便说一句,如果您在笔记本电脑上安装了无人值守升级,请考虑安装 powermgmt-base。使用电池供电时,无人值守升级不会启动升级,如日志中的信息消息所示。如果在始终在线电源上运行的服务器上运行,则该信息消息不再显示为 Unattended-Upgrade::OnlyOnACPower \false\;添加到配置中。
Unattended-Upgrade::Origins-Pattern { // Taleman added GoAccess 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository"; }; Unattended-Upgrade::OnlyOnACPower "false";
apt 策略没有为 GoAccess 显示字段 a,所以我使用了 o、n 和 l。在自述文件中查找有关这些字段的信息。
包含 lsb_release -i 输出的 $ {distro_id} 和包含 lsb_release -c 输出的 $ {distro_codename} 支持变量替换。所以我可以写成 n=$ {distro_codename} 而不是 n=buster。
有两个包没有自动升级,另一个还没有升级的是php-tcpdf。它当然可以用 apt upgrade 升级,但它可以添加到 unattended-upgrades 以自动升级。该过程与 goaccess 相同。
首先检查apt policy php-tcpdf 的情况。这表明它是从 Debian 存储库部分 buster-backports 安装的。
从 unattended-upgrades.log 可以看出 buster-backports 不在允许的来源之列。它在 50unattended-upgrades 文件中,但被注释掉了。要启用它,请复制该行
// "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
到 Origins-Pattern 设置中的 52unattended-upgrades-local 并取消注释。
编辑文件后,使用 unattended-upgrades --dry-run -d 检查添加的存储库现在位于 \Allowed origins\ 中,并且 php-tcpd 位于将要升级的包中。
控制次数
无人值守升级随机运行以减轻存储库服务器上的负载。这是为了避免所有主机同时开始更新时发生的大负载峰值。如果您决定改变这种行为,请仔细考虑。如果您运行自己的存储库或镜像存储库,那么负载峰值会冲击您的存储库服务器,并且您可以避免惹恼 Internet 上的存储库管理员。
systemd 控制无人值守升级的开始时间。文件 /lib/systemd/system/apt-daily.timer 有定时器部分,每天两次启动 apt 下载活动,随机延迟 12 小时。我建议你不要修改这个,或者有很好的修改理由。
其余时间配置在 50unattended-upgrades 和 52unattended-upgrades-local 文件中完成。
设置 Unattended-Upgrade::Update-Days 控制每周无人值守升级运行的天数。默认为空,表示每天运行。例如,它可以配置为仅在周六和周日运行。
自动重启
当安装的更新需要重新启动时,可以将无人值守升级设置为重新启动。这可以配置为立即发生或在期望的时间发生。这些配置使用设置
//Unattended-Upgrade::Automatic-Reboot "false"; //Unattended-Upgrade::Automatic-Reboot-WithUsers "true"; //Unattended-Upgrade::Automatic-Reboot-Time "02:00";
默认为不自动重启。如果您将设置更改为 \true\,则在安装升级后会立即重新启动。如果安装了需要重新启动的更新,则可以将自动重新启动时间设置为在所需时间进行重新启动。
黑名单、白名单
黑名单可防止包升级,否则该包将通过无人值守升级进行升级。设置 Package-Blacklist 包含正则表达式。如果包名称匹配,则将其排除在自动升级之外。
我没有使用过这个功能,我认为如果运行一个开发版本可以防止关键包的自动升级是有意义的,它可能会更有用。 50unattended-upgrades 配置文件提供了列入黑名单的包的示例。
自述文件讲述了 Package-Whitelist 设置。描述说\“只有与此列表中的正则表达式匹配的包才会被标记为升级。\”。它没有提供示例来阐明在哪些情况下需要设置白名单。从我的实验来看,将包添加到白名单似乎意味着只有那些包会自动升级,没有别的。
结论
现在您知道无人值守升级可以做什么以及如何让它做您想做的事了。
在某些情况下,无人值守升级不会执行升级,因为命令 apt upgrade 保留了一个包。当升级将删除包或安装以前卸载的包时,会发生这种情况。要进行升级,请使用命令 apt full-upgrade 自行完成,该命令可以删除软件包或安装以前未安装的新软件包。如果将无人值守升级配置为发送电子邮件,则该电子邮件包含以下行
Packages with upgradable origin but kept back:
来自我的一位主机的 52unattended-upgrades-local 的最后一个例子:
Unattended-Upgrade::Origins-Pattern { // Taleman added 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository"; "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports"; "origin=deb.sury.org,archive=${distro_codename}"; }; Unattended-Upgrade::Mail ""; Unattended-Upgrade::OnlyOnACPower "false";