Debian 13 更新过程的坑人内容一览, 建议看完全文再行动而不是边看边动

写在最前

建议将配置文件放在 .d 文件夹以避免每次升级需要手动选择清理

  • SSH ROOT 登录
echo "PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes" > /etc/ssh/sshd_config.d/99-root-password-login.conf

systemctl restart ssh
  • 移除 systemd 默认资源限制
PVE 建议执行以避免虚拟机被 systemd 杀掉
mkdir -p /etc/systemd/system.conf.d/

echo "[Manager]
DefaultTasksMax=infinity
DefaultLimitCPU=infinity
DefaultLimitFSIZE=infinity
DefaultLimitDATA=infinity
DefaultLimitSTACK=infinity
DefaultLimitCORE=infinity
DefaultLimitRSS=infinity
DefaultLimitNOFILE=infinity
DefaultLimitAS=infinity
DefaultLimitNPROC=infinity
DefaultLimitSIGPENDING=infinity
DefaultLimitMSGQUEUE=infinity
DefaultLimitRTTIME=infinity" > /etc/systemd/system.conf.d/99-unlock.conf
  • 设置 systemd-journald 日志自动清理和轮转
mkdir -p /etc/systemd/journald.conf.d/

echo "[Journal]
SystemMaxUse=300M" > /etc/systemd/journald.conf.d/99-max-use.conf
  • 移除 ulimit 默认资源限制
echo "* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
* soft core 1048576
* hard core 1048576
* hard memlock unlimited
* soft memlock unlimited" > /etc/security/limits.d/99-unlock.conf

PVE

设置 ceph 源 (如果安装了)

  • 有企业订阅
echo "deb [signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] https://enterprise.proxmox.com/debian/ceph-squid trixie enterprise" > /etc/apt/sources.list.d/ceph.list
  • 免费用户
echo "deb [signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] http://download.proxmox.com/debian/ceph-squid trixie no-subscription" > /etc/apt/sources.list.d/ceph.list # 海外用户

echo "deb [signed-by=/usr/share/keyrings/proxmox-archive-keyring.gpg] https://mirrors.ustc.edu.cn/proxmox/debian/ceph-squid trixie no-subscription" > /etc/apt/sources.list.d/ceph.list # 国内用户

NVIDIA vGPU

PVE 9 的 Linux Kernel 6.14 会导致 NVIDIA vGPU 在 dmesg 抛出大量错误日志

可以考虑固定到 6.86.11

  • Kernel 6.11
apt install proxmox-kernel-6.11 proxmox-headers-6.11 -y # 安装内核
proxmox-boot-tool kernel pin $(proxmox-boot-tool kernel list | grep 6.11. | head -n 1) # 固定内核

proxmox-boot-tool kernel unpin # 取消固定
apt install proxmox-kernel-6.8* proxmox-headers-6.8* -y # 卸载命令 (如果以后需要)
  • Kernel 6.8
apt install proxmox-kernel-6.8 proxmox-headers-6.8 -y # 安装内核
proxmox-boot-tool kernel pin $(proxmox-boot-tool kernel list | grep 6.8. | head -n 1) # 固定内核

proxmox-boot-tool kernel unpin # 取消固定
apt install proxmox-kernel-6.8* proxmox-headers-6.8* -y # 卸载命令 (如果以后需要)

vIOMMU

Guest 升级至 Debian 13 或者较高内核

如果虚拟机开启了 vIOMMUVirtIO

会导致重启就进 initramfs

PCIe 行为异常导致无法识别硬盘

Debian

Armbian 的 Debian 13 包还在去年, 可以等一等再更

从 Debian 12 升级到 13 时如果使用 SSH 升级则升级过程会导致 SSH 中断
Debian 计划在 12.12 版中解决问题,不过在 Debian 13 发布时这个问题还未解决

建议使用 screen -S 并提前准备好 VNC

apt update -y; apt upgrade -y # 更新至 Debian 12 最新版
sed -i 's/bookworm/trixie/g' `grep -rl bookworm /etc/apt` # 替换软件源, 可能会有不兼容 Debian 13 的包
apt update -y; apt full-upgrade -y # 更新至 Debian 13

boot 分区大小

Debian 13 要求 /boot 空间至少为 768MB 且剩余空间至少为 300MB

如果没有 /boot 分区可以无视这个问题。

你可以使用 df -h 命令查看各个分区的剩余空间

sysctl.conf 失效

还原旧版本默认行为

mv /etc/sysctl.conf.dpkg-bak /etc/sysctl.conf
ln -s /etc/sysctl.conf /etc/sysctl.d/99-sysctl.conf

apparmor 导致部分应用没权限或权限异常

更新以后会自动安装 apparmor

PVE 用户建议不要删除, 可以考虑禁用
apt autopurge -y apparmor # 删除 apparmor

如果只想禁用

systemctl disable --now apparmor # 删除 apparmor

或者在内核命令行中添加

apparmor=0

丢失 UEFI 引导

由于 Linux 没有创建 /boot/efi/EFI/BOOT 文件夹 (UEFI 默认引导)

小部分机器在更新后会丢引导 (比如 Hetzner 的 AX 系列, ASUS 主板)

grub-install --efi-directory=/boot/efi --bootloader-id=proxmox # PVE 用户
grub-install --efi-directory=/boot/efi --bootloader-id=debian # 纯 Debian 用户

tmp 目录

在 Debian 13 中 /tmp 目录默认会存储在内存中且默认会分配最多 50% 的内存值

例如 32GB 内存最多会分配 16GB 给 /tmp 目录

如果是内存比较小的机器可能会出现 /tmp 空间不够用的情况, 你可以使用 systemctl edit tmp.mount 命令修改设置分配比例

另外 /tmp/var/tmp 会定期删除其中的旧文件

/tmp 删除时间是 10 天, /var/tmp 删除时间为 30 天

部分指令替换

last lastb lastlog 命令已被替换

util-Linux 包不再提供 lastlastb 命令 \
login 包不再提供 lastlog 命令
  • last

    需安装 libpam-wtmdb
  • lastb -> lslogins –failed
  • lastlog -> lastlog2

    需安装 lastlog2 libpam-lastlog2

isc-dhcp 弃用

默认的 isc-dhcp 软件包已被弃用

建议使用 dhcpcd-base 替换 isc-dhcp-client

systemd-networkdNetworkManager 有内置的 DHCP 客户端, 可以直接卸载

使用 ifupdownifupdown2 不建议更换, 尤其是使用 DHCPv6 的情况

RabbitMQ

RabbitMQ 无法直接从 Debian 12 升级

不支持跨版本升级

不支持从 Debian 10 升级到 Debian 13

需要先从 Debian 10 升级到 11, 再升级到 12, 再升级到 13

清理系统 (建议重启后)

宝塔用户清理系统后可能无法启动相关环境, 请务必备份好配置文件和数据库再进行
apt autopurge -y

删除捆绑的邮件相关组件

更新以后会自动捆绑安装 exim4 邮件服务器

PVE 用户不要执行, 如果安装了邮局服务也不要执行
apt autopurge -y exim* sendmail* postfix* # 删除所有邮件相关内容
rm -f /var/spool/mail/* # 清理系统邮件

禁用 Debian 13 默认开启的审计日志

systemctl disable --now systemd-journald-audit.socket

清理由 dpkg 修改的配置文件

find /etc | grep "\-dist$" # 安装时保留源配置文件, 新的默认配置文件
find /etc | grep "\-old$" # 安装时不保留源配置文件的备份内容
find /etc | grep "\-bak$" # 安装时被移除的文件备份

删除相关文件 (不建议, 如果你知道自己在干啥)

如果安装了宝塔邮局请看完邮局相关配置文件再操作!
rm -f $(find /etc | grep "\-dist$")
rm -f $(find /etc | grep "\-old$")
rm -f $(find /etc | grep "\-bak$")

清理所有孤立软件包 (高危操作, 如果你不是专业用户请勿操作)

Debian 13 移除了 neofetch, cpufrequtils 等软件包, 可以考虑清理完临时将 Debian 12 的源添加回来再安装

早期宝塔会向系统内注册孤立软件包 (如 MySQL), 请先在下方看完宝塔内容后再清理

请注意核对软件包避免卸载需要的内容 (比如 刚才固定的 PVE 内核, 宝塔 bt-mysql 开头的 MySQL 软件包)!

apt list --installed | grep "local]" | awk -F "/" '{print $1}' # 查询相关软件包
apt autopurge $(apt list --installed | grep "local]" | awk -F "/" '{print $1}') # 清理相关软件包, 需要手动确认以避免卸载错误

清理系统日志

rm -f $(find /var/log)
rm -rf /var/log/journal/*
rm -rf /var/log/ifupdown2/*

修复 lastlog

touch /var/log/lastlog
chgrp utmp /var/log/lastlog
chmod 664 /var/log/lastlog

宝塔面板 / aaPanel

升级完系统以后建议重新安装部分软件包, 最好同时更新面板

更新到最新版面板

先走面板更新, 如果失败了可以用脚本更

bt 16 # 更新面板

curl https://download.bt.cn/install/update_panel.sh|bash # 仅限国内版, 如果不行跑这个 (可能会更新到上古版本, 没问题)

bt 16 # 修复面板

更新完成后再去面板内更新即可, 然后再修复一次

bt 16 # 修复面板

重新安装部分软件包并进行系统清理

清理软件包 尤其是 "孤立软件包", 可能会导致 Nginx, MySQL, PHP 异常或无法启动, 请提前备份配置文件和数据库

自 Debian 12 开始由 OpenSSL 1.1 切换到 OpenSSL 3, 如果清理掉 libssl1.1 需要重新安装软件包


  1. 将旧版本宝塔生成的 mysql 从系统 dpkg 取消注册

使用宝塔文件编辑器打开 /var/lib/dpkg/status

搜索 bt-mysql 开头的软件包并将其整节内容删除

删除 /var/lib/dpkg/info 目录内 bt-mysql 开头的注册信息

rm -rf /var/lib/dpkg/info/bt-mysql*

删除注册的文档

rm -rf /usr/share/doc/bt-mysql*

删除宝塔内部的 dpkg 标记

rm -f /www/server/mysql/deb.pl

  1. 删除已有软件或切换版本
  • 卸载 Nginx / Apache 或选择切换版本
  • 卸载 Pure-FTP
  • 卸载 PHP
记得保存配置

  1. 检查是否系统内还存在宝塔的 dpkg 注册信息
apt list --installed | grep ^bt-

如果依然存在相关软件包, 请不要进行系统清理


  1. 按照上文进行系统清理软件包和孤立软件包

  1. 修复面板和更新安装脚本
bt 16 # 修复面板

更新到最新的脚本以避免继续向系统 dpkg 注册软件包

wget -O /www/server/panel/install/nginx.sh https://download.bt.cn/install/0/nginx.sh
wget -O /www/server/panel/install/mysql.sh https://download.bt.cn/install/0/mysql.sh
wget -O /www/server/panel/install/php.sh https://download.bt.cn/install/0/php.sh
wget -O /www/server/panel/install/pureftpd.sh https://download.bt.cn/install/0/pureftpd.sh

  1. 恢复已有软件或切换版本到旧版
  • 安装 Nginx / Apache2 或选择切换版本 (再切一次避免网站白屏)
    如果有 CDN 配置记得检查是否读取了 X-Forwarded-For

    国内最新版支持在 网站 -> 高级设置 -> cdn来源IP解析 一键开启
  • 安装 Pure-FTP
  • 安装 PHP 和相关扩展
    记得安装扩展, 性能调优和修改 Session 配置

如果安装失败可以使用脚本安装

bash /www/server/panel/install/nginx.sh install <版本号>
bash /www/server/panel/install/php.sh install <版本号>
bash /www/server/panel/install/pureftpd.sh install

# 例子
bash /www/server/panel/install/nginx.sh install 1.28 # 安装 Nginx 1.28
bash /www/server/panel/install/nginx.sh install tengine # 安装 Nginx Tengine
bash /www/server/panel/install/nginx.sh install openresty127 # 安装 Nginx Openresty

bash /www/server/panel/install/php.sh install 7.4 # 安装 PHP 7.4
bash /www/server/panel/install/pureftpd.sh install # 安装 Pure-FTP

  1. 更新 MySQL

当然你也可以考虑卸载重装 (重新导入数据库 麻烦一点)

bash /www/server/panel/install/mysql.sh update <当前安装的版本号>

# 例子
bash /www/server/panel/install/mysql.sh update 5.7 # 更新 5.7

宝塔邮局

dovecot

  1. 更新 dovecot 时, 全部选择 NKeep current installed version

  1. 记录内容
  • vmailUIDGID
cat /etc/passwd | grep vmail

返回内容示例

vmail:x:150:8:Virtual Mail User:/www/vmail:/sbin/nologin

我这里的 UID150, GID8

  • SSL 配置 (如果有)

打开 /etc/dovecot/conf.d/10-ssl.conf.dpkg-dist, 找到下面的类似的配置

ssl_cert = </www/server/panel/plugin/mail_sys/cert/example.com/fullchain.pem
ssl_key = </www/server/panel/plugin/mail_sys/cert/example.com/privkey.pem

local_name mail.example.com {
    ssl_cert = </www/server/panel/plugin/mail_sys/cert/example.com/fullchain.pem
    ssl_key= </www/server/panel/plugin/mail_sys/cert/example.com/privkey.pem
}

  1. 创建 /etc/dovecot/local.conf
# dovecot
protocols = imap pop3 lmtp

# sql
sql_driver = sqlite
sqlite_path = /www/vmail/postfixadmin.db

userdb sql {
  query = SELECT '/www/vmail/%{user | domain}/%{user | username}' as home, 'maildir:/www/vmail/%{user | domain}/%{user | username}' as mail, 150 AS uid, 8 AS gid, 'dirsize:storage=' || quota AS quota \
    FROM mailbox \
    WHERE username = '%{user}' AND active = 1
}

passdb sql {
  default_password_scheme = MD5-CRYPT
  query = SELECT username as user, password, '/www/vmail/%{user | domain}/%{user | username}' as userdb_home, 'maildir:/www/vmail/%{user | domain}/%{user | username}' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
    FROM mailbox \
    WHERE username = '%{user}' AND active = 1
}

# auth
auth_allow_cleartext = yes
auth_allow_weak_schemes = yes

# logging
log_path = /var/log/dovecot.log

# mail
mail_driver = maildir
mail_home = /www/vmail/%{user | domain}/%{user | username}
mail_path = %{home}

mail_uid = vmail
mail_gid = mail
mail_access_groups = mail
first_valid_uid = 150
last_valid_uid = 150

mbox_write_locks = fcntl

# master
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    #group = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  user = dovecot
}

service auth-worker {
  user = vmail
}

# ssl
local_name mail.example.com {
    ssl_server_cert_file = /www/server/panel/plugin/mail_sys/cert/example.com/fullchain.pem
    ssl_server_key_file = /www/server/panel/plugin/mail_sys/cert/example.com/privkey.pem
}

# mailboxes
namespace inbox {
  inbox = yes

  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Spam {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
}

# pop3
protocol pop3 {
  mail_plugins {
    sieve = yes
    quota = yes
  }
}

# imap
protocol imap {
  mail_plugins {
    imap_sieve = yes
    imap_quota = yes
  }
}

# lmtp
protocol lmtp {
  mail_plugins {
    sieve = yes
    quota = yes
  }
}

# quota
mail_plugins {
  quota = yes
}

quota user {
  driver = maildir
}

# sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_pipe_bin_dir    = /usr/lib/dovecot/sieve
sieve_execute_bin_dir = /usr/lib/dovecot/sieve
sieve_global_extensions {
  vnd.dovecot.pipe = yes
  vnd.dovecot.execute = yes
}

mailbox Spam {
  sieve_script report-spam {
    type = before
    cause = copy
    path = /usr/lib/dovecot/sieve/report-spam.sieve
  }
}

imapsieve_from Spam {
  sieve_script report-ham {
    type = before
    cause = copy
    path = /etc/dovecot/report-ham.sieve
  }
}

userdb 中的 150 AS uid, 8 AS gid, 150 替换为你的 UID, 8 替换为你的 GID
passdb 中的 150 AS userdb_uid, 8 AS userdb_gid, 150 替换为你的 UID, 8 替换为你的 GID
ssllocal_name 内容对照着改 (没有 SSL 就删掉)


  1. 使用新版本配置覆盖原配置
cp -a /etc/dovecot ~ # 备份文件

rm -f /etc/dovecot/dovecot-sql.conf.ext
mv -f /etc/dovecot/dovecot.conf.dpkg-dist /etc/dovecot/dovecot.conf
mv -f /etc/dovecot/dovecot.conf.dpkg-dist /etc/dovecot/dovecot.conf
mv -f /etc/dovecot/conf.d/10-auth.conf.dpkg-dist /etc/dovecot/conf.d/10-auth.conf
mv -f /etc/dovecot/conf.d/10-logging.conf.dpkg-dist /etc/dovecot/conf.d/10-logging.conf
mv -f /etc/dovecot/conf.d/15-mailboxes.conf.dpkg-dist /etc/dovecot/conf.d/15-mailboxes.conf
mv -f /etc/dovecot/conf.d/10-master.conf.dpkg-dist /etc/dovecot/conf.d/10-master.conf
mv -f /etc/dovecot/conf.d/10-ssl.conf.dpkg-dist /etc/dovecot/conf.d/10-ssl.conf
mv -f /etc/dovecot/conf.d/20-pop3.conf.dpkg-dist /etc/dovecot/conf.d/20-pop3.conf
mv -f /etc/dovecot/conf.d/20-pop3.conf.dpkg-dist /etc/dovecot/conf.d/20-pop3.conf
mv -f /etc/dovecot/conf.d/20-imap.conf.dpkg-dist /etc/dovecot/conf.d/20-imap.conf
mv -f /etc/dovecot/conf.d/20-lmtp.conf.dpkg-dist /etc/dovecot/conf.d/20-lmtp.conf
mv -f /etc/dovecot/conf.d/90-quota.conf.dpkg-dist /etc/dovecot/conf.d/90-quota.conf
mv -f /etc/dovecot/conf.d/90-sieve.conf.dpkg-dist /etc/dovecot/conf.d/90-sieve.conf

  1. 创建证书软链接 (如果开了 SSL)

对照上文的 ssl_certssl_key, 自己修改文件名

ln -s /www/server/panel/plugin/mail_sys/cert/example.com/fullchain.pem /etc/dovecot/private/dovecot.pem
ln -s /www/server/panel/plugin/mail_sys/cert/example.com/fullchain.pem/dovecot.key

  1. 关闭 SSL (如果没开 SSL)

编辑 /etc/dovecot/conf.d/10.ssl.conf, 将 ssl = yes 改为 ssl = no, 并注释掉 ssl_server_cert_file ssl_server_key_file


  1. 重启 dovecot
systemctl restart dovecot
  1. 注释新版邮局的检查

由于我们将配置文件写到了 local.conf, 会导致新版邮局弹出未安装的提示

/www/server/panel/plugin/mail_sys/mail_sys_main.pycheck_mail_sys 的 dovecot 检查全部注释掉

rspamd

  1. 更新 rspamd 时, 全部选择 NKeep current installed version
目前 rspamd 没有 Debian 13 的版本, 可以继续用 Debian 12 的

  1. 更新配置文件
mv /etc/rspamd/statistic.conf ~
mv /etc/rspamd/statistic.conf.dpkg-dist /etc/rspamd/statistic.conf
echo "services = "127.0.0.1:6379";" > /etc/rspamd/local.d/classifier-bayes.conf

  1. 重启 rspamd
systemctl restart rspamd
最后修改:2025 年 08 月 19 日
如果觉得我的文章对你有用,请随意赞赏