0%

从 Debian 12(bookworm)升级到 Debian 13(trixie)

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
2
3
sudo apt update
sudo apt full-upgrade
sudo apt autoremove

有内核更新就重启,确认起来之后仍是 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
2
dpkg --audit
apt-mark showhold

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
2
3
sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.sources 2>/dev/null
sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list 2>/dev/null

目录里没有 .sources 或 .list 时,对应那条会报找不到文件,可以忽略。换完看一遍,确认没有残留的 bookworm。原来有 bookworm-backports 的,会被换成 trixie-backports,不需要 backports 就把那几行注释掉。

想改成官方现在的写法,可以在升级完成后执行 sudo apt modernize-sources。一份常见的 debian.sources 是:

1
2
3
4
5
6
7
8
9
10
11
Types: deb
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Types: deb
URIs: https://security.debian.org/debian-security
Suites: trixie-security
Components: main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

用了 contrib 或 non-free 的,把这两个词加到每一行 Components: 后面。改用这个文件之后,旧的 sources.list 里指向 Debian 仓库的行要注释掉,避免两套源一起生效。

升级

在 tmux 或 screen 里做。先只升级不引入新包名的部分,再做完整升级。完整升级会按依赖安装新包,也会卸掉冲突的旧包。

1
2
3
sudo apt update
sudo apt upgrade --without-new-pkgs
sudo apt full-upgrade

中间如果问配置文件用哪一版,看过 diff 再选。服务配置你改过的,一般留本地版本,再把新版里必要的项补回去。

清理并重启

升到 trixie 会换内核,重启才算完成。发行说明里没有要求在重启前再做别的特殊步骤。

1
2
3
sudo apt autoremove
sudo apt clean
sudo reboot

验证

1
2
cat /etc/debian_version
cat /etc/os-release

/etc/debian_version 应是 13 开头,VERSION_CODENAME 应是 trixie。装了 lsb-release 时也可以用 lsb_release -a,没装不必为了看版本再装这个包。

重启之后 /tmp 默认变成 tmpfs,最多可以用到大约一半内存,只有真的往里面写文件才占内存。从 bookworm 升上来的系统,这个变化在重启后才出现。原来放在 /tmp 里的文件会被新的 tmpfs 挡住,日志里可能有警告。需要找回时:

1
2
3
sudo mount --bind / /mnt
ls /mnt/tmp
sudo umount /mnt

/etc/fstab 里已经单独挂了 /tmp 的机器不受影响。要把 /tmp 改回普通目录,执行 sudo systemctl mask tmp.mount 后再重启。大文件不要再放进 /tmp。

i386 从 trixie 起不再作为常规架构提供内核和安装镜像。还在跑 32 位 Debian 的机器不要按这篇升,官方建议改成 amd64 重装,或者停用这台机器。