实测有效 Fedora Silverblue 越来越慢怎么办 从清理旧镜像到优化磁盘空间的性能调优全攻略
说实话,Silverblue 这种 immutable 架构的系统用久了变慢,真的挺让人头疼的。你刚开始用它的时候,那种像新手机一样的流畅感真的很好——启动快、界面丝滑、每个应用都是容器化隔离的。但几个月后,你可能会发现事情不对劲:开机变慢了,打开应用要等,甚至鼠标点击都有轻微的延迟感。
别急,这不是什么大问题,我们一步步来排查。
为什么 Silverblue 会越用越慢
首先得搞清楚原因,不然就像医生没诊断就开药。Silverblue 的变慢通常来自几个地方:
旧镜像堆积:每次你用 rpm-ostree upgrade 更新系统,其实是在镜像层(overlay)上添加新的层,旧的层并不会立即删除。虽然银蓝色系统会保留几个旧版本以便回滚,但如果你频繁更新,这些镜像就会越堆越多。
磁盘碎片和空间紧张:虽然 rootfs 是只读的,但 /var、/home 这些可写分区仍然需要管理。当可用空间低于一定阈值,系统性能会明显下降。
内核参数和系统配置没有针对当前硬件优化:这是很多新手容易忽略的点。
让我给你展示一个典型的场景:
# 检查当前有多少层叠加的镜像
rpm-ostree status
# 输出可能是这样的:
# State: idle
# Deployments:
# ● fedora:fedora/x86_64/silverblue
# Version: 40.20240320.0 (2024-03-20T18:30:00Z)
# fedora:fedora/x86_64/silverblue
# Version: 40.20240313.0 (2024-03-13T18:30:00Z)
# fedora:fedora/x86_64/silverblue
# Version: 40.20240306.0 (2024-03-06T18:30:00Z)
你看,这已经有三个部署了。如果每次都保留旧的,磁盘空间会慢慢被吃掉。
清理旧镜像——最立竿见影的操作
这是最关键的一步。Silverblue 默认会保留 3 个旧版本用于回滚,但如果你的磁盘空间不太充裕,或者你根本不会回滚到旧版本,那就可以清理掉不需要的。
查看当前镜像占用空间
# 查看每个镜像的大小
rpm-ostree status --verbose
# 或者用这个更直观的方式
ls -lh /var/lib/ostree/deploy/
# 查看 overall 的磁盘使用情况
df -h / /boot /var
清理旧镜像
# 清理一个旧镜像,只保留最新部署
rpm-ostree cleanup --deploy
# 清理所有旧镜像,包括 refcache
rpm-ostree cleanup --rebase
# 最彻底的清理:删除所有旧镜像和缓存
rpm-ostree cleanup --rollback
rpm-ostree cleanup --refcache
# 组合使用,一次性清理所有可清理的内容
rpm-ostree cleanup --rollback --rebase --refcache
这里有个重要的细节:--rollback 会删除旧的回滚部署,--rebase 会清理当前部署中过时的内容,--refcache 则会删除 ref 缓存。这三个选项结合起来,效果通常最明显。
重启让清理生效
# 清理完镜像后,必须重启才能生效
reboot
重启后再次检查:
rpm-ostree status --verbose
df -h /
你会发现,可写分区的大小明显变多了。很多用户做完这一步,就会感觉到系统响应明显快了一档。
释放 /var 和缓存空间
Silverblue 的 rootfs 是只读的,但 /var 是可写的,这里积累了大量缓存数据。
清理 DNF 和 PackageKit 缓存
# 清理 DNF 缓存
sudo dnf clean all
# 清理 PackageKit 缓存(系统更新也会用这个)
sudo packagekit-clean
# 查看缓存占用空间
du -sh /var/cache/dnf
du -sh /var/cache/PackageKit
清理用户级缓存
# 查看用户缓存大小
du -sh ~/.cache
# 清理 pip 缓存(如果你用 Python)
pip cache purge
# 清理 npm 缓存(如果你用 Node.js)
npm cache clean --force
# 清理 Docker 镜像和容器(如果用 Docker)
docker system df
docker system prune -a
# 清理 Flatpak 缓存
flatpak uninstall --unused
flatpak repair
清理 systemd 日志
# 查看系统日志占用空间
journalctl --disk-usage
# 限制日志最大占用空间(比如保留 100MB)
sudo journalctl --vacuum-size=100M
# 或者只保留最近 2 天的日志
sudo journalctl --vacuum-time=2d
清理 Thunar/文件管理器临时文件
# 清理缩略图缓存
rm -rf ~/.cache/thumbnails/*
# 清理 GNOME 缩略图
rm -rf ~/.cache/thumbnails/normal/*
rm -rf ~/.cache/thumbnails/large/*
检查磁盘健康和空间碎片
虽然 ext4 和 btrfs 都有一定的自动碎片整理能力,但当磁盘可用空间低于 10% 时,性能下降会很明显。
# 查看磁盘使用详情
df -h
df -i # 查看 inode 使用情况
# 查看哪个目录占用最多空间
sudo du -sh /* 2>/dev/null | sort -hr
# 查看 /home 下哪个用户目录占用最多
sudo du -sh /home/* | sort -hr
# 查看 /var 下哪个子目录占用最多
sudo du -sh /var/* | sort -hr
如果你发现某个特定目录占用异常大,可以用更细粒度的方式排查:
# 例如,查看 /var/lib 下占用最多的目录
sudo du -sh /var/lib/* | sort -hr
# 查看 /home 下某个用户的具体情况
sudo du -sh /home/你的用户名/* | sort -hr
sudo du -sh /home/你的用户名/.cache/* | sort -hr
系统级别的性能调优
除了清理空间,还有很多系统层面的优化可以做。
调整 swappiness(交换内存行为)
# 查看当前 swappiness 值
cat /proc/sys/vm/swappiness
# 临时调整(重启后失效)
sudo sysctl vm.swappiness=10
# 永久调整,写入配置文件
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
# 验证
sysctl vm.swappiness
解释一下:默认值是 60,意味着系统在内存使用率达到 60% 时就开始往交换分区写数据。对于 SSD 来说,这其实不太划算——SSD 的随机读写速度虽然快,但比内存还是慢几个数量级。把它调到 10,系统会尽量把数据留在内存里,只在必要时才使用交换空间。
调整 I/O 调度器
# 查看当前使用的 I/O 调度器
cat /sys/block/sda/queue/scheduler
# 对于 SSD,推荐使用 noop 或 none 调度器
# 临时修改
echo noop | sudo tee /sys/block/sda/queue/scheduler
# 永久修改,创建 udev 规则
echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="noop"' | sudo tee /etc/udev/rules.d/60-ioscheduler.rules
# 如果是 NVMe 设备
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
启用 fstrim(对 SSD 很重要)
# 检查 fstrim 服务状态
systemctl status fstrim.timer
# 如果没有启用,就启用它
sudo systemctl enable --now fstrim.timer
# 手动执行一次 fstrim
sudo fstrim -av
# 查看 fstrim 的执行日志
journalctl -u fstrim.timer
这个操作很关键:fstrim 会让 SSD 知道哪些块是真正空闲的,从而在执行写入时更高效。如果不启用这个,SSD 的写入性能会随着使用时间逐渐下降。
调整文件系统挂载选项
# 查看当前挂载选项
findmnt -no OPTIONS /
# 编辑 fstab,为根文件系统添加 noatime 和 discard 选项
# 注意:Silverblue 的 rootfs 是只读的,所以主要在 /home 和 /var 上做调整
# /home 可以添加 noatime(不更新访问时间,减少写操作)
# 编辑时注意备份
sudo cp /etc/fstab /etc/fstab.bak
# 然后编辑
sudo nano /etc/fstab
# 在 /home 那行的 options 中添加 noatime,discard
# 例如:
# /dev/mapper/fedora_home /home ext4 defaults,noatime,discard 0 2
修改后重新挂载:
# 先_umount_再_mount_,或者重启
sudo mount -o remount,noatime,discard /home
应用层面的优化
Silverblue 的应用大多通过 Flatpak 运行,Flatpak 本身也带来了一些额外的开销。
管理 Flatpak 应用
# 查看已安装的 Flatpak 应用
flatpak list
# 查看 Flatpak 占用空间
du -sh ~/.local/share/flatpak
du -sh /var/lib/flatpak
# 卸载不用的应用
flatpak uninstall 应用ID
# 清理未被使用的运行时和SDK
flatpak uninstall --unused
# 修复可能的损坏
flatpak repair
优化 GNOME 桌面环境
# 查看 GNOME 扩展,禁用不必要的扩展
gnome-extensions list
gnome-extensions list --enabled
# 禁用不常用的扩展(示例)
gnome-extensions disable user-theme@gnome-shell-extensions.gcampax.github.com
# 减少动画效果,提升响应速度
gsettings set org.gnome.desktop.interface enable-animations false
# 调整工作区数量,减少切换开销
gsettings set org.gnome.desktop.wm.preferences num-workspaces 4
# 关闭不必要的后台服务
systemctl --user stop gnome-shell-extension-updater.service
systemctl --user disable gnome-shell-extension-updater.service
监控哪些进程最耗资源
# 查看 CPU 占用最高的进程
ps aux --sort=-%cpu | head -10
# 查看内存占用最高的进程
ps aux --sort=-%mem | head -10
# 使用 htop 交互式查看
htop
# 或者使用 top
top
进阶:内核参数调优
对于有一定基础的用户,可以进一步调整内核参数。
# 编辑 sysctl 配置文件
sudo nano /etc/sysctl.d/99-performance.conf
# 添加以下内容:
# 减少交换压力,尽量使用内存
vm.swappiness=10
vm.dirty_ratio=10
vm.dirty_background_ratio=5
# 优化 TCP 网络性能
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_congestion_control=bbr
# 减少文件句柄耗尽的风险
fs.file-max=2097152
fs.inotify.max_user_watches=524280
fs.inotify.max_user_instances=65535
# 保存后加载
sudo sysctl --system
# 验证
sysctl vm.swappiness
sysctl net.ipv4.tcp_congestion_control
常见陷阱和注意事项
这里有一些我在社区里经常看到的坑,提前告诉你:
不要随意删除 ~/.cache 里的东西:有些缓存是应用程序运行时必需的,比如浏览器缓存。删了之后应用会重新下载,反而更慢。只清理你确定不再需要的。
不要过度清理日志:系统日志对于排查问题很重要。除非磁盘空间真的告急,否则保留最近几天的日志就好。
Silverblue 的 rootfs 不要尝试修改:rootfs 是只读的,任何对它的修改都会被丢弃。如果需要修改系统级配置,通过 overlay 的方式来做。
定期重启:Silverblue 的设计理念就是”更新即重启”。每次重启不仅是为了应用新镜像,也是为了清理内存碎片和重启系统服务。每周至少重启一次。
总结:日常维护的实用清单
把以上操作浓缩成一个日常维护的脚本,方便你定期执行:
#!/bin/bash
# Silverblue 性能维护脚本
# 保存为 ~/scripts/silverblue-maintenance.sh
echo "=== Silverblue 性能维护开始 ==="
echo "时间: $(date)"
# 1. 清理 rpm-ostree 镜像
echo "清理旧镜像..."
rpm-ostree cleanup --rollback --rebase --refcache
# 2. 清理系统缓存
echo "清理 DNF 缓存..."
sudo dnf clean all
echo "清理 PackageKit 缓存..."
sudo packagekit-clean
# 3. 清理系统日志
echo "清理系统日志..."
sudo journalctl --vacuum-time=3d
# 4. 执行 fstrim
echo "执行 fstrim..."
sudo fstrim -av
# 5. 清理 Flatpak
echo "清理 Flatpak 未使用资源..."
flatpak uninstall --unused
# 6. 显示磁盘使用情况
echo ""
echo "=== 当前磁盘使用情况 ==="
df -h / /home /var
echo ""
echo "=== 维护完成 ==="
给脚本加上执行权限:
chmod +x ~/scripts/silverblue-maintenance.sh
然后你可以把这个脚本加到 cron 里,每周自动执行一次:
crontab -e
# 添加以下内容,每周日凌晨 3 点执行
0 3 * * 0 /home/你的用户名/scripts/silverblue-maintenance.sh
说到底,Silverblue 变慢这件事,绝大多数时候不是因为系统本身有问题,而是因为积累了太多没人管的数据。镜像层没清理、缓存没清理、日志没清理,这些都是在悄悄吃掉你的性能和空间。
做一次彻底的清理,再配合合理的系统参数调整,你会发现那个流畅的 Silverblue 又回来了。如果还有问题,欢迎继续问我,咱们一起排查。
