从 Debian 10.5 升级到 Debian 11(Bullseye)实录:不写编辑器、全程命令行、顺手清理老内核

我这台 VPS 之前跑的是 Debian 10.5(Buster),主要用来跑 WordPress(AMH 面板 + LNMP + MySQL 8 + PHP-FPM)。因为系统版本太老,很多源已经进入“历史归档”,apt update 直接 404,装个 screen 都困难。为了后续维护省心,我决定先升级到 Debian 11(Bullseye),并且尽量做到两点:

  1. 全程不进编辑器(不想 vi/nano)。
  2. 升级结束后把系统状态收拾干净:包无残缺、源正确、老内核清掉、重启后跑在新内核上。

下面就是我这次升级的完整过程记录。


1)升级前的现象:Debian10.5 的源开始 404

最直观的症状就是:

  • apt update 报 404 / Release file missing
  • screen 甚至都装不上(因为源不可用了)
  • 典型报错类似:... 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-amd64
  • linux-image-5.10.0-38-amd64 + linux-image-amd64 保留
  • 老内核已清理

10)最终结论:Debian 11 已升级完成且处于最新补丁状态

到这一步,我对“Debian 11 已升级完成”的判定标准是:

  1. cat /etc/os-release 显示 Debian 11 bullseye
  2. cat /etc/debian_version 为 11.x
  3. apt update 显示 All packages are up to date
  4. dpkg --audit 没有问题包
  5. 重启后 uname -r 跑在 5.10 内核
  6. /boot 里没有一堆遗留旧内核(已清理)

满足这些,就可以认为这台机器的 Debian 11 升级“收工”。


额外小建议(我自己的习惯)

  • 升级这种事,宁可慢点也别贪快:screen + snapshot 是最低成本的保险。
  • ssh 配置相关的提示优先保守:尽量保留本地 sshd_config,除非你完全知道差异是什么。
  • 升级后立刻做一次清理:autoremove + 清老内核,能省不少磁盘,也减少后续混乱。
订阅评论
提醒

0 评论
内联反馈
查看所有评论