说实话,刚入手 Fedora Silverblue 的时候,我也曾对着那个只读的文件系统发呆。习惯了传统 Linux 发行版那种“想删啥删啥、想改啥改啥”的随意感,突然面对一个被容器化包裹得严严实实的系统,心里难免有点打鼓:这玩意儿到底能不能用?会不会因为所谓的“原子更新”导致系统臃肿不堪,最后卡顿得连浏览器都打不开?
别担心。作为在这个圈子里摸爬滚打多年的老鸟,我可以负责任地告诉你,Silverblue 不仅能用,而且只要调教得当,它的稳定性和响应速度往往优于传统的 Fedora Workstation。它的核心优势在于一致性,但代价是如果你不知道如何管理那些隐藏的资源消耗,磁盘空间确实会像漏水的桶一样慢慢见底,而内核参数的默认设置也并非为了极致的桌面响应速度而优化。
今天咱们不整那些虚头巴脑的理论,直接上手干货。我会带你一步步把这台机器从“刚开箱的生涩”调整到“如丝般顺滑”的状态。我们要做的,是从最基础的磁盘清理开始,深入到存储池的管理,再到微调内核参数以改善 I/O 和内存行为。这一套组合拳下来,你的 Silverblue 绝对能让你刮目相看。
一、 解开“只读”的心结:理解并清理磁盘空间
首先,你得明白为什么 Silverblue 的 /var 或 /home 以外的地方看起来总是很空,但 df -h 一看却快满了。这是因为 Silverblue 基于 OSTree,每一次系统更新都会生成一个新的部署版本(deployment)。如果你更新了五次,而没有清理旧的部署,你就白白浪费了五份完整的系统根文件系统空间。
这不是 bug,这是特性。但在我们的 SSD 容量日益昂贵的今天,这种“特性”确实需要管理。
1. 清理旧的系统部署
这是释放空间最直接、最有效的方法。不要手动去删除文件,那样会破坏 OSTree 的完整性。请使用 rpm-ostree 自带的工具。
打开终端,输入以下命令查看当前的部署状态:
rpm-ostree status
你会看到类似这样的输出:
● fedora:fedora/x86_64/silverblue/40
Version: 40.20240115.0 (2024-01-15T10:00:00Z)
BaseCommit: abc123...
fedora:fedora/x86_64/silverblue/40
Version: 40.20240110.0 (2024-01-10T10:00:00Z)
BaseCommit: def456...
fedora:fedora/x86_64/silverblue/40
Version: 40.20240105.0 (2024-01-05T10:00:00Z)
BaseCommit: ghi789...
注意前面的符号。● 表示当前正在运行的版本, 表示已安装但未激活的版本。通常,保留当前版本和上一个版本就足够了。如果磁盘空间紧张,你可以安全地删除更早的版本。
假设你想删除第二个和第三个版本(即 def456 和 ghi789),你可以这样做:
# 注意:请根据你的实际输出替换版本号或哈希值
sudo rpm-ostree uninstall fedora:fedora/x86_64/silverblue/40:40.20240110.0
sudo rpm-ostree uninstall fedora:fedora/x86_64/silverblue/40:40.20240105.0
或者,如果你想一次性清理所有非当前且非上一级的旧部署,可以使用更激进的方式(需谨慎):
# 这个命令会尝试清理未使用的部署,但具体行为取决于版本
# 更推荐手动指定删除,以确保万无一失
实际上,rpm-ostree 并没有一个直接的“自动清理所有旧版本”的命令,因为它需要确保你至少保留一个可回滚的版本。所以,最稳妥的方式是定期执行 rpm-ostree cleanup --repomd 来清理本地仓库缓存,并通过上述方式手动移除过时的部署。
2. 清理用户空间的垃圾
除了系统层面的部署,用户数据也是占用大户。在 Silverblue 中,你的主目录 /home/$USER 是读写层的一部分(通过 OverlayFS 挂载)。这意味着你可以在这里自由创建、修改和删除文件,就像在传统 Linux 上一样。
Flatpak 缓存:如果你大量使用 Flatpak 应用,它们的缓存可能会变得很大。
flatpak uninstall --unused这个命令会卸载所有未被任何应用程序依赖的运行时和驱动,通常能释放几百 MB 甚至几 GB 的空间。
Dconf/GSettings 数据库:有时候,配置数据库也会膨胀。虽然不常见,但如果发现
/home/$USER/.config/dconf/user文件异常巨大,可以尝试重置相关应用的配置。下载文件夹和临时文件:这是老生常谈,但在 Silverblue 中,由于根文件系统是只读的,所有的临时文件都必须落在
/home或/tmp(通常是 tmpfs,重启后消失)。定期检查~/Downloads和~/Documents,删除不再需要的安装包、ISO 镜像和大型视频文件。
二、 深入底层:Btrfs 子卷与快照管理
Fedora Silverblue 默认使用 Btrfs 文件系统,并利用其快照功能来实现原子更新。当你执行 rpm-ostree upgrade 时,它实际上是在创建一个新的事务性快照。如果你频繁更新而不清理,这些快照会占用大量空间。
1. 检查 Btrfs 使用情况
使用以下命令查看 Btrfs 的整体使用情况:
btrfs filesystem usage /
重点关注 Data 和 System 部分的占用情况。如果 Data 占用异常高,可能意味着有大量的重复数据或未压缩的文件。
2. 手动清理 Btrfs 快照
虽然 rpm-ostree 管理着主要的系统快照,但有时可能会有残留的快照。你可以列出所有快照:
sudo btrfs subvolume list /
寻找那些名称中包含 .old 或明显不属于当前部署的快照。例如:
ID 256 gen 12345 top level 5 path var/lib/flatpak/override
ID 257 gen 12346 top level 5 path var/lib/containers
警告:不要随意删除 ID 对应路径下的子卷,除非你非常清楚自己在做什么。对于系统相关的快照,最好还是依赖 rpm-ostree 进行管理。
3. 启用 Btrfs 自动压缩
Btrfs 支持透明压缩,可以显著减少磁盘空间占用,尤其是对于文本文件和日志。虽然 Silverblue 默认可能没有开启全局压缩,但你可以通过挂载选项来启用。
编辑 /etc/fstab,找到根分区的挂载行,添加 compress=zstd:1 或 compress=zstd:3(数字越大,压缩率越高,但 CPU 开销也越大)。对于大多数现代 CPU,zstd:1 是一个很好的平衡点。
UUID=your-uuid-root / btrfs defaults,compress=zstd:1,noatime 0 0
然后重新挂载或重启系统使更改生效。这将使得新写入的文件自动压缩,从而节省空间并可能提高 I/O 性能(因为传输的数据量变小了)。
三、 内核参数微调:让系统响应更灵敏
默认的内核参数是为了通用性和兼容性而设置的。但对于桌面用户,尤其是追求流畅体验的用户来说,我们可以做一些针对性的调整。这些调整主要通过 sysctl 进行,并且可以通过 systemd-sysctl 服务持久化。
1. 优化虚拟内存管理
Linux 的内核虚拟内存管理器(VMM)有一个关键参数 vm.swappiness,它决定了内核将进程数据从内存交换到磁盘交换空间的倾向性。默认值通常是 60。对于拥有足够内存(如 16GB 或以上)的现代系统,我们希望尽可能少地使用交换空间,以保持内存中的数据活跃,从而提高响应速度。
建议将 vm.swappiness 设置为 10 或更低。
创建或编辑 /etc/sysctl.d/99-silverblue-tuning.conf:
# 降低交换倾向,优先使用 RAM
vm.swappiness = 10
# 增加 inode 缓存比例,因为 Linux 桌面环境中大量的小文件操作(如浏览网页、编译代码)会导致 inode 缓存不足
vm.vfs_cache_pressure = 50
应用更改:
sudo sysctl --system
2. 优化 I/O 调度器
现代 SSD 不需要传统的 I/O 调度器(如 deadline 或 cfq)来进行复杂的排序,因为它们没有机械磁头的寻道延迟。因此,使用 none 或 noop 调度器可以减少不必要的 CPU 开销。
检查当前的 I/O 调度器:
cat /sys/block/sda/queue/scheduler
输出可能类似 [none] mq-deadline kyber bfq,其中方括号内的即为当前活跃的调度器。
为了持久化设置,创建 /etc/udev/rules.d/60-io-scheduler.rules:
# 假设你的磁盘是 sda,请根据实际情况修改
ACTION=="add|change", ATTRS{transport}=="usb", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="none"
对于 NVMe 设备,通常默认就是 none,但显式设置可以确保一致性。
3. 调整网络参数以提升网页浏览体验
如果你经常浏览网页,TCP 连接建立的速度会影响体验。可以通过调整 TCP 窗口缩放和拥塞控制算法来优化。
在 /etc/sysctl.d/99-network-tuning.conf 中添加:
# 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling = 1
# 使用 BBR 拥塞控制算法(如果可用),通常比默认的 CUBIC 更适合高带宽延迟产品网络
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
应用更改后,可以通过以下命令验证 BBR 是否生效:
sysctl net.ipv4.tcp_congestion_control
如果输出是 bbr,则说明设置成功。
四、 Flatpak 与容器的性能考量
Silverblue 的核心哲学之一是 Flatpak。然而,Flatpak 应用的性能和启动速度有时不如原生 RPM 包。这是因为 Flatpak 应用运行在沙箱环境中,需要额外的资源开销。
1. 使用 Flatpak 的 FDO 兼容层优化
确保你的系统安装了最新的 freedesktop.org SDK 和运行时,因为新版运行时通常包含更多的共享库和优化。
flatpak update
2. 禁用不必要的 Flatpak 扩展
有些 Flatpak 应用会安装额外的扩展(如 GTK 主题、字体等),这些扩展可能会增加启动时间和内存占用。定期检查并移除未使用的扩展:
flatpak list --app
flatpak list --runtime
如果发现有长期未使用的运行时,可以考虑卸载:
flatpak uninstall --delete-data org.freedesktop.Platform.GL.default
3. 考虑使用 Toolbox 进行开发
如果你是开发者,不要在 Flatpak 容器中安装沉重的开发工具链。相反,使用 toolbox 创建一个基于 RPM 的开发环境。Toolbox 容器共享宿主机的内核和部分库,启动速度更快,资源占用更少。
toolbox create
toolbox enter
五、 监控与持续维护
优化不是一劳永逸的事情。你需要建立一个定期的维护习惯。
1. 定期清理
每月执行一次以下命令:
# 清理 Flatpak 未使用的运行时
flatpak uninstall --unused
# 清理系统缓存
sudo rpm-ostree cleanup --repomd
# 检查磁盘空间
df -h
2. 监控系统资源
使用 htop 或 btop 等工具监控系统资源使用情况。如果发现某个进程占用过多 CPU 或内存,及时排查。
3. 关注内核更新
Fedora 的内核更新通常包含重要的性能改进和安全补丁。保持系统最新,并定期重启以加载新内核。
结语
Fedora Silverblue 的优化之路,本质上是一场对“原子性”和“可维护性”之间平衡的艺术探索。通过清理旧部署,我们释放了宝贵的磁盘空间;通过调整 Btrfs 和内核参数,我们提升了系统的响应速度和 I/O 效率;通过合理管理 Flatpak 和 Toolbox,我们确保了应用生态的健康运行。
记住,没有银弹。最适合你的配置,取决于你的硬件和使用习惯。不妨从小处着手,逐步调整,观察变化。当你看到系统启动时间缩短,应用切换如行云流水,磁盘空间充裕时,你会发现,Silverblue 不仅仅是一个操作系统,更是一种高效、整洁的工作方式。
现在,去终端里敲下那些命令吧,让你的 Silverblue 焕发出真正的活力。
