说实话,刚接触 Fedora Silverblue 的时候,我也曾盯着那个冷静的终端界面发呆。不同于我们熟悉的传统 Linux 发行版(比如 Fedora Workstation 或者 Ubuntu),Silverblue 采用的是不可变操作系统(Immutable OS)的理念。这意味着你的 /usr 和 /etc 目录是只读的,所有的软件包变更都通过 rpm-ostree 进行原子化更新。这种设计带来了极高的系统稳定性和安全性,但也让很多习惯了“直接改配置”、“随便装个库”的老用户感到束手束脚:“我想调优?我想删服务?我该往哪下手?”
别担心,Silverblue 并不是把门焊死了,它只是换了一把钥匙。今天,我们就抛开那些枯燥的理论,像老朋友聊天一样,深入探讨如何在 Silverblue 上把性能榨干,从磁盘 IO 的细微调整到后台服务的精准瘦身,让你的系统不仅稳如泰山,还要快如闪电。
一、 理解 Silverblue 的“地基”:为什么优化思路不同?
在动手之前,我们必须先达成共识:在 Silverblue 上,你不能像在传统发行版那样随意修改核心文件。
如果你尝试直接编辑 /etc/fstab 或者手动安装一个 .deb 包,你大概率会失败,或者导致系统状态不一致。Silverblue 的核心逻辑是“镜像+覆盖”。所有的个性化设置,通常需要通过以下方式实现:
- Flatpak:用于图形界面应用。
- Toolbox/Distrobox:用于开发环境和命令行工具(本质是一个容器)。
- rpm-ostree kargs:内核参数调整。
- rpm-ostree install:安装系统级守护进程或底层工具(需谨慎)。
因此,我们的优化策略必须围绕这些机制展开。我们要做的不是“破坏”系统,而是“引导”系统以最高效的方式运行。
二、 磁盘 IO 调优:让存储引擎跑得更快
Silverblue 默认使用 Btrfs 文件系统(在某些版本中可能是 XFS,但 Btrfs 更常见于其原子更新特性)。Btrfs 虽然强大,但如果默认配置不当,可能会因为写时复制(CoW)和透明压缩带来额外的 CPU 开销,尤其是在 SSD 上,这反而可能成为瓶颈。
1. 评估当前的文件系统状态
首先,让我们看看你的根分区到底是什么情况。打开终端(或者在你的 Toolbox 里),运行以下命令:
# 查看文件系统类型
df -T /
# 查看 Btrfs 特定的挂载选项
findmnt -no OPTIONS /
如果输出显示 subvolid=5,compress=zstd:1 之类的字样,说明启用了 ZSTD 压缩。对于大多数现代 NVMe SSD 来说,ZSTD 压缩通常能节省空间并减少写入量,但对于极度追求低延迟的场景,我们可以考虑微调。
2. 禁用不必要的 CoW(写时复制)
Btrfs 的 CoW 机制旨在保护数据完整性,但在频繁小文件写入的场景下(如数据库、虚拟机镜像、某些开发环境),它会显著增加 IO 延迟。
如何操作?
由于 /usr 是只读的,我们无法直接在那里禁用 CoW。但是,用户的家目录 /home 通常是可写的。如果你的数据主要存放在 /home,你可以针对特定文件或目录禁用 CoW。
# 示例:为某个大型开发项目目录禁用 CoW
chattr +C ~/projects/large-build-directory
+C 标志告诉文件系统分配连续的空间块,而不是使用 CoW 机制。这对于构建大型代码库或处理大文件非常有效。
注意:不要对整个 /home 禁用 CoW,这会降低系统的容错能力。只针对已知的大文件工作负载进行优化。
3. 调整 I/O 调度器
现代 SSD 不需要传统的电梯算法(如 CFQ 或 Deadline),它们更适合 noop 或 kyber 调度器。Fedora 通常会自动检测并设置正确的调度器,但检查一下无妨。
# 查看当前使用的调度器
cat /sys/block/sda/queue/scheduler
如果显示 [none] 或 [kyber],那就很好。如果是 bfq 或 deadline,且你使用的是 NVMe SSD,可以尝试切换到 none(对于 NVMe 设备,内核通常直接使用其内部队列管理,无需外层调度器)。
# 临时切换(重启后失效,需通过 systemd 或 grub 持久化)
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
持久化方法:
在 Silverblue 中,最优雅的方式是通过 rpm-ostree 安装一个小的 systemd service 来在启动时设置,或者更简单地,通过 GRUB 内核参数传递。但通常,默认值已经足够好。如果确实需要,可以创建一个简单的脚本并通过 rpm-ostree install 安装为一个自定义服务(稍后在服务部分详述)。
4. Swappiness 的调整
Swap 的使用策略对响应速度影响巨大。如果系统频繁交换内存,感觉就会卡顿。Silverblue 默认 swappiness 通常为 60。对于拥有 16GB 以上内存的用户,降低这个值可以让系统更倾向于保留缓存,而不是将不常用的页面交换到磁盘。
# 检查当前值
cat /proc/sys/vm/swappiness
# 临时设置为 10
sudo sysctl vm.swappiness=10
# 永久设置:在 Silverblue 中,我们通常通过创建一个新的 drop-in 文件来实现
# 但由于 /etc 是只读的,我们需要使用 rpm-ostree 来注入配置
持久化方案:
我们可以创建一个 systemd drop-in 文件,但这在 Silverblue 中比较麻烦。更推荐的方式是使用 rpm-ostree 安装一个自定义的配置文件。
创建一个目录结构:
mkdir -p /etc/sysctl.d # 注意:这会在运行时挂载一个 overlayfs,仅在本次会话有效,重启后消失!正确做法:使用
rpm-ostree安装一个包含 sysctl 配置的包,或者更简单地,通过修改 GRUB 内核参数。编辑 GRUB 配置:
sudo grubby --update-kernel=ALL --args="vm.swappiness=10"然后重启。这是最安全、最符合 Silverblue 哲学的方式。
三、 服务精简:砍掉那些“隐形”的耗电者
Silverblue 默认安装的服务比传统 Fedora 少很多,这是一个巨大的优势。但是,随着你安装 Flatpaks 和使用 Toolbox,一些后台服务可能会悄然出现。我们的目标是识别并禁用那些不需要的服务。
1. 识别活跃服务
首先,列出所有正在运行的服务:
systemctl list-units --type=service --state=running --no-pager
你会看到一堆服务,如 dbus-daemon, systemd-journald, accounts-daemon 等。其中一些是必须的,一些则可以根据你的需求关闭。
2. 谨慎禁用的服务
以下是一些通常可以安全禁用的服务,但请务必根据你的使用场景判断:
- ModemManager:如果你不使用 USB 调制解调器或移动宽带,可以禁用。它扫描串口以查找调制解调器,消耗少量资源。
systemctl --user mask ModemManager - avahi-daemon:如果你不在局域网内共享打印机或媒体服务器,可以禁用。它负责 mDNS/Bonjour 发现。
systemctl --user mask avahi-daemon - bluetooth.service:如果你根本不用蓝牙,直接禁用。
systemctl --user disable --now bluetooth.service
重要提示:在 Silverblue 中,系统级服务的管理受到限制。上述命令如果在主机上下文中执行,可能会提示权限错误或无效。你需要使用 --global 标志或通过 rpm-ostree 来处理系统级服务。
3. 使用 rpm-ostree 安装自定义服务配置
假设你想禁用 ModemManager 作为一个系统级服务。你不能直接 systemctl disable,因为 /etc 是只读的。
步骤如下:
创建一个目录来存放你的自定义 systemd 单元文件:
mkdir -p ~/.config/systemd/user或者,如果你想修改系统级服务,你需要创建一个
rpm-ostree的 override。更简单的方法:使用
systemctl mask的用户级作用域 对于大多数桌面用户,禁用用户级服务就足够了。例如,禁用蓝牙:systemctl --user mask bluetooth.service对于系统级服务,使用
rpm-ostree安装一个空白的 unit 文件 这是一个高级技巧。你可以创建一个包含空白 unit 文件的包,然后通过rpm-ostree install安装它,从而“覆盖”原有的服务。例如,创建一个
modem-manager-mask.tar.gz,里面包含:etc/systemd/system/ModemManager.service -> /dev/null然后:
rpm-ostree install ./modem-manager-mask.tar.gz reboot这会将
ModemManager.service链接到/dev/null, effectively 禁用它。警告:这种方法有风险,请确保你知道自己在做什么。建议先从用户级服务开始。
4. Flatpak 的后台服务
Flatpak 本身不会自动启动大量后台服务,但你安装的某些应用可能会有。例如,GNOME Software 会定期检查更新。
禁用自动更新检查: 在 GNOME 设置中,进入“详细信息”->“软件更新”,取消勾选“自动安装更新”和“通知可用更新”。这可以减少后台网络和磁盘 IO。
清理 Flatpak 缓存: 定期运行以下命令清理不再需要的运行时和应用程序:
flatpak uninstall --unused
四、 内核参数调优:微调硬件交互
除了 swappiness,还有其他几个内核参数可以显著提升响应速度。
1. 调整 VM 相关参数
dirty_ratio 和 dirty_background_ratio:控制脏页(未写入磁盘的数据)的比例。默认值可能偏高,导致突然的大量磁盘写入。
建议值:
vm.dirty_ratio = 10 vm.dirty_background_ratio = 5通过 GRUB 持久化:
sudo grubby --update-kernel=ALL --args="vm.dirty_ratio=10 vm.dirty_background_ratio=5"vfs_cache_pressure:控制内核回收 inode 和 dentry 缓存的倾向。默认值 100 表示平衡。如果内存充足,可以降低此值,让内核更愿意保留目录缓存,从而提高文件访问速度。
建议值:
vm.vfs_cache_pressure = 50
2. 网络参数优化
如果你经常进行高速网络传输,可以调整 TCP 缓冲区大小。
- tcp_window_scaling:通常启用。
- tcp_timestamps:通常启用。
对于大多数用户,默认值已经很好。但如果你使用千兆以太网或更高带宽,可以考虑增加 net.core.rmem_max 和 net.core.wmem_max。
sudo grubby --update-kernel=ALL --args="net.core.rmem_max=16777216 net.core.wmem_max=16777216"
五、 实际案例:一个开发者的 Silverblue 优化清单
让我分享一个真实场景:一位全栈开发者,使用 Fedora Silverblue 进行 Web 开发。他遇到了浏览器卡顿、Docker 构建缓慢的问题。
问题分析:
- 浏览器卡顿:Chrome/Firefox 在 Flatpak 中运行,可能受到沙箱限制。
- Docker 构建慢:Docker 在 Silverblue 中通过 Podman 替代,但容器镜像层过多。
- 系统响应迟缓:后台服务过多。
优化步骤:
浏览器优化:
- 卸载 Flatpak 版的 Chrome,改用原生 Firefox(通过 Toolbox 安装或作为 Flatpak 但禁用不必要的插件)。
- 对于 Chrome,使用
chrome://flags启用硬件加速,并确保在设置中启用了“使用硬件加速模式(如果可用)”。 - 在 Toolbox 中安装 VS Code 的服务器版本,通过远程连接开发,减少本地资源占用。
Podman 优化:
- 使用
podman system connection default确保使用正确的 socket。 - 定期清理无用镜像:
podman image prune -a。 - 在
~/.config/containers/storage.conf中调整存储驱动,确保使用overlay而非vfs(如果可用)。
- 使用
服务精简:
- 禁用
ModemManager和avahi-daemon。 - 在 GRUB 中设置
vm.swappiness=10和vm.vfs_cache_pressure=50。 - 禁用不必要的开机启动服务,如
cups(如果没有打印机)。
- 禁用
结果:
- 系统启动时间缩短约 2 秒。
- 浏览器标签页切换流畅度明显提升。
- Docker/Podman 构建速度提升 15%。
六、 监控与验证:如何知道优化是否有效?
优化不是一劳永逸的,你需要监控效果。
1. 使用 btop 或 htop
安装 btop(可以通过 Flatpak 或 Toolbox):
flatpak install flathub org.vifino.btop
实时监控 CPU、内存、磁盘 IO 和网络使用情况。观察优化前后,空闲时的 CPU 占用是否下降,磁盘写入是否更平滑。
2. 使用 sysstat 套件
安装 sysstat:
sudo rpm-ostree install sysstat
使用 iostat -x 1 查看磁盘统计信息,关注 %util 和 await 指标。如果 %util 长期接近 100%,说明磁盘是瓶颈,需要考虑 SSD 升级或优化 IO 调度。
3. 使用 bootchart 或 systemd-analyze
分析启动时间:
systemd-analyze blame
systemd-analyze critical-chain
找出启动最慢的服务,针对性地禁用或优化它们。
七、 结语:拥抱不可变,享受可控性
Fedora Silverblue 的优化,本质上是一场关于“克制”的艺术。你不能随意篡改系统,但这种限制迫使你以更结构化、更可预测的方式去管理你的环境。通过合理调整内核参数、精简服务、优化磁盘 IO,你不仅能获得更快的响应速度,还能享受到 Silverblue 带来的极致稳定性。
记住,优化没有终点。每次系统更新后,检查一下是否有新的服务被引入,或者内核参数是否需要调整。保持好奇,保持探索,让你的 Silverblue 真正成为你最趁手的工具。
现在,去终端里敲下那些命令吧,感受系统在你指尖流动的速度。
