ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu关闭更新提醒:三层机制彻底解决弹窗反复问题

Ubuntu关闭更新提醒:三层机制彻底解决弹窗反复问题 1. 为什么“关掉更新提醒”在 Ubuntu 上不是一锤子买卖很多人第一次被 Ubuntu 的更新提醒烦到是因为桌面右上角突然弹出一个对话框或者软件中心图标上多了一个红点提示“有可用更新”。点进去一看要么是内核更新要么是某个无关痛痒的翻译包重启之后又冒出来。于是上网搜“Ubuntu 关闭更新提醒”照着某篇教程敲了一行命令结果要么没生效要么过几天又回来了。这个现象背后其实有个很朴素的原因Ubuntu 的更新提醒不是一个开关控制的而是由三个不同层级的机制共同决定的。桌面环境负责“弹窗和图标提示”APT 的定时任务负责“定期去检查有没有新包”而 APT 的配置文件又决定了“检查完之后要不要告诉你”。你只关掉其中一层另外两层还在跑提醒自然还会以别的形式出现。我自己的习惯是先把这三层的关系理清楚再决定关到哪一层。因为“关闭更新提醒”和“关闭自动更新”是两件完全不同的事。前者只是让系统别来烦你后者是让系统根本不去下载和安装更新。很多人把这两件事混在一起结果要么关得太狠导致安全补丁长期不装要么关得太浅过两天又被弹窗打断。这篇文章就按我实际操作的顺序从桌面 GUI 层、APT 定时任务层、APT 配置文件层这三层往下拆每一层讲清楚它管什么、怎么关、关掉之后会有什么副作用。中间会穿插一些我踩过的坑比如改了配置文件但没重启对应服务导致不生效或者关掉 GUI 提示之后发现命令行登录时还在刷更新信息。适合已经用了一段时间 Ubuntu、被更新提醒反复打扰、想彻底搞清楚这套机制的人。2. 第一层桌面 GUI 的更新提示到底由谁在管2.1 弹窗、红点和通知的区别在动手关之前得先分清楚你看到的“提醒”具体是哪一种。Ubuntu 桌面上的更新提示至少有三种形态它们由不同的组件负责弹窗对话框通常是update-notifier这个程序弹出来的标题类似“软件更新可用”带“现在安装”和“稍后提醒”按钮。顶部面板或 Dock 上的红点/角标由update-notifier配合桌面环境的通知机制渲染比如 GNOME 的 message tray。软件中心Ubuntu Software / GNOME Software里的更新页签由gnome-software自己定期刷新元数据后显示。这三者虽然看起来是一件事但触发路径不一样。弹窗和红点主要归update-notifier管软件中心那个页签归gnome-software管。所以如果你只把update-notifier卸了软件中心里可能还是会有更新条目只是不再主动弹窗。我一般先用下面这条命令确认这几个包在不在dpkg -l | grep -E update-notifier|gnome-software|unattended-upgrades输出里如果有update-notifier和update-notifier-common那弹窗基本就是它干的。unattended-upgrades是另一套东西负责自动安装安全更新后面第三层会细说。2.2 用 GUI 开关能关到什么程度Ubuntu 的“软件和更新”设置里其实有一个现成的开关。打开“软件和更新”切到“更新”页签里面有一项“自动检查更新”下拉框可以选“从不”。这个操作本质上是在改/etc/apt/apt.conf.d/下的配置文件并不是 GUI 自己记了个状态。但这里有个很多人忽略的点这个下拉框只控制“检查”的频率不控制“检查到之后是否提示”。也就是说你选了“从不”APT 的定时任务不再定期去apt update但如果你手动跑了apt update或者某个后台进程触发了更新检查update-notifier依然可能弹窗。所以 GUI 开关适合那种“我不想让它自己定期去查”的场景但如果你想要的是“任何时候都别弹”还得配合后面两层。2.3 直接处理 update-notifier 的两种做法如果你确定不需要任何桌面更新提示最直接的做法是让update-notifier不再随会话启动。有两种做法我倾向于第二种。第一种是卸载sudo apt remove update-notifier update-notifier-common卸载的好处是干净坏处是有些桌面环境比如 Ubuntu 默认的 GNOME会把它作为推荐依赖卸载时可能连带移除一些元包后续大版本升级时可能被重新装回来。第二种是保留但禁用自启。update-notifier的自启入口在/etc/xdg/autostart/下文件名通常是update-notifier.desktop。你可以直接把它移走sudo mv /etc/xdg/autostart/update-notifier.desktop /etc/xdg/autostart/update-notifier.desktop.bak这样包还在系统升级不会因为缺包报错但登录桌面后它不会自己起来。想恢复的时候把文件名改回去就行。我个人更推荐这种因为可逆而且不会动到依赖关系。注意改完 autostart 之后要重新登录一次桌面会话才生效直接在当前会话里 kill 进程只能管这一次。2.4 软件中心那个更新页签怎么处理gnome-software的更新页签是它自己定期刷新元数据后渲染的和update-notifier是两条线。如果你连软件中心里的更新条目也不想看到可以在软件中心的设置里关掉“自动检查更新”或者干脆不用软件中心、改用命令行管理包。我自己的做法是保留gnome-software但关掉它的自动刷新。在“软件和更新”里把“自动检查更新”设为“从不”之后软件中心通常也不会再主动去拉更新列表除非你手动点进去刷新。实测下来这一层和 GUI 开关是联动的不用单独再改。3. 第二层APT 的定时任务才是提醒反复出现的根源3.1 apt-daily 和 apt-daily-upgrade 是什么就算你把桌面提示全关了过一段时间可能还是会发现系统在后台跑apt update日志里能看到apt-daily.service和apt-daily-upgrade.service的记录。这两个是 systemd 的定时单元由apt-daily.timer和apt-daily-upgrade.timer触发。它们的分工是这样的单元作用默认触发时间apt-daily.timer定期执行apt update刷新包索引每天多次带随机延迟apt-daily-upgrade.timer定期执行apt upgrade安装可用更新每天一次带随机延迟apt-daily只刷新索引不装东西apt-daily-upgrade才会真正安装。很多人以为关掉 GUI 就没事了结果apt-daily每天还在跑跑完之后如果update-notifier还在就会弹窗。这就是“关了又回来”的典型原因。3.2 查看当前定时任务状态动手之前先看一眼现状命令很简单systemctl list-timers | grep apt输出会列出apt-daily.timer和apt-daily-upgrade.timer的下次触发时间。如果显示active说明它们正在按计划跑。你也可以单独看某个单元systemctl status apt-daily.timer systemctl status apt-daily-upgrade.timer我一般还会看一眼最近的执行记录确认它确实在跑journalctl -u apt-daily.service --since 3 days ago如果日志里有Starting Daily apt download activities之类的记录那就说明它一直在工作。3.3 停用定时任务的正确顺序停用这两个定时任务顺序很重要。如果你只stop不disable下次重启或者重新触发时它还会起来。正确做法是先停再禁sudo systemctl stop apt-daily.timer sudo systemctl disable apt-daily.timer sudo systemctl stop apt-daily-upgrade.timer sudo systemctl disable apt-daily-upgrade.timer对应的 service 单元一般不用单独 disable因为 timer 不触发它们就不会跑。但如果你想更彻底可以把 service 也 mask 掉sudo systemctl mask apt-daily.service sudo systemctl mask apt-daily-upgrade.servicemask比disable更狠它会创建一个指向/dev/null的符号链接任何试图启动这个单元的请求都会被拒绝。我一般只在确定这台机器完全由我手动控制更新时才用 mask普通场景 disable timer 就够了。提示停用之后apt update不会自己跑了你需要手动执行才能拿到最新的包索引。如果这台机器长期不手动更新装新软件时可能会遇到“找不到包”的情况记得先手动sudo apt update。3.4 停用之后为什么还可能看到更新信息这里有个坑我踩过停掉 timer 之后命令行登录时偶尔还会看到“有 XX 个包可以更新”的提示。这个提示不是update-notifier发的而是/etc/update-motd.d/下的脚本在登录时生成的其中90-updates-available这个脚本会去读 APT 的缓存状态。也就是说只要 APT 的缓存里还留着“有可用更新”的记录登录时就会显示。要让它不显示要么清掉缓存状态要么把那个 motd 脚本去掉执行权限sudo chmod -x /etc/update-motd.d/90-updates-available这个操作不影响更新本身只是让登录横幅不再提这件事。我一般会保留这个提示因为它不弹窗、不打断操作反而能提醒我该手动更新了。但如果你连这个都不想看到去掉执行权限是最省事的办法。4. 第三层APT 配置文件里的更新策略怎么改4.1 apt.conf.d 目录的结构APT 的配置不是集中在一个文件里而是分散在/etc/apt/apt.conf.d/目录下按文件名数字顺序加载后面的覆盖前面的。这个设计的好处是不同来源的配置可以各自成文件互不干扰坏处是你得知道哪个文件在管哪件事。和更新提醒相关的通常是这几个20auto-upgrades控制自动检查更新的频率GUI 里那个下拉框改的就是它。50unattended-upgrades控制无人值守升级的行为决定哪些包自动装。10periodic老版本里管定期任务的新版本里部分功能被 systemd timer 取代。你可以用apt-config dump看当前生效的配置但输出很长我一般直接看具体文件cat /etc/apt/apt.conf.d/20auto-upgrades典型内容是这样APT::Periodic::Update-Package-Lists 1; APT::Periodic::Unattended-Upgrade 1;第一行控制是否定期apt update第二行控制是否自动安装安全更新。把1改成0就是关闭。4.2 改 20auto-upgrades 的实际效果把这两个值都改成0之后APT 的定期行为就停了。但要注意这个文件和 systemd timer 是两套机制。在新版 Ubuntu 上apt-daily.timer会去读这个配置如果配置里是0timer 触发的脚本会直接退出不做任何事。所以改配置和停 timer 效果上有重叠但改配置更“温和”因为它保留了 timer 的调度框架只是让任务空转。我一般会两个都做先改20auto-upgrades把值设为0再 disable timer。这样即使将来某个更新把 timer 重新启用配置里的0也能兜底。改完之后不需要重启什么服务下次 timer 触发时自然生效。但如果你想立刻确认可以手动跑一次sudo /usr/lib/apt/apt.systemd.daily如果配置生效这个脚本会直接返回不做任何更新检查。4.3 unattended-upgrades 要不要一起关unattended-upgrades是负责自动安装安全更新的组件它和“更新提醒”是两件事但很多人会一起关掉。我的建议是分场景如果是个人桌面天天在用安全更新手动装也不麻烦可以关掉自动安装只保留手动更新。如果是长期不登录的服务器或测试机自动装安全更新反而更省心不建议关。关掉自动安装的方法是编辑/etc/apt/apt.conf.d/20auto-upgrades把Unattended-Upgrade设为0。或者更彻底一点停掉对应的 servicesudo systemctl stop unattended-upgrades sudo systemctl disable unattended-upgrades但我要提醒一句关掉之后安全补丁不会自动装你得自己记得定期sudo apt update sudo apt upgrade。我有台测试机就是这么干的结果三个月没登录再上去时积了一百多个待更新包升级过程反而更折腾。4.4 配置文件改完不生效的排查思路如果你改了20auto-upgrades但发现更新检查还在跑按这个顺序排查确认改的是/etc/apt/apt.conf.d/20auto-upgrades不是别的地方的同名文件。用apt-config dump | grep Periodic看实际生效的值确认没有被后面的文件覆盖。检查apt-daily.timer是否还在 active如果是disable 掉。看journalctl -u apt-daily.service最近的日志确认它执行时读到的配置是什么。我遇到过一次是某个第三方源安装时带了自己的 apt 配置文件数字编号比20大把Periodic的值又覆盖回1了。这种情况只能找到那个文件改掉或者把自己的配置文件名数字改大一点比如改成99auto-upgrades确保最后加载。5. 三层都关掉之后系统会变成什么样5.1 更新这件事完全交回你手里三层都处理完之后系统的状态是这样的桌面不再弹窗、不再有红点APT 不再定期去查登录时也不会刷更新提示。更新这件事完全变成手动行为你想更新的时候执行sudo apt update sudo apt upgrade不想更新就一直不动。对于一台自己天天用的桌面机这个状态其实挺舒服的不会被突然的弹窗打断也不会在你不注意的时候装了一堆东西导致需要重启。但代价是你得自己记得这件事。我的习惯是在日历里设一个每月提醒到时间花十分钟手动更新一次。这样既不会被频繁打扰也不会长期不更新。5.2 哪些场景不建议全关有三种情况我建议至少保留一层生产服务器安全更新最好自动装至少保留unattended-upgrades管安全补丁。给别人用的机器你不知道对方会不会手动更新保留自动检查更稳妥。刚装好的系统前几周最好让更新正常跑把该装的驱动和补丁装完再考虑关提醒。全关适合的是那种“我清楚这台机器在干什么、我会定期手动维护”的场景。如果你只是嫌弹窗烦其实只关第一层 GUI 提示就够了后面两层留着让系统自己管更新反而更省心。5.3 恢复默认的步骤如果哪天你想把更新提醒恢复回来按相反顺序操作就行sudo systemctl unmask apt-daily.service apt-daily-upgrade.service sudo systemctl enable apt-daily.timer apt-daily-upgrade.timer sudo systemctl start apt-daily.timer apt-daily-upgrade.timer然后把/etc/apt/apt.conf.d/20auto-upgrades里的值改回1把/etc/xdg/autostart/update-notifier.desktop.bak改回原名重新登录桌面。motd 那个脚本如果之前去掉了执行权限加回来sudo chmod x /etc/update-motd.d/90-updates-available整套操作都是可逆的这也是我倾向于用配置和 disable 而不是直接卸载的原因。卸载容易装回来的时候依赖关系可能已经变了。6. 几个我实际踩过的坑和对应处理6.1 改了配置但 timer 还在跑这个前面提过根因是配置和 timer 是两套机制。新版 Ubuntu 上apt-daily.timer会读20auto-upgrades但如果某个更新把 timer 的 unit 文件改了或者有别的 timer 在触发配置就不一定管用。最稳的做法是配置和 timer 都处理不要只做一样。6.2 关掉提示后 apt update 变慢停掉apt-daily之后包索引不再定期刷新你手动跑apt update时它要一次性拉很多天的变更速度会慢一些。这不是故障是正常的。如果嫌慢可以在手动更新前先跑一次sudo apt clean清掉旧缓存再apt update有时候能快一点。6.3 第三方源带来的额外定时任务有些第三方软件源安装时会往/etc/apt/apt.conf.d/或/etc/cron.d/里塞自己的更新检查脚本。这些不在 systemd timer 的管理范围内你 disable 了 apt-daily 它们照样跑。排查方法是看/etc/cron.d/下有没有和 apt 相关的文件以及systemctl list-timers里有没有非 apt 开头的定时单元在跑更新相关命令。我有一次就是被一个第三方源装的 cron 任务烦了很久最后在/etc/cron.d/里找到它注释掉才清净。6.4 桌面环境和显示管理器的差异上面说的 GUI 层操作主要针对 GNOME 和 Ubuntu 默认桌面。如果你用的是 KDE、XFCE 或者其他桌面环境更新提示的组件可能不一样比如 KDE 用的是plasma-discover而不是gnome-software。处理思路是一样的先找到负责提示的组件再决定是禁用自启还是卸载。但具体文件名和路径会有差异不能照搬。我一般会先用ps aux | grep -i update看当前有哪些更新相关的进程在跑再顺藤摸瓜找到对应的包和自启入口。这个方法比记具体文件名更通用换桌面环境也能用。6.5 系统大版本升级时的注意事项Ubuntu 每两年有一次 LTS 大版本升级升级过程中系统会重新启用一些默认服务包括 apt 的定时任务。如果你之前 disable 过升级后最好再检查一遍确认状态还是你想要的。我遇到过升级之后apt-daily.timer又被 enable 回来的情况不算 bug是升级脚本按默认配置重置了。处理办法就是升级完再跑一遍systemctl list-timers | grep apt看到 active 就再 disable 一次。养成升级后复查的习惯能省掉很多“怎么又弹窗了”的困惑。
返回列表