Debian 只支持从上一版升级。12(bookworm)可以直接升到 13(trixie),11 或更早要先升到 12。发行说明在 Upgrades from Debian 12,升级时会碰到的问题在 Issues to be aware of for trixie。生产机器先看这两份,再动源。
先看当前版本:
1 | cat /etc/debian_version |
输出应是 12 的小版本号。不是 12 就停下来。
备份
至少留下 /etc、/home,还有本机上的数据库。/etc 里是源、ssh、服务配置,升级改坏了要靠它找回。官方还建议备份 /var/lib/dpkg、/var/lib/apt/extended_states,以及已安装软件包清单:
1 | dpkg --get-selections '*' > ~/package-selections.txt |
有数据库的话按那个库自己的方式做一次逻辑备份,不要只复制数据目录。
先把 Debian 12 升到最新
升级过程假定系统已经是 bookworm 的最新小版本。
1 | sudo apt update |
有内核更新就重启,确认起来之后仍是 Debian 12,再改源。
如果是通过 SSH 远程升,bookworm 里旧的 OpenSSH 有一个问题:升级做到一半 SSH 断了,可能重新连不回去。发行说明要求先把 OpenSSH 升到 1:9.2p1-2+deb12u7 或更新,走 bookworm 的 stable-updates。上面的 full-upgrade 会把它带上。可以用 apt-cache policy openssh-server 看安装的版本是不是不低于这一版。远程操作时再开一个 tmux 或 screen,会话断了还能接回去。
检查包状态和 /boot
1 | dpkg --audit |
dpkg --audit 有输出,说明有包装到一半,先处理完。apt-mark showhold 有包被钉住,这些包不会跟着升级,确认是不是故意留下的。
/boot 是单独分区时,分区至少要有 768MB,里面再留出大约 300MB。trixie 的内核和固件比以前大,空间不够会在装内核时失败。从 Debian 10 或更早装出来的机器,/boot 经常偏小。没有单独的 /boot 就不用管这一项。
1 | df -h /boot |
第三方源先停掉。/etc/apt/sources.list 和 /etc/apt/sources.list.d/ 里不是 Debian 官方仓库的条目,注释掉或把文件移走。这些源里没有 trixie 的包,留着会让 apt 算依赖失败。装过 non-free 固件的,源里保留 non-free-firmware。
把 bookworm 改成 trixie
Debian 13 推荐用 deb822 格式,文件放在 /etc/apt/sources.list.d/debian.sources。已经是这种文件的,把里面的 bookworm 换成 trixie 即可。还在用旧的 sources.list 时,下面三条会把代号换掉,包括 bookworm-security、bookworm-updates:
1 | sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list |
目录里没有 .sources 或 .list 时,对应那条会报找不到文件,可以忽略。换完看一遍,确认没有残留的 bookworm。原来有 bookworm-backports 的,会被换成 trixie-backports,不需要 backports 就把那几行注释掉。
想改成官方现在的写法,可以在升级完成后执行 sudo apt modernize-sources。一份常见的 debian.sources 是:
1 | Types: deb |
用了 contrib 或 non-free 的,把这两个词加到每一行 Components: 后面。改用这个文件之后,旧的 sources.list 里指向 Debian 仓库的行要注释掉,避免两套源一起生效。
升级
在 tmux 或 screen 里做。先只升级不引入新包名的部分,再做完整升级。完整升级会按依赖安装新包,也会卸掉冲突的旧包。
1 | sudo apt update |
中间如果问配置文件用哪一版,看过 diff 再选。服务配置你改过的,一般留本地版本,再把新版里必要的项补回去。
清理并重启
升到 trixie 会换内核,重启才算完成。发行说明里没有要求在重启前再做别的特殊步骤。
1 | sudo apt autoremove |
验证
1 | cat /etc/debian_version |
/etc/debian_version 应是 13 开头,VERSION_CODENAME 应是 trixie。装了 lsb-release 时也可以用 lsb_release -a,没装不必为了看版本再装这个包。
重启之后 /tmp 默认变成 tmpfs,最多可以用到大约一半内存,只有真的往里面写文件才占内存。从 bookworm 升上来的系统,这个变化在重启后才出现。原来放在 /tmp 里的文件会被新的 tmpfs 挡住,日志里可能有警告。需要找回时:
1 | sudo mount --bind / /mnt |
/etc/fstab 里已经单独挂了 /tmp 的机器不受影响。要把 /tmp 改回普通目录,执行 sudo systemctl mask tmp.mount 后再重启。大文件不要再放进 /tmp。
i386 从 trixie 起不再作为常规架构提供内核和安装镜像。还在跑 32 位 Debian 的机器不要按这篇升,官方建议改成 amd64 重装,或者停用这台机器。