![]() |
图片来自网络 |
Debian前不久刚刚发布了Debian 13,也就是代号为trixie的版本。本周一上班后,从Repo的变更看到了这个消息,我就进行了升级。
之前已经把我的所有Debian环境统一到bookworm了,也是不久前的事情。当时Stretch和Buster已经停止维护了,Bulleyes还是oldstable状态。我只有两个环境是bookworm,于是一咬牙把所有的环境都升级到了bookworm,也踩了一些坑,下面合在一起说。这次确实没想到来trixie得这么快,也这么巧,趁上次坑里的屎还是热乎的,也就再咬一回牙了,反正我的牙也不是自己的。
简化的正常升级流程
首先强调一点,升级不要跳版本,从低往高一级一级地升。每次升级解决这一次的问题,然后再往下走。我这次是从bookworm往trixie升,只需要升级一次。如果是jessie,那么就要stretch->buster->bulleyes->bookworm->trixie,以此类推。
历史版本代码参见官方说法,最好是看英文版,更新最及时。
升级过程完整的指引,最好参见Debian官方文档(有中文版,但翻译得很不好,很多没翻。还是看英文版吧,Google翻译或喂AI都行。拜托了,都2025年了)。但如果要简单说的话,要点只有以下这些:
- 先把当前版本升级到没法再升。
- 去/etc/apt/sources.list里面,把版本代号改掉。去/etc/apt/sources.list.d下面,把文件里面的版本代号都改掉。
这一步原则上可以用shell命令来做,但其实还有non-free-firmware之类的小点,依赖别人的脚本并不是好事情,所以我也就不贴了。我觉得还是讲个原则,手动操作吧。必要的时候去参考已有的新版OS。 - 正式开始升级:
- 对选项作出反应:
- 升级过程中要不要重启服务,可以选yes。
- 要不要覆盖旧版配置文件,自己看吧。如果不记得以前改了哪些就建议选N了(特别是针对sshd),建议还是自己「合并」看看。
- 如果升级顺利,重启。
- 清掉不再需要的包。
apt update apt upgrade
apt update apt full-upgrade
reboot
apt autoremove
坑一:升级过程中ssh连接中断了
是我自己的锅。正在升级的时候,来了同事问我问题,作了一番长篇演说以后,忘记了这事,去忙别的了。回头想起来时,发现ssh已经断了。
ssh断之前应该是在apt
full-upgrade的过程中,等我回答某个配置文件如何处置。赶紧再连上,apt
full-upgrade继续,发现被锁。
遵照提示:
dpkg --configure -a
得以继续。
随后提醒自己下次记得集中注意力。
坑二:配置文件备份
升级完后发现有些不对,检查了一下,发现有配置文件被dpkg给备份起来了,后缀是dpkg-bak,改名回来解决。
可能还是第一个坑的后续。
坑三:haproxy启动不起来
算是一个小坑,因为报错信息在日志中写明白了。
我的haproxy是早期版本安装的,需要在haproxy.service中[Service]节内增加LimitNOFILE=524288的设定,不然ulimit -n有问题。
对Linux不太熟的朋友多说一句:haproxy.service一般在/etc/systemd/system/multi-user.target.wants目录下。当然也可能在别处,端看你之前是怎么安装的。实在找不到的话,去问问AI吧,或者装个mlocate。
[Unit]
Description=HAProxy Load Balancer
Documentation=man:haproxy(1)
Documentation=file:/usr/share/doc/haproxy/configuration.txt.gz
After=network-online.target rsyslog.service
Wants=network-online.target
[Service]
EnvironmentFile=-/etc/default/haproxy
EnvironmentFile=-/etc/sysconfig/haproxy
BindReadOnlyPaths=/dev/log:/var/lib/haproxy/dev/log
Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid" "EXTRAOPTS=-S /run/haproxy-master.sock"
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $EXTRAOPTS
ExecReload=/usr/sbin/haproxy -Ws -f $CONFIG -c $EXTRAOPTS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=143
Type=notify
LimitNOFILE=524288
# The following lines leverage SystemD's sandboxing options to provide
# defense in depth protection at the expense of restricting some flexibility
# in your setup (e.g. placement of your configuration files) or possibly
# reduced performance. See systemd.service(5) and systemd.exec(5) for further
# information.
# NoNewPrivileges=true
# ProtectHome=true
# If you want to use 'ProtectSystem=strict' you should whitelist the PIDFILE,
# any state files and any other files written using 'ReadWritePaths' or
# 'RuntimeDirectory'.
# ProtectSystem=true
# ProtectKernelTunables=true
# ProtectKernelModules=true
# ProtectControlGroups=true
# If your SystemD version supports them, you can add: @reboot, @swap, @sync
# SystemCallFilter=~@cpu-emulation @keyring @module @obsolete @raw-io
[Install]
WantedBy=multi-user.target
坑四:其它软件还没提供trixie源
我周一把Debian升级到trixie的时候,顺手把Nginx/PHP/Redis在/etc/apt/sources.list.d下面的Repo也给改了。然后就发现PHP已经有了trixie源,但Nginx还是404,Redis是403。
截止本文刊发的时候,Nginx已经OK了 ,Redis还没好。如果后续有变化,我就来把这一段编辑掉。
坑五:GFW捣什么乱
这个就坑我大发了,几乎可以专门写一篇。不过我还没完全弄明白,以后搞清楚了再说吧。
我家里的网络访问Debian官方源不算快(应该说很慢),我又不想改源,于是用了SS代理来「加速」。
apt
update的时候发现,Debian源没问题,但Nginx和PHP一直连接超时。区别就在于,Debian源是http,后二者是https。
用curl -x
-I简单试了一下,https还真是走不了SS代理。http就可以。
如果答案是「GFW检测并干扰了TLS over
SS」,那我没话说。我知道它有这能力,TLS的确特征明显,尤其是握手时。这可能也是最合理的一种解释了。
但我HTPC上有一台VM使用自己的ss-local是OK的。如何解释?同样的OS版本,同样的SS版本,同样的网络环境、节点、线路、协议、密钥、插件,同样的payload和访问特征,连TTL和MTU我都看了,实在是想不明白。
有问题的VM只是说TLS握手出问题的概率很高,但并非100%。我开了Verbose猫在两端看了一下,发现有问题的时候貌似有replay attack。我拿不准,但看起来像。两端的节点都换过,没有什么差别,该replay还replay。
在公司没问题,在家里有两台都有问题,可见应该跟家里接入的上海电信宽带有关。然而家里HTPC上从Windows去用那两台上的ss-local/privoxy作代理都没有问题,在我遇到问题的时候,儿子还在欢看YouTube呢,线路没被封。SS是AEAD版本,cipher不对时的反应是No Data Transfer,GFW肯定拿不准。
那台没问题的VM就是不会引发,100%地OK,让我始终想不通的终归还是这一点。在SS上面再叠一层tor,也是OK的。最后不得已,我让apt走了tor。没去试SS over FRP的方式。先这样吧,也没慢多少就是了。