新手上路第一课通常是改 SSH 端口、配防火墙,却很少有人提一件更基础的事:apt update && apt upgrade 这条命令,你打算手动敲到什么时候?漏洞公告不会等你。一个耐心的扫描器盯上你的 22 端口,只需要你偷懒的那几周。
unattended-upgrades 解决的就是这件事:安全补丁自动下载、自动安装,其余升级留给人工。它是 Ubuntu 服务器版预装组件,极低资源开销,7×24 无监督运行。张力问题只有一个——这个默认可能没开启的机制,要怎么配置才能既补上安全洞,又不把生产环境搅乱。密钥登录的加固见 SSH 密钥认证,日志轮转见 logrotate 配置详解。
第一步:先确认它到底装没装、开没开
「预装」和「启用」是两回事。最小安装的云镜像、或者装完又被面板改过 apt 配置的机器,都可能处于没启用状态。上机第一件事是查状态:
dpkg -l unattended-upgrades # 确认包已安装
systemctl status apt-daily-upgrade.timer # 执行入口的调度器
第二条里 timer 处于 waiting 状态还不够——unattended-upgrades 包在但配置层可以关。用 dpkg 的对话式配置确认:
sudo dpkg-reconfigure unattended-upgrades
弹出「自动下载并安装稳定版更新?」选「是」即可。它做的事写在 /etc/apt/apt.conf.d/20auto-upgrades:APT::Periodic::Update-Package-Lists "1" 与 APT::Periodic::Unattended-Upgrade "1",分别是「每天刷新索引」和「每天跑升级」。这两个值是整个机制的开关,后续所有配置都以它开启为前提。
手动检查一次也能确认:
apt-config dump APT::Periodic::Unattended-Upgrade
输出 APT::Periodic::Unattended-Upgrade "1"; 即已启用。
它按什么节奏干活:两个 timer,两个动作
这套机制由两个 systemd timer 驱动,分工明确:
| 单元 | 职责 | Ubuntu 24.04 默认时机 |
|---|---|---|
apt-daily.timer | 刷新 apt 索引(相当于自动 apt update) | 每天 6:00 与 18:00,含随机延迟 |
apt-daily-upgrade.timer | 执行 unattended-upgrades 真正装包 | 每天 6:00 起触发,随机延迟最长 60 分钟 |
先说为什么有随机延迟:几千台机器同时在整点打更新会瞬间压垮镜像站,所以官方用 RandomizedDelaySec 把触发点打散。这也解释了一个常见困惑——为什么补丁不是准点装上。它装完才算数,不是到点就算数。
想固定在自己的空闲时段(比如凌晨四点),别去改 /lib/systemd/system/ 下的原始文件,用 override:
sudo systemctl edit apt-daily-upgrade.timer
写入:
[Timer]
OnCalendar=
OnCalendar=*-*-* 04:00
RandomizedDelaySec=15m
第一行的空 OnCalendar= 清掉默认值,这是 systemd override 的固定写法。生效后 systemctl list-timers apt-daily-upgrade.timer 能看到下次触发时间。改动属于全局时间预算的小调整,机制本身见 cron vs systemd timer 选型。
配置文件怎么写:白名单决定了它敢装什么
行为配置集中在 /etc/apt/apt.conf.d/50unattended-upgrades。默认文件几百行注释加一小段生效配置,核心是这段「源白名单」:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
};
${distro_id} 展开为 Ubuntu,${distro_codename} 展开为 noble。这两行默认生效,含义是:只装官方仓库和 security 源的更新。功能更新(-updates)、backports、第三方仓库、Docker 或 Google 的官方源,一概不碰。
这就是它敢无人监督运行的原因。要不要放开 -updates 按需决定:
| 策略 | Allowed-Origins 额外行 | 后果 |
|---|---|---|
| 保守(默认) | 无 | 只补 CVE,其余留给人工,行为最可预期 |
| 常规 | "${distro_id}:${distro_codename}-updates"; | 常规修复也自动装,含少量新版本包 |
常规策略的风险在于:-updates 会推带新依赖的包版本,自动装上后服务可能需要重启才有完整效果。安全修复优先,是给生产机器的默认建议。
另外三行高频配置,都在同一个文件里:
// 这些包永远不自动升级
Unattended-Upgrade::Package-Blacklist {
"nginx";
"phpMyAdmin";
};
// 出问题时邮件给谁(需要本机有可用的发信通道)
Unattended-Upgrade::Mail "[email protected]";
// 内核更新后自动重启
Unattended-Upgrade::Automatic-Reboot "false";
黑名单写包名即可,支持通配。邮件项依赖本机 MTA 配置,没有的话跳过,改用下一节的日志巡检。Automatic-Reboot 默认 false,生产机器不要打开——自动重启比晚打补丁更容易出事故,内核补丁装完后择机手动重启更稳。需要重启才能生效的进程可以装 needrestart 包,它会在升级后列出哪些服务该重启。
改完配置别等明天:手动跑一次
一切就绪后,用调试模式验证。-d 会把每一步决策打印到终端:
sudo unattended-upgrade -d --dry-run
--dry-run 只模拟、不真装,输出会显示「检查过的源」「允许的来源」和将要执行的包列表,末尾常见 No packages found that can be upgraded unattended——当前无待装安全更新,属正常。
确认模拟结果没问题,真跑一次:
sudo unattended-upgrade -d
事后有两个地方留痕:
cat /var/log/unattended-upgrades/unattended-upgrades.log
ls /var/log/unattended-upgrades/
log 文件按次追加,记录每次装了什么、跳过什么;ls 里还能看到被 dpkg 中断时留下的快照文件,可用于恢复。装了哪些包,dpkg 自己的账本最全:
grep " install " /var/log/dpkg.log | tail
日常巡检不必每天翻日志,每周看一眼 unattended-upgrades.log 的尾部即可。日志体积本身由 logrotate 接管,不用管。
常见问题
Q:为什么装了补丁,nginx -v 版本号没变?
Ubuntu 的安全更新常以「回移植」(backport)形式发布:修复代码进旧版本号。apt changelog nginx 能看到修复记录。看版本号判断打没打补丁会误判,用 apt list --upgradable 和 changelog 才准。
Q:重启后内核没变,还是旧的?
unattended-upgrades 只负责装。新内核装完后必须重启才会切换,uname -r 对比 /boot 里最新内核版本即可确认。needrestart 会提醒这类「装完待重启」的项。
Q:能连应用本身的升级一起自动化吗?
能,把对应源加进 Allowed-Origins,比如 Docker 官方源写成 "Docker:/noble"——apt policy 输出里每个源都有这样的标签。应用大版本更新不建议进自动名单,安全源之外保持人工审查更稳。
Q:执行到一半断电或 SSH 断开,包管理会不会坏?
apt-daily-upgrade 由 systemd service 拉起,与你的 SSH 会话无关,断开连接不影响执行。dpkg 中断留下的快照在 /var/log/unattended-upgrades/,sudo dpkg --configure -a 可修复中断的配置状态。
Q:和手动 apt upgrade 冲突吗?
不冲突,但别抢锁。自动任务运行时 apt 拿着锁,此时手动 apt install 会报锁占用,等几分钟或 systemctl status apt-daily-upgrade.service 看进度即可。另外它只装白名单内的包,手动升级其余包随时可做。
收尾
最小可行配置三件事:dpkg-reconfigure unattended-upgrades 确认开启,50unattended-upgrades 里保留默认 security 白名单,手动 unattended-upgrade -d --dry-run 跑一次确认输出符合预期。补丁自动化解决的是「你不在场的那几周」,它管不了内核重启和业务大版本——后者依然是人工的活,而且一直是。
把安全源白名单收窄到最小集合、执行时段挪进业务低峰,这台机器的安全下限就不再取决于你记不记得敲 apt upgrade。