嘿,朋友。既然你点开了这篇关于 Fedora Silverblue 的文章,我猜你大概率是个对技术有追求、愿意折腾硬核 Linux 发行版的用户。Silverblue 和传统的 Fedora Workstation 不一样,它是 immutable(不可变)的,这意味着我们的“优化”逻辑得变一变——你不能随便往 /usr 里塞东西,也不能随意修改系统核心文件。
这听起来很限制,但其实是一种“清爽”的美学。不过,很多人安装完会发现:哇,启动好像没快多少?磁盘占用看着还行但越用越臃肿?甚至偶尔遇到 Flatpak 应用卡顿或者 RPM Fusion 配置不对的尴尬。
别急,今天我就把自己折腾 Silverblue 半年来的实测经验,连同那些容易踩的坑,掰开揉碎了讲给你听。我们不只是贴命令,更要讲清楚背后的逻辑,让你知其然,更知其所以然。
一、 理解 Silverblue 的根基:为什么优化路径不同?
在开始之前,我们需要达成一个共识:Silverblue 的核心是 OSTree 和 Containerized 应用生态。
传统的 Fedora,你安装软件是直接写进文件系统里的。而 Silverblue,系统本身是一个只读的镜像(Image),你的个人数据在 /home,你安装的大部分应用是 Flatpak,系统级的额外工具需要通过 toolbox 或 distrobox 进入容器环境,或者使用 rpm-ostree install 来合并进系统镜像。
这意味着:
- 清理
/var和/tmp是无效的,因为重启后镜像层会被重置或合并,且日常数据不在此。 - 真正的垃圾在于
/var/home和/var/roothome下的容器数据,以及~/.local/share/flatpak。 - 性能瓶颈往往来自后台服务过多,而不是文件系统碎片(Btrfs 会自动处理碎片)。
所以,我们的优化策略分为三层:系统镜像瘦身、Flatpak 应用库优化、内核与服务启动调优。
二、 磁盘占用瘦身:找回那些消失的空间
Silverblue 安装完之后,默认占用大概在 4-6GB 左右。但用一段时间后,你可能会发现磁盘用了 10GB 甚至更多。这通常不是系统本身变大了,而是缓存和旧版本残留。
1. 清理 OSTree 历史版本(最重要的一步)
每次你执行 rpm-ostree upgrade 或者系统自动更新后,旧的系统镜像层并不会立即删除,它们存储在 /var/lib/ostree 中。这是磁盘空间的大户。
你可以运行以下命令查看当前部署和候选部署:
rpm-ostree status
你会看到类似这样的输出:
State: idle
Deployments:
● fedora:fedora/x86_64/silverblue
Version: 39.20231205.0 (2023-12-05T18:30:00Z)
Commit: 7897654321abcdef...
fedora:fedora/x86_64/silverblue
Version: 39.20231120.0 (2023-11-20T12:00:00Z)
Commit: 1234567890fedcba...
上面的那个带 ● 的是当前正在使用的。下面那个就是可以删除的旧版本。
如何删除旧版本释放空间?
sudo rpm-ostree cleanup --reboot
这个命令会清理掉所有非当前的部署,并立即重启。这是最安全、最有效的瘦身手段。建议每隔几周执行一次,尤其是当你频繁更新系统之后。
注意:不要随意删除
~/.cache下的 OSTree 缓存,除非你确定知道自己在做什么,否则可能导致升级失败。我们主要清理的是部署历史。
2. 清理 Flatpak 运行时和应用缓存
Flatpak 应用和运行时(Runtimes)默认安装在 ~/.local/share/flatpak 和 /var/lib/flatpak。随着你安装越来越多的应用,这些目录会迅速膨胀。
首先,查看 Flatpak 的磁盘占用情况:
flatpak du
这会列出每个应用和运行时占用多少空间。你可以直观地看到哪个应用占用了几个 GB。
卸载不常用的应用:
flatpak uninstall <application-id>
自动清理不再使用的运行时依赖:
当你卸载某个应用后,之前为该应用安装的某些共享运行时可能不再被任何应用需要,但它们会残留。运行:
flatpak uninstall --unused
这个命令非常安全,它会检查当前已安装的所有应用,只删除那些没有被任何应用依赖的运行时库。通常能释放出几百 MB 到几个 GB 的空间。
3. 检查 /var/tmp 和日志
虽然 Silverblue 是只读的,但 /var/tmp 是可写的临时目录,有时某些应用会在这里留下大量垃圾。你可以手动检查:
du -sh /var/tmp
journalctl --disk-usage
如果日志过大,可以使用 sudo journalctl --vacuum-size=500M 限制日志大小,只保留最近的 500MB 日志。
三、 启动速度优化:从 15 秒到 8 秒的实测
很多用户迁移到 Silverblue 是奔着“更快启动”来的。但实际上,启动速度主要取决于硬件和内核参数,Silverblue 本身并不会显著加快启动速度(相比 Workstation)。不过,我们可以通过一些 tweak 来榨干性能。
1. 分析启动耗时
首先,我们要知道时间花在哪里了。
systemd-analyze
systemd-analyze blame
systemd-analyze 会告诉你总启动时间,以及内核和用户空间各用了多久。blame 会列出所有按耗时排序的服务。
2. 禁用不必要的系统服务
在 blame 的输出中,你可能会看到一些你不需要的服务,比如 cups.service(打印服务,如果你没有打印机)、bluetooth.service(如果你不用蓝牙)、ModemManager.service 等。
安全禁用方法:
# 禁用蓝牙(示例)
systemctl --global disable bluetooth.service
# 禁用打印服务(示例)
systemctl --global disable cups.service
# 禁用调制解调器管理(通常对普通用户无用)
systemctl --global disable ModemManager.service
注意使用 --global,这样设置对所有用户生效,且不会被后续更新覆盖。
3. 调整内核参数:提前加载和 I/O 调度
Silverblue 默认使用 Btrfs 文件系统,这对于 SSD 来说是不错的选择。但我们可以进一步优化。
编辑 GRUB 配置(这需要进入toolbox或使用 rpm-ostree 修改,但在 Silverblue 中,修改 /etc/default/grub 是不推荐的,因为重启后会丢失。正确的方法是使用 rpm-ostree 安装一个小的工具包,或者使用 bootupd)。
不过,对于大多数用户,更简单且安全的方法是通过 sysctl 动态调整。
优化 swappiness(交换分区使用倾向):
如果你内存充足(16GB 以上),可以降低 swappiness,让系统更倾向于使用内存而不是 Swap。
sudo sysctl vm.swappiness=10
为了让这个设置持久化,创建一个配置文件:
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf
优化 I/O 调度器(针对 SSD):
大多数现代 SSD 使用 none 或 mq-deadline 调度器。检查当前调度器:
cat /sys/block/sda/queue/scheduler
如果不是 none 或 mq-deadline,可以更改它(假设你的盘是 /dev/sda):
echo none | sudo tee /sys/block/sda/queue/scheduler
为了持久化,创建 udev 规则:
sudo tee /etc/udev/rules.d/60-io-scheduler.rules << 'EOF'
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"
EOF
4. 使用preload 服务
preload 是一个监听用户行为的后台服务,它会学习你经常使用的应用程序,并提前将它们加载到内存中。
sudo rpm-ostree install preload
sudo systemctl enable --now preload
安装后重启,你会发现常用应用(如浏览器、编辑器)的启动速度有明显提升,因为它已经预先加载到了内存中。
四、 常见问题排查:那些让人抓狂的瞬间
Silverblue 虽然稳定,但也有一些特有的“坑”。以下是我遇到最多的问题及解决方案。
问题 1:Flatpak 应用安装失败或无法启动
现象:在 GNOME Software 中点击安装,进度条卡住,或者安装后图标显示红色感叹号。
排查步骤:
- 检查网络连接:Flatpak 默认从 Flathub 下载,有时网络不稳定。
- 清理 Flatpak 缓存:
flatpak clean flatpak update - 检查权限:某些应用需要特定权限才能访问文件夹或网络。在设置 -> 应用程序 中检查权限。
- 重新安装:
flatpak uninstall <app-id> flatpak install flathub <app-id>
问题 2:无法使用 sudo 安装 RPM 包
现象:在终端中输入 sudo dnf install xxx 报错,或者没有 sudo 权限。
原因:Silverblue 不支持直接使用 sudo dnf 进行系统级包管理。系统更新必须通过 rpm-ostree 完成。
解决方案:
- 系统级工具:使用
rpm-ostree install <package>。注意,这需要重启后才能生效,因为系统镜像需要重新合并。rpm-ostree install vim sudo rpm-ostree reboot - 用户级工具:如果你只是想用一个临时工具(如
htop、neovim),建议直接使用 Flatpak 版本,或者使用toolbox进入容器环境安装 RPM 包,这样不会影响系统镜像。
问题 3:toolbox 容器内无法访问主机文件或应用
现象:在 toolbox 中运行 firefox 没有反应,或者挂载的目录看不到文件。
排查步骤:
检查 Toolbox 是否启动:
如果提示找不到容器,先创建:toolbox entertoolbox createX11/Wayland 转发问题:Silverblue 默认使用 Wayland。在 toolbox 中运行图形应用可能需要额外的环境变量。尝试:
# 在 toolbox 内 export WAYLAND_DISPLAY=$WAYLAND_DISPLAY export XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR或者,如果应用支持,尝试强制使用 X11:
env WAYLAND_DISABLE=1 firefox访问主机文件:toolbox 默认会挂载你的
/home目录。如果你的文件在/home/user/Documents,在 toolbox 内直接访问/home/user/Documents即可。注意,在 toolbox 内,你的用户 UID 可能会映射不同,建议使用--user参数创建或进入 toolbox:toolbox create --user toolbox enter --user
问题 4:磁盘空间不足,但清理后依然报满
现象:执行 df -h 发现根分区满了,但手动清理后依然很快变满。
可能原因:
- Snap 或 Flatpak 缓存:如前所述,检查
flatpak du。 - 日志轮转失败:检查
/var/log下的文件。 - Btrfs 子卷配额:Silverblue 使用 Btrfs,有时候子卷配额会限制增长。检查 Btrfs 状态:
如果看到某个子卷占用异常,可能需要压缩或清理。sudo btrfs filesystem usage /
五、 进阶技巧:让 Silverblue 更顺手
1. 启用 RPM Fusion(可选)
默认的 Fedora 仓库不包含一些专有驱动或多媒体编解码器。如果你需要 NVIDIA 驱动或播放某些受保护的视频,可能需要启用 RPM Fusion。
sudo rpm-ostree install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo rpm-ostree reinstall
警告:这会增加系统镜像的大小,并且每次更新都需要重新安装。建议只在确实需要时才启用。
2. 使用 Backdrops 进行系统重置
如果你折腾太久,系统变得不稳定,或者你想回到一个干净的起点,Silverblue 的“回滚”功能非常强大。
# 查看所有可用的部署版本
rpm-ostree status --deployments
# 重启到之前的版本
sudo rpm-ostree rollback
sudo systemctl reboot
这相当于你有一个“时间机器”,可以随时回到上一个稳定的系统状态。这是 Silverblue 最大的优势之一,也是你敢于折腾的底气。
3. 定期维护脚本
你可以创建一个简单的脚本,定期运行清理任务,放在 cron 或 systemd timer 中。
创建一个脚本 ~/scripts/silverblue-maintenance.sh:
#!/bin/bash
echo "Starting Silverblue maintenance..."
sudo rpm-ostree cleanup --reboot
flatpak uninstall --unused
flatpak clean
sudo journalctl --vacuum-size=500M
echo "Maintenance complete."
赋予执行权限:
chmod +x ~/scripts/silverblue-maintenance.sh
然后可以创建一个 systemd timer 每周自动运行,或者手动在周末运行它。
结语
Fedora Silverblue 不仅仅是一个操作系统,它是一种全新的使用哲学。它强迫你思考“我应该把数据放在哪里”、“这个软件应该以什么形式运行”。起初,这种限制可能让你感到不便,但一旦你习惯了这种清晰的分层(系统镜像 / 容器环境 / 用户数据),你会发现你的系统变得异常干净和稳定。
性能优化不是为了压榨出最后的 1% 的帧率,而是为了让你的机器保持一种“轻盈”的状态,不积垃圾,不拖沓,随时可以回到起点。
希望这篇文章能帮你更好地驾驭 Silverblue。如果你在使用过程中遇到其他问题,记得善用 toolbox 和 rpm-ostree status 这两个强大的工具,它们几乎能解决你 90% 的困惑。祝你折腾愉快!
