Fedora Silverblue 磁盘空间告急应用卡顿?这5个实用优化方案让不可变系统流畅如飞
你好!我知道你现在的处境——Fedora Silverblue 这条”不可变”的线,本来是为了省心,结果发现磁盘空间越来越紧张,软件也开始有点拖沓。别慌,这种问题我见过太多次了,今天咱们就一步步把 Silverblue 调教得舒舒服服的。
理解 Silverblue 的”存储逻辑”
在开始动手之前,你先得搞清楚 Silverblue 到底是怎么存东西的。跟传统 Fedora Workstation 不一样,Silverblue 的根文件系统是只读的,所有系统级别的软件都用 rpm-ostree 打包管理,每次更新都是整体替换部署,不是那种”升级几个包”的做法。这意味着什么?意味着你每次 rpm-ostree upgrade,旧的部署镜像会一直留在磁盘上,直到新部署成功才会被回收。
# 查看当前所有的 rpm-ostree 部署情况
rpm-ostree status
# 你会看到类似这样的输出:
# ● fedora:fedora/x86_64/silverblue/40
# Version: 40.20240515.0 (2024-05-15T10:30:00Z)
#
# ○ fedora:fedora/x86_64/silverblue/40
# Version: 40.20240508.0 (2024-05-08T14:20:00Z)
看到那个 ● 和 ○ 了吗?● 是当前正在用的,○ 是旧的部署镜像。这些旧镜像就是你磁盘空间的”隐形杀手”。你可以手动清理掉它们:
# 清理所有旧的部署镜像,只保留当前的
rpm-ostree cleanup --reclaim
# 清理一个特定的旧部署(替换 <deployment-id> 为实际ID)
rpm-ostree cleanup --rollback --reflink --base=<deployment-id>
另外,Silverblue 默认用 btrfs 文件系统,它有自己的快照管理机制。系统会自动创建快照,但如果你不监控的话,这些快照也会慢慢吃掉你的空间。
# 查看 btrfs 子卷和快照占用情况
btrfs subvolume list /
btrfs filesystem usage /
# 查看具体的空间分配
df -h /
第一个大招:清理 Flatpak 的”缓存黑洞”
Flatpak 是 Silverblue 的默认应用分发方式,你打开”软件”应用装的所有东西几乎都是 Flatpak 包。Flatpak 有一个特性叫”运行时缓存”——每次你更新一个应用,它会把旧的运行时版本也缓存下来,以防回退。问题来了:这些缓存会随着时间无限增长。
# 查看 Flatpak 总共占了多少空间
flatpak du
# 你会看到类似这样的输出:
# ID 类型 应用程序 分支 操作数 大小 安装大小 下载大小
# runtime org.freedesktop Freedesktop Platform 24.08 1 1.2 GB 4.8 GB 1.2 GB
# runtime org.freedesktop Freedesktop Platform 23.08 0 0 3.9 GB 0
# app com.slack.Slack stable 1 380 MB 1.2 GB 380 MB
看到那个 23.08 的运行时吗?如果你已经切换到 24.08 了,23.08 的缓存完全是多余的。用这个命令清理掉:
# 清理所有未被任何应用使用的运行时
flatpak uninstall --unused
# 清理 Flatpak 的应用缓存(下载的文件等)
flatpak uninstall --delete-data
# 彻底清理(包括所有旧版本的应用数据)
flatpak uninstall --delete-data --app-compat
还有一个容易被忽略的角落——Flatpak 的日志和临时文件。它们通常藏在用户目录的 ~/.local/share/flatpak/ 下面:
# 查看 Flatpak 数据目录的总大小
du -sh ~/.local/share/flatpak/
# 清理 Flatpak 的缓存目录
rm -rf ~/.local/share/flatpak/cache/
rm -rf ~/.local/share/flatpak/download/
# 清理 Flatpak 的 runtime 缓存(更激进,需要重新下载运行时)
rm -rf ~/.local/share/flatpak/runtime/
注意最后那个命令比较激进,它会清掉所有下载的运行时,下次启动应用时会自动重新下载。所以如果你的网络环境不太好,建议只清理 cache/ 和 download/ 目录。
第二个大招:管理 rpm-ostree 的部署堆积
前面提到了 rpm-ostree 会保留旧的部署镜像,但实际使用中,有时候你会发现磁盘空间还是不够用,尤其是当你频繁升级系统的时候。一个比较激进的清理方法是手动移除旧的部署:
# 先查看所有部署的详细信息
rpm-ostree status --verbose
# 输出类似:
# State: idle
# Deployments:
# ● fedora:fedora/x86_64/silverblue/40
# Version: 40.20240515.0
# Commit: abc1234...
# OS Name: Fedora Linux 40
#
# ○ fedora:fedora/x86_64/silverblue/40
# Version: 40.20240508.0
# Commit: def5678...
# OS Name: Fedora Linux 40
你可以用这个命令移除指定的旧部署:
# 移除特定的旧部署(用部署ID,比如上面的 "fedora:fedora/x86_64/silverblue/40" 加上版本号)
rpm-ostree cleanup --rollback --base=<旧部署的commit-id>
# 或者更简单地,移除所有回滚部署
rpm-ostree cleanup --rollback
不过要注意,rpm-ostree 默认会保留最近一次的回滚部署,这是为了让你可以在升级出问题后回退。如果你确定不需要回退,可以用:
# 移除所有回滚部署(谨慎使用,一旦升级出问题无法回退)
rpm-ostree cleanup --rollback --all
第三个大招:清理系统日志和临时文件
Silverblue 虽然是不可变系统,但 /var/log 和 /var/tmp 这些目录依然是可写的。随着时间推移,系统日志、journal 日志会积累得非常多,尤其如果你开了很多调试级别日志的话。
# 查看系统日志占用空间
journalctl --disk-usage
# 清理日志,只保留最近7天的
journalctl --vacuum-time=7d
# 或者按大小清理,保留最近500MB的日志
journalctl --vacuum-size=500M
# 查看 /var/tmp 的大小
du -sh /var/tmp
另外,/var/cache 下面也有很多可以清理的东西:
# 查看 /var/cache 的总大小
du -sh /var/cache
# 清理 dnf/rpm 的缓存
sudo dnf clean all
# 清理 pip 缓存(如果你有 Python 项目)
pip cache purge
# 清理 packagekit 缓存
sudo rm -rf /var/cache/PackageKit/*
这些操作都需要 sudo 权限,因为它们涉及系统级的目录。
第四个大招:优化 btrfs 的存储效率
Silverblue 默认使用 btrfs 文件系统,它有几个很强大的功能可以帮助你节省空间。首先是 压缩——btrfs 可以在写入数据时自动压缩,对于文本类数据(代码、文档、日志)效果特别好,压缩比可以达到 2:1 甚至更高。
检查你的 btrfs 文件系统是否启用了压缩:
# 查看挂载选项,看是否有 compress 选项
findmnt -no OPTIONS /
# 如果输出中没有 compress,可以考虑重新挂载启用
# 编辑 /etc/fstab,在根分区的挂载选项中加入 compress=zstd
zstd 压缩算法在 Silverblue 40+ 中是默认推荐的,它比旧的 lzo 和 zlib 更快,压缩比也更好。如果你启用了压缩,可以用这个命令压缩已有的数据:
# 对已有文件启用压缩(需要重启或重新挂载)
sudo btrfs filesystem compress -c zstd /
其次是 去重——btrfs 支持子卷级别的数据去重,如果多个部署镜像中有相同的文件,它们会共享磁盘空间。这其实就是 rpm-ostree 本身的设计哲学,但你可以通过一些工具来监控去重效果:
# 查看 btrfs 的引用计数(需要 btrfs-progs)
sudo btrfs check --check-data-csum /dev/your-root-partition
# 查看子卷的占用详情
btrfs qgroup show /
最后,btrfs 的快照管理也很重要。Silverblue 的每次部署都会创建一个快照,这些快照会消耗额外的空间。你可以定期清理不用的快照:
# 列出所有快照
sudo btrfs subvolume list /
# 删除不需要的快照(先确认是安全的)
sudo btrfs subvolume delete /@/.snapshots/old-snapshot-name
第五个大招:监控与预防——让问题不再发生
前面四个方案都是”治标”,真正聪明的人是”治未病”。我给你整理了一套日常监控和预防的流程,让你不会再遇到磁盘空间告急的情况。
首先,安装一些实用的监控工具:
# 在 Silverblue 中安装 monitoring 工具(通过 rpm-ostree install)
rpm-ostree install btop ncdu duf
# 重新部署后重启生效
rpm-ostree deploy
然后你可以用 ncdu 来交互式地浏览磁盘占用:
# 扫描根文件系统的占用情况
ncdu /
# 扫描用户目录
ncdu ~/.local/share/
ncdu ~/Downloads/
btop 是一个非常好用的系统监控工具,可以实时看到磁盘、内存、CPU 的使用情况:
# 启动 btop
btop
建立一个简单的日常检查脚本是个好习惯:
#!/bin/bash
# 保存为 ~/.local/bin/silverblue-health-check.sh
echo "=== Fedora Silverblue 健康检查 ==="
echo ""
echo "1. 磁盘使用情况:"
df -h / | grep -v Filesystem
echo ""
echo "2. rpm-ostree 部署情况:"
rpm-ostree status --verbose | head -20
echo ""
echo "3. Flatpak 空间占用:"
flatpak du | head -10
echo ""
echo "4. 系统日志大小:"
journalctl --disk-usage
echo ""
echo "5. btrfs 空间使用:"
btrfs filesystem usage / | tail -10
echo ""
echo "=== 检查完成 ==="
你可以把这个脚本加到 crontab 中,每周自动运行一次,输出结果保存到文件里,方便你追踪变化趋势:
# 添加到 crontab,每周日晚上 2 点运行
0 2 * * 0 ~/.local/bin/silverblue-health-check.sh >> ~/.local/share/silverblue-health-check.log
另外,我强烈建议你了解一下 btrfs 的 自动清理机制。你可以配置 btrfs 的 autodefrag 和 noatime 挂载选项,减少不必要的磁盘写入和碎片化:
# 编辑 /etc/fstab,确保根分区有这些选项
# 示例行:
# UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / btrfs defaults,noatime,compress=zstd,autodefrag 0 0
noatime 会阻止每次读取文件时都更新访问时间戳,这对 SSD 寿命和性能都有好处。autodefrag 会自动整理文件碎片,保持文件系统的高效运行。
一些额外的实用小技巧
对了,还有一个很多人不知道的小技巧——Silverblue 的 /usr 目录其实是只读的联合挂载,但 /var 和 /home 是可写的。这意味着你可以在 /home 下保存大量数据而不影响系统分区。如果你的数据比较多,建议把视频、音乐、文档等大文件都放在 /home 下的专用目录里,然后用符号链接把它们”挂”到常用位置:
# 创建大型文件存储目录
mkdir -p ~/Data/{Documents,Movies,Music,Images}
# 把 Documents 链接到 ~/.local/share
ln -sfn ~/Data/Documents ~/.local/share/Documents
还有,如果你用的是外部存储设备(比如 NAS 或者外接硬盘),可以考虑用 systemd automount 来挂载它们,而不是传统的 /etc/fstab。这样设备只在真正被访问时才挂载,减少了系统启动时的等待时间和潜在的挂载问题。
最后,我想说的是,Silverblue 的”不可变”设计本身就是一个优势——它让系统更加稳定、可回滚、可预测。上面的这些优化方案都是在尊重这个设计理念的前提下进行的微调,不会破坏 Silverblue 的核心优势。你不需要频繁地清理东西,只需要建立一个定期检查的习惯,系统就会一直保持清爽流畅的状态。
希望这些方法能帮到你。如果你的 Silverblue 现在正处于”磁盘空间告急”的状态,我建议按顺序执行:先清 Flatpak 缓存,再清理 rpm-ostree 部署,然后清理系统日志,最后优化 btrfs。这样一步步来,应该能释放出几个 GB 的空间。加油!
