维护与更新
一台长期开机的机器需要在时间的流逝中保持整洁。操作系统、依赖、工具、智能体:哪些可以自动化,哪些需要手动更新,以及如何做到不弄坏任何东西。
本文核对于 3 个月前,部分命令可能已有变化。 如有出入,请告诉我们。
要点速览
一台常年开着的机器,靠两个习惯保持健康:安全补丁自动安装(unattended-upgrades);每月一次先备份,运行 sudo apt update && sudo apt upgrade,逐个更新 Ollama、agent 和依赖,再清理磁盘。从 Ubuntu 24.04 升级到 26.04 用 sudo do-release-upgrade,事先备份,并留意新的 Rust 版基础工具(rust-coreutils、sudo-rs)以及 Python 升到 3.14。要及时知道哪里坏了:传递退出码,给服务挂上 OnFailure,并真正测试一次告警。
请先完成: 必备的系统设置Git、GitHub 与备份
一台 24 小时不间断运行、并且可以从外部访问的机器永远不会真正「完工」。它是活的,而正如一切有生命的事物一样,它需要一点点照料。好消息是:90% 的工作可以归结为两个习惯,一个自动完成,一个每月一次。我们来看看是哪两个,尤其是如何在更新时不弄坏任何东西。
操作系统:底层系统
您的 Ubuntu 是地基。维护分为两个层次:
# 日常动作:刷新软件包列表,然后安装更新
sudo apt update && sudo apt upgrade -y
# 清理掉那些已经没用的软件包
sudo apt autoremove --purge
至于安全,您已经在系统设置里用 unattended-upgrades 把一切都自动化好了:机器会自行应用关键修复。这就是我们刚才说的那个自动习惯。
每两年一次,Ubuntu 会发布一个新的 LTS 版本。最新的 Ubuntu 26.04 于 2026 年 4 月发布;从 24.04 升级的通道自它的首个修正版 26.04.1(8 月底发布)起开放:Canonical 总是等到这个「.1」之后,才提供 LTS 之间的升级。这并不紧急,24.04 的安全补丁会持续到 2029 年。等您决定动手时,先做好备份(参见 Git、GitHub 与备份),再浏览一遍版本说明(英文)。
# 先装完待处理的更新,如有提示就重启
sudo apt update && sudo apt full-upgrade -y
# 然后开始升级到下一个 LTS(如果是通过 SSH 操作,请在 tmux 里运行)
sudo do-release-upgrade
依赖:您的项目所依靠的东西
这正是意外藏身之处,因为一个升了大版本的依赖可能会弄坏一个项目。
- Node(通过
nvm):nvm install --lts安装最新的 LTS(截至 2026 年 10 月 1 日为 Node 24,Node 26 预计 10 月 28 日成为 LTS),nvm alias default把它设为默认。先保留旧版本,等确认您的项目都能正常运行之后再说。 - 某个项目的软件包:
npm outdated会显示哪些落后了,npm update会在您的package.json限定的范围内更新。对于大版本,请先读一读 changelog:破坏性变更正是发生在这里。 - 能救命的习惯:锁文件。 把您的
package-lock.json/requirements.txt纳入版本管理。它们能保证您的项目在任何地方都重新安装完全相同的版本,不会在您背后悄悄变动。
工具与智能体
您技术栈里的其余部分都能干净地更新,各有各的方式:
- Docker:跟随系统的
apt更新。记得清理那些堆积起来的东西(见下文)。 - Ollama:重新运行安装脚本即可升到最新版(
curl -fsSL https://ollama.com/install.sh | sh)。至于模型,用ollama pull <模型>就能取到新的版本:本地版本会被替换。想知道哪些新模型值得更新,可以看每周更新的 Quelle IA 本地模型榜(法语网站)。 - 您的代码智能体:用安装脚本装的 Claude Code 会在后台自动更新,
claude update可以强制升到最新版。OpenCode 用opencode upgrade升级。如果您当初是用npm装的 Claude Code,请改用原生安装脚本(curl -fsSL https://claude.ai/install.sh | bash),再用npm uninstall -g @anthropic-ai/claude-code删掉旧的那份。一个最新的智能体,意味着免费到手的新能力。 - Tailscale 和 cloudflared:通过它们各自的软件源安装,会随系统一起更新。无需做任何特别的事。
磁盘空间:无声的陷阱
模型、Docker 镜像和旧软件包会在不知不觉中把磁盘填满,而一台塞满的机器会开始莫名其妙地崩溃。打扫只需三条命令:
df -h # 还剩多少空间
docker system prune -a # 清除未使用的镜像和容器
ollama rm <模型> # 删除一个您不再使用的模型
sudo apt autoremove --purge # 孤立的软件包
知道它什么时候坏了
一台整夜独自干活的机器,只有您事先安排过,它才会通知您。风险不在于故障本身,而在于消息传到您这儿要多久。下面这些全都来自这台机器上的真实事故。
1. 一个脚本调用另一个脚本,必须把退出码传下去
经典陷阱,而且非常常见:
#!/bin/bash
set -uo pipefail
python3 import.py >> import.log 2>&1 # 退出码被扔进了垃圾桶
systemctl --user restart my-site || true # 最后一条命令:永远返回 0
这个脚本永远返回 0。导入可以崩掉,systemd 报告成功,而您的周报告诉您一切正常。这里就发生过:一个数据库空了一整天,而探针一直显示绿色。
修法只要两行:
python3 import.py >> import.log 2>&1
rc=$?
systemctl --user restart my-site || true
exit $rc
2. OnFailure:它倒下的那一秒就通知您
systemd 可以在一个单元失败时触发另一个单元。您写一个给自己发消息的小服务,然后把它挂到所有重要的单元上。
# ~/.config/systemd/user/my-service.service.d/onfailure.conf
[Unit]
OnFailure=alert@%n.service
请用 .d/ 目录里的覆盖文件,而不是直接改单元本身:这样即使单元是从代码仓库软链过来的也照样生效,而且要撤销只需删掉一个文件夹。
3. 一个系统级探针,因为任何单元告警都看不见机器正在下沉
内存被填满时,没有任何单元处于”失败”状态。下沉的是机器本身,OnFailure 什么都看不到。您需要一个独立的、跑在定时器上的探针,盯着可用内存、被内核杀掉的进程、swap 和负载,然后在状态发生变化时给您发消息,免得同一条告警每五分钟重复一遍。
让智能体来帮您
这正是您的智能体最喜欢的那种苦差事。「检查一下这台机器上有什么需要更新的,给我总结一下重要的变更,并提出一个方案」:它会列出落后的软件包,替您读完 changelog,然后建议您一步一步地行动。您的手指始终按在按钮上,调查的活儿由它来干。
本文全部命令
常见问题
需要马上从 Ubuntu 24.04 升级到 26.04 吗?
不必着急:24.04 的安全补丁会一直提供到 2029 年。从 26.04.1(2026 年 8 月底发布)起才开放升级,因为 Canonical 总会等到这第一个修正版本,才开放从一个 LTS 到下一个 LTS 的升级。等您决定动手时,请先备份,并浏览一遍发行说明。
为什么有些 Ubuntu 更新之后需要重启?
有些更新,尤其是 Linux 内核,只有重启之后才会生效。需要重启时,Ubuntu 会通过 /var/run/reboot-required 这个文件提醒您。请挑一个空闲的时段重启:如果网站、隧道和 agent 都以 systemd 服务的方式安装,它们会自动重新启动。
如何更新 Claude Code 和 OpenCode?
用安装脚本装好的 Claude Code 会在后台自动更新,claude update 可以强制升到最新版本。OpenCode 用 opencode upgrade 升到最新版本。如果您当初是用 npm 安装的 Claude Code,请改用原生安装程序,然后用 npm uninstall -g @anthropic-ai/claude-code 删除旧的那份。
运行本地模型的机器,怎样腾出磁盘空间?
模型、Docker 镜像和旧软件包会悄无声息地把磁盘塞满,而磁盘满了的机器会莫名其妙地出故障。先用 df -h 查看剩余空间,再动手清理:docker system prune -a 清掉没在用的镜像和容器,ollama rm 删除不再使用的模型,sudo apt autoremove --purge 清除孤立的软件包。
为什么只看 systemctl --failed 不足以监控定时任务?
这条命令只显示当下这一刻。一个每日任务周一出错、周二又恢复正常,在您周日看报告之前早已从列表里消失,报告会写着「没有失败项」。请把两种机制结合起来:OnFailure 抓住转红的那一刻,定期报告抓住已经持续存在的故障。
本文涉及的术语: UbuntuDockerOllama智能体Claude CodeOpenCodeTailscaleCloudflare TunnelDocker 镜像仓库(repo)RAM(内存)
发现错误?
命令失效了,价格变了?
这些工具每个月都在变。请告诉我这篇文章哪里不对,我会改正并更新日期。