我这台 VPS 之前跑的是 Debian 10.5(Buster),主要用来跑 WordPress(AMH 面板 + LNMP + MySQL 8 + PHP-FPM)。因为系统版本太老,很多源已经进入“历史归档”,apt update 直接 404,装个 screen 都困难。为了后续维护省心,我决定先升级到 Debian 11(Bullseye),并且尽量做到两点:
- 全程不进编辑器(不想 vi/nano)。
- 升级结束后把系统状态收拾干净:包无残缺、源正确、老内核清掉、重启后跑在新内核上。
下面就是我这次升级的完整过程记录。
1)升级前的现象:Debian10.5 的源开始 404
最直观的症状就是:
apt update报 404 / Release file missingscreen甚至都装不上(因为源不可用了)- 典型报错类似:
... buster Release 404 Not Found ... no longer has a Release file
本质原因:Debian 10(Buster)进入 LTS/归档阶段后,默认源位置变化,继续用原来的 deb.debian.org / security.debian.org 组合,很容易遇到不可用或签名/Release 文件问题。
我当时的策略很简单:既然我有整机 snapshot,可以大胆升级;真出事就回滚。
2)准备工作:先把远程升级“稳住”(screen)
为了避免 SSH 掉线把升级卡死,我先装了 screen(这一步在 Debian 10 源恢复后做,或者先临时切 archive 源完成安装):
apt update
apt install -y screen
装完后,进入一个 screen 会话再做后续操作:
screen -S dist-upgrade
3)确认目标:升级到 Debian 11(bullseye)
升级系统之前,我会先确认当前版本(避免搞错环境):
cat /etc/debian_version
uname -a
4)切换 APT 源到 bullseye(不进编辑器的写法)
我不想用编辑器,所以直接用重定向覆盖 sources.list(你也可以把地址换成你习惯的镜像源):
cat > /etc/apt/sources.list <<'EOF'
deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
EOF
然后检查一遍,确保没有混入 buster/bookworm:
grep -R --line-number -E 'deb .*debian|security.debian' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null
5)正式升级:update → full-upgrade
这一步就是标准流程:
apt update
apt -y full-upgrade
升级过程中会遇到“配置文件冲突”的交互提示,比如:
/etc/crontab被你或脚本修改过/etc/ssh/sshd_config有本地修改
我的处理原则是:能不动就不动(尤其是 sshd_config,远程机器最怕 SSH 配置被覆盖导致连不上)。
所以一般我会选:
keep your currently-installed version(保留本地版本)
如果想更谨慎,可以先选 D 看差异再决定。
6)升级过程中遇到的一个常见提示:是否自动重启服务
升级 libc 等关键库时,会弹出类似提示:
Restart services during package upgrades without asking?
我这台机器跑网站服务,升级期间重启服务是不可避免的。这里我的选择是:
- 选 Yes(自动重启必要服务),减少后续手工确认的次数
同时它还会列出建议重启的服务(例如 ssh、cron),正常接受即可。一般 ssh 重启不会断开现有连接,但我还是建议在 screen 里操作,心里更踏实。
7)重启并确认版本:已经是 Debian 11
升级完成后,我会执行:
reboot
重启回来后,第一件事就是确认系统版本、内核版本:
cat /etc/os-release
cat /etc/debian_version
uname -r
看到类似输出就说明到位了:
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"/etc/debian_version显示 11.x(我这里最终是 11.11)uname -r是 5.10 系列(Debian 11 默认长期维护内核线)
8)升级后收尾:full-upgrade + autoremove 清垃圾
为了确保没有“升级半截”的包,升级后我会再跑一次:
apt update
apt -y full-upgrade
apt -y autoremove --purge
如果你想更严谨,可以加两条检查:
dpkg --audit || true
apt -f install -y
我这里的状态是:
All packages are up to date.0 upgraded, 0 newly installed, 0 to remove...dpkg --audit无异常
这基本就是“系统很干净”的信号。
9)清理老内核:/boot 只保留当前在跑的
升级后最常见的“硬盘变大”来源之一就是:多装了内核包(旧 kernel image 还留着)。
我先查看当前运行的内核:
uname -r
再查看系统安装了哪些内核包:
dpkg -l | awk '/^ii linux-image/{print $2,$3}' | sort
也会看一下 /boot 里实际有哪些 vmlinuz:
ls -l /boot/vmlinuz-* 2>/dev/null
确认哪些是旧的以后,把旧内核 purge 掉(示例):
apt -y purge linux-image-4.19.0-20-amd64
apt -y autoremove --purge
最后再确认一次:
ls -l /boot/vmlinuz-* 2>/dev/null
dpkg -l | awk '/^ii linux-image/{print $2,$3}' | sort
我最终的状态是:
/boot只剩vmlinuz-5.10.0-38-amd64linux-image-5.10.0-38-amd64+linux-image-amd64保留- 老内核已清理
10)最终结论:Debian 11 已升级完成且处于最新补丁状态
到这一步,我对“Debian 11 已升级完成”的判定标准是:
cat /etc/os-release显示 Debian 11 bullseyecat /etc/debian_version为 11.xapt update显示 All packages are up to datedpkg --audit没有问题包- 重启后
uname -r跑在 5.10 内核 - /boot 里没有一堆遗留旧内核(已清理)
满足这些,就可以认为这台机器的 Debian 11 升级“收工”。
额外小建议(我自己的习惯)
- 升级这种事,宁可慢点也别贪快:screen + snapshot 是最低成本的保险。
- ssh 配置相关的提示优先保守:尽量保留本地 sshd_config,除非你完全知道差异是什么。
- 升级后立刻做一次清理:autoremove + 清老内核,能省不少磁盘,也减少后续混乱。