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.8
或 6.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 或者较高内核
如果虚拟机开启了 vIOMMU
为 VirtIO
会导致重启就进 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
包不再提供last
和lastb
命令 \login
包不再提供lastlog
命令
last
需安装
libpam-wtmdb
lastb
->lslogins –failed
lastlog
->lastlog2
需安装
lastlog2 libpam-lastlog2
isc-dhcp
弃用
默认的 isc-dhcp
软件包已被弃用
建议使用 dhcpcd-base
替换 isc-dhcp-client
systemd-networkd
和NetworkManager
有内置的 DHCP 客户端, 可以直接卸载
使用 ifupdown
和 ifupdown2
不建议更换, 尤其是使用 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 的源添加回来再安装
请注意核对软件包避免卸载需要的内容 (比如 刚才固定的 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 异常或无法启动, 请提前备份配置文件和数据库
libssl1.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
- 删除已有软件或切换版本
- 卸载 Nginx / Apache 或选择切换版本
- 卸载 Pure-FTP
- 卸载 PHP
记得保存配置
- 检查是否系统内还存在宝塔的 dpkg 注册信息
apt list --installed | grep ^bt-
如果依然存在相关软件包, 请不要进行系统清理
- 按照上文进行系统清理软件包和孤立软件包
- 修复面板和更新安装脚本
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
- 恢复已有软件或切换版本到旧版
安装 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
- 更新 MySQL
当然你也可以考虑卸载重装 (重新导入数据库 麻烦一点)
bash /www/server/panel/install/mysql.sh update <当前安装的版本号>
# 例子
bash /www/server/panel/install/mysql.sh update 5.7 # 更新 5.7
宝塔邮局
dovecot
- 更新
dovecot
时, 全部选择N
和Keep current installed version
- 记录内容
vmail
的UID
和GID
cat /etc/passwd | grep vmail
返回内容示例
vmail:x:150:8:Virtual Mail User:/www/vmail:/sbin/nologin
我这里的 UID
是 150
, GID
是 8
- 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
}
- 创建
/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
ssl
的 local_name
内容对照着改 (没有 SSL 就删掉)
- 使用新版本配置覆盖原配置
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
- 创建证书软链接 (如果开了 SSL)
对照上文的 ssl_cert
和 ssl_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
- 关闭 SSL (如果没开 SSL)
编辑 /etc/dovecot/conf.d/10.ssl.conf
, 将 ssl = yes
改为 ssl = no
, 并注释掉 ssl_server_cert_file
ssl_server_key_file
- 重启
dovecot
systemctl restart dovecot
- 注释新版邮局的检查
由于我们将配置文件写到了 local.conf, 会导致新版邮局弹出未安装的提示
将 /www/server/panel/plugin/mail_sys/mail_sys_main.py
中 check_mail_sys
的 dovecot 检查全部注释掉
rspamd
- 更新
rspamd
时, 全部选择N
和Keep current installed version
目前 rspamd
没有 Debian 13 的版本, 可以继续用 Debian 12 的
- 更新配置文件
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
- 重启
rspamd
systemctl restart rspamd