说实话,刚拿到一台配置不算太高的旧笔记本时,我心里是打鼓的。毕竟 Fedora Silverblue 这种基于 Immutable(不可变)架构的发行版,听起来就挺“高冷”的——系统只读,升级靠镜像切换。很多人担心这种设计会不会因为过度保护而牺牲性能,或者在老旧硬件上跑得像个蜗牛。但现实恰恰相反,Silverblue 的底层其实非常干净,没有那些乱七八糟的后台服务在偷偷占用资源。问题在于,默认的“通用”配置往往是为了照顾最广泛的硬件,而不是针对你手里那台特定的、略显年迈的设备。
今天咱们不聊虚的,直接上手。我要带你做的,不是那种改改 /etc/fstab 就完事的浅层优化,而是深入到底层,通过精细化的磁盘 I/O 调度、内核参数微调,以及针对 Silverblue 特殊架构的正确维护方式,让你的旧机器重新焕发第二春。我们会遇到一些挑战,比如如何在一个只读系统中修改内核启动参数,以及如何在不破坏系统完整性的前提下释放被锁死的性能。准备好了吗?让我们开始这场硬核的调试之旅。
第一步:诊断先行,别盲目动手
在调整任何参数之前,你必须知道瓶颈在哪里。对于老旧硬件,尤其是使用机械硬盘(HDD)或者低速 NVMe SSD 的设备,I/O 延迟往往是导致“卡顿”的元凶。Silverblue 默认使用 btrfs 作为根文件系统,这本身是个双刃剑:它提供了快照功能,但也带来了额外的写放大和校验开销。
我们需要先安装几个轻量级的诊断工具。虽然 Silverblue 是只读的,但我们可以通过 rpm-ostree 来临时安装这些工具用于测试,或者更优雅地,使用 toolbox(容器化环境)来运行它们,这样不会污染宿主系统。
打开终端(Konsole 或 GNOME Terminal),输入以下命令进入一个临时的开发环境:
toolbox create fedora-toolbox
toolbox enter fedora-toolbox
进入工具箱后,我们安装 iotop, iostat, sysstat 和 latencytop。这些工具能帮我们看清谁在读写磁盘,谁在消耗 CPU 周期。
sudo dnf install iotop sysstat latencytop -y
现在,让我们观察一下系统的实时状态。你可以运行 iostat -x 1 来查看每秒的磁盘统计信息。重点关注 %util 这一列。如果你的磁盘 %util 长期接近 100%,说明磁盘已经饱和,这就是卡顿的直接原因。同时,运行 top 或 htop,看看是否有进程在频繁进行上下文切换。
在调试过程中,我发现很多老机器上的卡顿并非来自 CPU 算力不足,而是来自“等待”。当应用程序需要读取数据,而磁盘还在忙时,CPU 只能闲置等待。这种“I/O Wait”在高负载下会指数级放大用户体验上的延迟。
第二步:驯服磁盘 I/O 调度器
Linux 内核提供了多种 I/O 调度算法,默认情况下,Fedora 通常会根据检测到的存储设备类型自动选择。对于 SSD,默认可能是 mq-deadline 或 kyber;对于 HDD,通常是 bfq 或 none(noop)。但对于老旧硬件,特别是那些响应时间不均匀的廉价 SSD 或混合硬盘,默认的调度策略可能过于保守,导致写入延迟抖动。
2.1 检查当前调度器
首先,确认你当前的 I/O 调度器设置。对于 NVMe 设备,路径通常在 /sys/block/nvme0n1/queue/scheduler;对于 SATA 设备,则是 /dev/sda。
cat /sys/block/sda/queue/scheduler
# 输出示例: [mq-deadline] kyber bfq none
方括号中的 [mq-deadline] 表示当前激活的调度器。
2.2 针对 Silverblue 的特殊调整
由于 Silverblue 的系统分区是只读的,我们不能直接编辑 /etc/sysctl.conf 中的某些磁盘参数,也不能轻易修改 /etc/fstab 挂载选项而不考虑兼容性。但是,我们可以通过 bootc 或 rpm-ostree 来持久化内核启动参数。
对于老旧硬件,我强烈建议尝试将调度器调整为 none(直通模式)对于纯 SSD,或者 kyber 对于混合存储。bfq 虽然公平,但对小文件随机读写较多的桌面环境来说, overhead(开销)有点大。
注意: 修改 I/O 调度器通常需要 root 权限,且对非持久化测试有效。为了永久生效,我们需要将其加入内核命令行参数。
创建一个自定义的内核启动配置。在 Silverblue 中,这是通过 rpm-ostree 完成的。
# 添加内核参数,假设你的根设备是 sda,尝试设置为 kyber 调度器
# 注意:具体参数取决于你的设备类型,这里以通用为例
rpm-ostree kargs --append="elevator=kyber"
如果你使用的是 NVMe 设备,可能需要指定具体的设备名:
rpm-ostree kargs --append="nvme_core.default_ps_max_latency_us=0 elevator=none"
执行上述命令后,系统会下载新的内核镜像并更新引导加载程序(GRUB)。你需要重启电脑才能生效。
systemctl reboot
重启后,再次检查调度器是否已更改。你会发现,在随机小文件读写频繁的场景下(比如打开浏览器标签页、加载网页图片),系统的响应速度有了肉眼可见的提升。这是因为 kyber 和 none 减少了调度器的决策开销,让 I/O 请求更直接地到达设备。
第三步:内核参数微调——释放隐藏的性能
仅仅调整 I/O 调度器是不够的。老旧硬件往往在内存管理和页面缓存方面存在瓶颈。Linux 的虚拟内存子系统有几个关键参数,我们可以安全地进行调整,以改善系统响应速度。
3.1 vm.swappiness:减少交换分区的使用
vm.swappiness 控制内核倾向于将匿名内存页换出到交换空间(swap)的程度。默认值通常是 60。这意味着系统会在内存使用率达到 40% 左右时就开始考虑交换。对于只有 8GB 或更少内存的老机器,频繁的 swap 操作会导致严重的卡顿,因为磁盘速度远慢于内存。
我们将这个值降低到 10 甚至 5,迫使内核尽可能长时间地将数据保留在 RAM 中,即使这意味着偶尔会触发 OOM(内存溢出)杀手,也比频繁的磁盘交换要流畅得多。
在 Silverblue 中,我们再次使用 rpm-ostree 来添加内核参数:
rpm-ostree kargs --append="vm.swappiness=10"
3.2 vm.vfs_cache_pressure:保护目录和 inode 缓存
另一个关键参数是 vfs_cache_pressure。它控制内核回收 dentry 和 inode 缓存(即目录和文件元数据缓存)的倾向。默认值是 100。如果这个值太高,内核会过早地丢弃这些缓存,导致后续的文件访问需要重新从磁盘读取元数据,增加 I/O 压力。
对于老旧硬件,我们将这个值降低到 50,告诉内核:“嘿,请尽量保留文件系统的元数据缓存,这对性能有帮助。”
rpm-ostree kargs --append="vm.vfs_cache_pressure=50"
3.3 合并参数并应用
现在,我们将所有参数合并,一次性更新内核启动项。这样可以避免多次重启带来的不便。
rpm-ostree kargs --append="vm.swappiness=10" \
--append="vm.vfs_cache_pressure=50" \
--append="elevator=kyber"
再次重启系统。
systemctl reboot
3.4 验证效果
重启后,我们可以通过 sysctl 命令验证参数是否生效(虽然这些是内核启动参数,但在运行时也可以通过 proc 文件系统查看):
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
你应该看到输出分别为 10 和 50。此时,尝试打开多个大型文档或切换不同的应用程序,你会感觉到“粘滞感”减少了,窗口切换更加顺滑。
第四步:Silverblue 特有的陷阱——Btrfs 子卷与压缩
Fedora Silverblue 默认使用 Btrfs 文件系统。Btrfs 的一个强大功能是透明压缩(zstd),它可以显著减少磁盘写入量,从而延长 SSD 寿命并提高读取速度(因为读取的数据更少)。但是,压缩和解压需要 CPU 周期。对于老旧的 CPU,这可能成为新的瓶颈。
我们需要权衡:是节省 I/O 还是节省 CPU?
4.1 检查当前压缩状态
首先,检查你的根文件系统是否启用了压缩:
btrfs property get / compress
如果输出为空,说明未启用。如果输出包含 zstd 或 lzo,则已启用。
4.2 为老旧 CPU 禁用压缩(可选)
如果你的 CPU 非常老旧(例如双核 2GHz 以下的处理器),启用 zstd 压缩可能会导致 CPU 使用率飙升,进而影响系统响应。在这种情况下,你可以选择禁用根子卷的压缩。
警告: 禁用压缩会占用更多磁盘空间,但对于老旧硬件,稳定性优先。
要在 Silverblue 中禁用根子卷的压缩,你需要知道根子卷的 ID。通常,根子卷 ID 是 5。
btrfs subvolume list / | grep "id 5"
然后,取消压缩属性:
sudo btrfs property set -ts / compress ""
注意:由于 Silverblue 的根文件系统是只读的,你不能直接修改 / 的属性。你需要挂载根文件系统为可写,或者使用 btrfs 命令行工具的特殊选项。更简单的方法是,在创建新镜像时指定无压缩。但既然我们已经安装了,我们可以通过 rpm-ostree 的 override 机制来暂时处理,或者接受压缩带来的轻微 CPU 开销。
实际上,对于大多数现代老旧硬件(如 Core i5-4xxx 系列及以后),zstd 压缩的收益大于 CPU 开销。我建议保持默认,除非你观察到 CPU 使用率在空闲时也居高不下。
4.3 清理 Btrfs 碎片
Btrfs 在长期使用后可能会产生碎片,尤其是对于频繁更新的小文件。Silverblue 的设计使得系统文件几乎不变,但用户数据(在 /home 下,如果是单独挂载的话)可能会碎片化。
如果 /home 是独立的 Btrfs 子卷,你可以运行碎片整理:
sudo btrfs filesystem defragment -r -v /home
这个过程可能需要一段时间,但它能显著提升文件读取速度,特别是对于机械硬盘。
第五步:服务精简与后台清理
除了内核和文件系统,系统服务也是资源消耗的大户。Silverblue 默认启用了很多针对数据中心或高性能服务器的服务,这些服务在桌面环境下可能是不必要的。
5.1 禁用不必要的 systemd 服务
我们可以列出当前运行的服务,并禁用那些对日常使用影响不大的服务。例如,avahi-daemon(用于 mDNS 发现)、bluetooth.service(如果你不用蓝牙)、ModemManager(如果你不用手机调制解调器)等。
# 查看正在运行的服务
systemctl list-units --type=service --state=running
# 禁用 Avahi mDNS 守护进程
sudo systemctl disable --now avahi-daemon.service
# 禁用蓝牙(如果不使用)
sudo systemctl disable --now bluetooth.service
# 禁用 ModemManager
sudo systemctl disable --now ModemManager.service
5.2 优化 systemd 定时器
Fedora 默认启用了一些定时任务,如 dnf-makecache.timer 和 tmpfiles-clean.timer。这些任务会在后台运行,占用 I/O 和 CPU。
你可以调整这些定时器的频率,或者将它们限制在特定时间段内运行。例如,修改 dnf-makecache.timer 的激活时间:
sudo systemctl edit dnf-makecache.timer
在编辑器中添加以下内容,使其仅在系统空闲时运行:
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=3600
这将确保包缓存更新在凌晨 2 点进行,并随机延迟最多 1 小时,减少对白天使用的影响。
5.3 使用 systemd-analyze 分析启动时间
为了进一步优化,你可以分析系统的启动时间瓶颈:
systemd-analyze blame
这会列出按启动耗时排序的服务。找出那些耗时过长且不需要的服务,并将其禁用。
第六步:图形界面与桌面环境的轻量化
Silverblue 默认使用 GNOME Shell。GNOME 以其美观著称,但也相对较重。对于老旧硬件,GNOME 的动画效果、扩展和合成器可能会带来额外的 GPU 和 CPU 负担。
6.1 禁用 GNOME 动画
GNOME 的动画效果可以通过 gsettings 命令轻松禁用。这不仅减少了 GPU 的压力,还让界面响应感觉更快,因为没有等待动画结束的时间。
# 禁用所有 GNOME 动画
gsettings set org.gnome.desktop.interface enable-animations false
# 禁用工作区切换动画
gsettings set org.gnome.shell transitions-enabled false
6.2 减少扩展数量
GNOME Extensions 是性能杀手。每个扩展都可能注入代码到主循环中,增加延迟。检查你安装的扩展,移除那些不常用的。特别是那些监控硬件状态、网络流量或提供额外菜单的扩展。
6.3 考虑轻量级桌面环境
如果 GNOME 仍然感觉沉重,你可以考虑在 Silverblue 中安装轻量级的桌面环境,如 XFCE 或 KDE Plasma(KDE 在某些配置下比 GNOME 更轻量)。
使用 rpm-ostree 安装 XFCE:
rpm-ostree install xfce4-session xfce4-panel xfwm4 xfce4-settings
重启后,在登录界面选择 XFCE 会话。XFCE 的资源占用远低于 GNOME,适合老旧硬件。
第七步:监控与持续优化
优化不是一次性的工作,而是一个持续的过程。你需要建立一个监控系统,以便在性能下降时及时发现原因。
7.1 安装监控工具
在 Silverblue 中,你可以使用 toolbox 来安装监控工具,避免污染宿主系统。
toolbox create monitoring-toolbox
toolbox enter monitoring-toolbox
sudo dnf install htop iotop nethogs -y
7.2 定期审查日志
检查系统日志,寻找错误或警告信息:
journalctl -p err -b
这只会显示当前引导的错误级别为“错误”或更高的日志。如果有大量的 I/O 错误,可能需要检查磁盘健康状态。
7.3 磁盘健康检查
使用 smartctl 检查磁盘的健康状况:
sudo smartctl -a /dev/sda
关注 Reallocated_Sector_Ct 和 Current_Pending_Sector 等指标。如果这些值不为零,说明磁盘可能有物理损坏,需要尽快备份数据并更换磁盘。
结语:让旧机器重获新生
通过这一系列的优化,我们从磁盘 I/O 调度器、内核内存管理参数、Btrfs 文件系统特性、系统服务精简到图形界面的轻量化,层层递进,逐步释放了老旧硬件的潜力。
Fedora Silverblue 并不是因为“不可变”而性能低下,相反,它的纯净和一致性为优化提供了坚实的基础。关键在于,我们需要理解其背后的机制,并针对性地调整参数。
记住,优化的目标是平衡。不要为了追求极致的性能而牺牲系统的稳定性。例如,禁用所有后台服务可能导致某些功能无法正常工作;过度降低 swappiness 可能在内存不足时触发 OOM 杀手。因此,每一步调整都应该经过测试,观察其对实际使用体验的影响。
当你重新启动那台曾经卡顿的老笔记本,看到窗口切换如丝般顺滑,应用程序启动不再需要漫长的等待,你会发现,硬件的衰老并不能定义体验的上限。真正的性能,来自于对系统的深刻理解和精心调校。
希望这篇指南能帮助你充分发挥 Fedora Silverblue 的潜力,让你的老旧硬件继续发光发热。如果在优化过程中遇到任何问题,欢迎随时回来查阅,或者在社区中寻找帮助。毕竟,开源的魅力就在于此:我们一起学习,一起改进。
