先说个背景:我博客的 VPS 跑的是 Ubuntu 24.04。用了一年多,踩了不少跟包管理有关的坑,今天一次性吐出来。
Snap 真的是我见过最傲慢的东西
Ubuntu 24.04 默认把好多包都改成 snap 格式了。Firefox 是 snap,Software Store 是 snap,甚至 apt install 某些包的时候它会在背后给你装个 snap 版本。
最离谱的是什么?你 apt install firefox,装完发现是个 snap 包,启动慢三秒,/snap 目录下多好几个 loop 设备。我查了查 df -h,发现 snap 的 squashfs 文件系统占了我好几个 inode。
而且 snap 的更新机制真的很恶心——后台自动更新,更新失败了就挂着,下次启动发现"哦豁,打不开了"。我那个 1 核 1.9G 的小鸡本来资源就紧,snap 的自动更新还经常在半夜把 CPU 拉满。
解决方法?我的 VPS 上直接 apt purge snapd 了。反正服务器不需要 Firefox,也不走 Ubuntu Desktop 那套生态,snap 对我就是负资产。
APT 源那些事
Ubuntu 的 apt 源设计其实挺不错的,但刚上手的时候有几个事让我很迷惑。
源文件在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 下。Ubuntu 24.04 开始默认用 .sources 格式(debian822 格式),不是以前那个一行一个源的 old style 了。区别不大,就是结构化了,但如果你手动写习惯了旧格式,一眼看过去会懵:这什么玩意儿?
更坑的是,有些第三方源只提供旧格式的 sources.list 写法,你要自己转成 .sources 格式,不然 apt update 会警告。虽然不影响使用,但那个黄色 warning 每次 update 都冒出来,看着烦。
然后就是 PPA。Ubuntu 的 PPA 很方便,但千万别乱加。我见过最离谱的是以前装某个软件,按教程加了五六个 PPA,最后 apt update 的时候各种公钥错误、404 not found、依赖版本冲突。从那以后我学乖了:能用官方源就别用 PPA,用 PPA 就别加重复的。
dpkg 依赖地狱
这个是老生常谈了,但我还是要说——手动装 .deb 包就是开盲盒。
上次我装某个闭源软件,官网给了个 .deb 包。dpkg -i 一装,报了一堆依赖缺失。apt --fix-broken install 试了,不行,因为那个软件依赖的某个库版本和系统源里的版本不一样。
最终解决方案?把那个库 downgrade 了。这是一条不归路——你 downgrade 之后,其他依赖高版本的包又开始报错了。最后我选择把那个软件扔了。
所以我现在对手动装 .deb 的态度是:能用 apt 源装的,绝不手打。真有需要 deb 包的,先 dpkg -I package.deb 看看它依赖了哪些库,确认系统里有再装。
pip 和 apt 的相爱相杀
这个坑我猜很多人踩过。apt install python3-pip 之后,你会发现系统装的 pip 和 apt 的 python 包管理是两个体系。
你 pip install something 装到 /usr/local/lib/python3.xx/site-packages/ 里,apt 管理的包在 /usr/lib/python3 下。两个互不知道对方的存在。更坑的是,如果你 pip install --upgrade 了一个 apt 管理的包,apt 那边就炸了。
Ubuntu 24.04 现在加了 PEP 668 的保护机制,pip install 会直接报错让你用 venv。这个改动有人讨厌有人喜欢,我属于喜欢的那边——它逼着你用虚拟环境了,这在以前是"老手才做的事",现在变成了必须的规范。虽然一开始不习惯,但长远看是好事。
我现在所有 Python 项目都走 uv 或者 venv,系统 python 只装 apt 源里的包,各管各的,世界清净了。
总结(其实不是总结,就是吐槽完了)
Linux 包管理最爽的地方是"一个命令装一切",最恶心的地方是"装错了要清半天"。我现在的基本原则就几条:
- 能用 apt 用 apt,不行再想别的办法
- 不用 snap(装完就删)
- Python 必开 venv,绝不对系统 python 动手动脚
- 不装来路不明的 deb
- apt update 之前先看看要 upgrade 什么,别闭着眼睛
apt upgrade -y
就这样吧,写这个主要是因为这几天又在折腾服务器,被 apt 搞了一次,觉得不写出来对不起自己的火气 😅