嘿,朋友!既然你点开了这篇指南,我猜你大概正对着屏幕叹气——也许是因为 Silverblue 的界面切换有点卡,也许是因为磁盘空间告急,又或者是你听到了一些“Linux 很快但我觉得不够快”的传言,想亲自验证一下。别担心,Silverblue 这种 immutable(不可变)的 Fedora 变种,确实和普通 Fedora Workstation 有点不一样,它的优化思路也得跟着变一变。
咱们不搞那些虚头巴脑的理论堆砌,直接干。我会一步步带你动手,并且解释为什么要这么做,特别是关于 SELinux 这种需要谨慎操作的部分。记住,Silverblue 的核心魅力在于原子更新和稳定性,所以我们的目标是:在保持系统可维护性的前提下,榨干最后一滴性能。
先聊聊 Silverblue 的特殊性:为什么优化方式不同?
在开始之前,你得明白一个关键点:Silverblue 没有 /etc 这个传统的配置文件目录让你随便改。 它用的是 immutable root,所有的系统级配置都通过 rpm-ostree 来处理。
这意味着:
- 你不能直接用
systemctl disable来永久禁用某些服务(除非用--apply参数)。 - 你不能随便修改
/etc/sysctl.conf来调整内核参数。 - 磁盘空间的管理逻辑也不同,因为旧版本都打包在 OSTree 仓库里。
所以,下面我会明确区分哪些操作是即时生效但重启后可能恢复的(适合测试),哪些是永久生效的(适合部署)。
第一步:识别并关闭无用的后台服务
Silverblue 默认装了一些你可能永远用不到的服务。比如,如果你不用蓝牙音箱,bluetooth.service 就在后台闲着;如果你不用打印机,cups.service 也是浪费资源。
1.1 查看当前活跃的服务
首先,让我们看看谁在“捣乱”。打开终端,运行:
systemctl list-unit-files --type=service --state=enabled
这个命令会列出所有开机自启的服务。你可能会看到一堆熟悉的:
NetworkManager.servicessh.service(如果你开了远程连接)gdm.service(图形界面,这个别关!)dbus-broker.servicesystemd-logind.service
还有这些你可能不需要的:
bluetooth.servicecups.serviceprinter相关的tuned.service(性能调优守护进程,有时会和手动调优冲突)ModemManager.service(调制解调器管理,台式机通常不用)
1.2 禁用不需要的服务
重要提示: 在 Silverblue 上,直接运行 systemctl disable 可能会提示权限不足或行为不符合预期。最稳妥的方式是使用 rpm-ostree 来管理这些服务的禁用,或者使用 --runtime 标志。
方法 A:使用 systemctl disable --runtime(推荐用于测试)
--runtime 标志会让设置只在当前会话期间有效。下次重启后,如果对应的 enable 逻辑还在,服务可能会重新启用。但对于大多数基于 systemd 的服务,disable 指令本身是修改配置文件的,在 Silverblue 上,我们更倾向于使用 mask 或 disable 配合 --root 参数,但最简单的还是先尝试 --runtime。
例如,禁用蓝牙:
systemctl --runtime disable bluetooth.service
systemctl --runtime stop bluetooth.service
如果你想永久禁用(通过覆盖层):
# 创建覆盖层来禁用蓝牙
sudo rpm-ostree override replace --experimental \
--commit=/dev/null \
--install=bluetooth-service-disable
等等,这个命令有点复杂,而且容易出错。让我给你一个更简单、更安全的永久禁用方法:
实际上,在 Silverblue 上,最安全且推荐的永久禁用服务的方法是:
使用
systemctl disable(如果权限允许):sudo systemctl disable bluetooth.service如果失败,尝试:
sudo systemctl mask bluetooth.servicemask比disable更强,它会创建一个指向/dev/null的符号链接,彻底阻止服务启动。重启后依然有效。通过
rpm-ostree的覆盖层(最 Silverblue 的方式): 如果你确定要永久禁用某个服务,并且希望它在系统更新后依然保持禁用状态,可以使用覆盖层。但这是一个高级操作,对于大多数用户,mask已经足够了。
实例演示:
假设你从不使用打印机和蓝牙。
# 检查状态
systemctl status cups.service --no-pager
systemctl status bluetooth.service --no-pager
# 禁用并停止(立即生效,重启后可能恢复,取决于服务是否被 enable)
sudo systemctl disable --now cups.service
sudo systemctl disable --now bluetooth.service
# 如果担心重启后恢复,使用 mask 永久禁止
sudo systemctl mask --now cups.service
sudo systemctl mask --now bluetooth.service
验证:
systemctl is-enabled cups.service
# 输出应该是 "masked" 或 "disabled"
systemctl is-enabled bluetooth.service
# 输出应该是 "masked" 或 "disabled"
1.3 调整 tuned 配置文件
tuned 是一个性能调优守护进程。Silverblue 默认使用 balanced profile。对于桌面用户,desktop 或 latency-performance 可能更合适。
查看当前 profile:
sudo tuned-adm active
切换 profile:
# 切换到桌面优化模式(更注重响应性而非峰值性能)
sudo tuned-adm profile desktop
# 或者切换到高性能模式
sudo tuned-adm profile latency-performance
注意: latency-performance 可能会增加功耗和发热,请根据你的使用场景选择。
第二步:调整 Swappiness 值
Swappiness 控制了内核倾向于将内存页面换出到交换空间(swap)的程度。默认值是 60,这对于大多数桌面用户来说太高了。你的 RAM 足够大,应该尽量让活跃的数据留在内存里,而不是换到磁盘上。
2.1 理解 Swappiness
- 0:尽可能少用 swap,只在内存极度紧张时才用。
- 10-20:推荐值,平衡性能和响应速度。
- 60:默认值,内核比较积极地使用 swap。
- 100:尽可能多使用 swap。
2.2 修改 Swappiness
在普通 Linux 发行版中,你可以编辑 /etc/sysctl.conf。但在 Silverblue 中,不要直接编辑 /etc/sysctl.conf,因为它可能被覆盖。
方法 A:使用 rpm-ostree 添加 sysctl 配置(推荐,永久生效)
这是最“Silverblue”的方式。
创建一个配置文件:
cat <<EOF | sudo tee /usr/lib/sysctl.d/99-swappiness.conf vm.swappiness=10 EOF等等,
/usr/lib/sysctl.d/在 Silverblue 上可能也是只读的。正确的做法是使用
rpm-ostree的--sysctl参数,或者创建一个覆盖层。但最简单且安全的方法是:使用
sysctl命令即时生效,并通过rpm-ostree持久化。首先,即时生效:
sudo sysctl vm.swappiness=10然后,为了持久化,创建一个自定义的 sysctl 文件。在 Silverblue 上,你可以将文件写入
/etc/sysctl.d/,即使它是 immutable 的,/etc通常也是只读的。所以,我们需要用rpm-ostree的覆盖层功能。实际操作步骤:
创建本地目录和配置文件:
mkdir -p ~/sysctl-config echo "vm.swappiness=10" > ~/sysctl-config/99-swappiness.conf使用
rpm-ostree安装这个配置。这可以通过创建一个简单的 RPM 包或使用--sysctl标志来实现。更正:
rpm-ostree并不直接支持--sysctl标志。最可靠的方法是使用 systemd-sysctl 的覆盖方式,或者接受sysctl命令的即时修改,并信任它在重启后依然有效(实际上,sysctl写入内核参数是即时的,重启后会从默认值或/etc/sysctl.conf重新加载)。最推荐的永久解决方案:
由于 Silverblue 的
/etc是只读的,我们可以通过创建一个 systemd drop-in 或者直接修改 kernel command line 来实现。但最简单且被广泛接受的方法是:使用
sysctl命令,并创建一个覆盖层来包含 sysctl 配置。步骤如下:
即时应用:
sudo sysctl vm.swappiness=10为了永久生效,创建一个包含 sysctl 配置的文件,并通过
rpm-ostree安装。这需要一点技巧。一个更简单的方法是编辑/etc/sysctl.d/99-swappiness.conf,如果权限允许。
让我们检查一下:
ls -la /etc/sysctl.d/如果它是只读的,你可以尝试:
sudo touch /etc/sysctl.d/99-swappiness.conf sudo bash -c 'echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf'如果失败,说明
/etc确实是只读的。这时,我们需要使用 overlayfs 或 rpm-ostree overrides。终极解决方案:使用
rpm-ostree的--sysctl功能(如果版本支持)或创建自定义 RPM。对于大多数用户,接受
sysctl的即时修改,并知道它在大多数情况下会保留,或者通过以下方式:创建一个 systemd service 来在启动时设置 sysctl:
创建服务文件(在可写位置,然后复制到正确位置):
cat <<EOF | sudo tee /etc/systemd/system/set-swappiness.service [Unit] Description=Set swappiness to 10 [Service] Type=oneshot ExecStart=/usr/bin/sysctl -w vm.swappiness=10 [Install] WantedBy=multi-user.target EOF启用服务:
sudo systemctl enable set-swappiness.service sudo systemctl start set-swappiness.service
这样,每次启动时,系统都会执行这个命令,确保 swappiness 是 10。
2.3 验证
sysctl vm.swappiness
# 应该输出:vm.swappiness = 10
第三步:禁用 SELinux(临时测试性能提升)
警告:这一步有风险!SELinux 是 Fedora 安全模型的核心。禁用它会降低系统安全性,仅建议在调试或性能基准测试时使用,不建议在生产环境或日常使用中永久禁用。
3.1 为什么有人想禁用 SELinux?
SELinux 的强制访问控制(MAC)会引入一定的性能开销,特别是在频繁的 I/O 操作和进程创建时。在某些极端性能敏感的场景下,禁用它可能会带来 measurable 的提升(通常很小,但可能在基准测试中显现)。
3.2 如何临时禁用 SELinux
方法 A:使用 setenforce(即时生效,重启后恢复)
这是最简单的临时禁用方法。
# 查看当前状态
getenforce
# 输出可能是 Enforcing, Permissive, or Disabled
# 临时禁用(设置为 Permissive 模式,记录违规但不强制执行)
sudo setenforce 0
# 或者完全禁用(不推荐,因为 Permissive 模式更安全,允许你调试)
# sudo setenforce 0 实际上就是 Permissive 模式
# 验证
getenforce
# 应该输出 Permissive
注意: setenforce 0 将 SELinux 设置为 Permissive 模式,这意味着它会记录违规但不阻止。如果你想要完全禁用,需要修改内核参数。
方法 B:修改内核命令行参数(永久禁用,需谨慎)
如果你确实想完全禁用 SELinux(不推荐),需要修改 GRUB 配置。
- 编辑
/etc/kernel/cmdline或使用grubby。sudo grubby --update-kernel=ALL --args="selinux=0" - 重启系统。
3.3 测试性能
禁用 SELinux 后,你可以运行一些基准测试来观察差异。例如:
# 使用 sysbench 进行文件 I/O 测试
sudo sysbench fileio prepare
sudo sysbench fileio run
# 使用 fio 进行更细致的测试
sudo fio --name=test --filename=/tmp/testfile --size=1G --ioengine=libaio --direct=1 --rw=randread --bs=4k --numjobs=4
比较禁用前后的结果。但请记住,对于日常桌面使用,这个性能差异几乎不可感知,而安全性损失是实实在在的。
3.4 恢复 SELinux
测试完成后,务必恢复 SELinux:
# 重新启用 Enforcing 模式
sudo setenforce 1
# 如果之前修改了内核参数
sudo grubby --update-kernel=ALL --remove-args="selinux=0"
第四步:清理 OSTree 旧版本释放磁盘空间
Silverblue 使用 OSTree 进行原子更新,每次更新都会保留旧版本,以便在出现问题时回滚。时间久了,这些旧版本会占用大量磁盘空间。
4.1 查看当前版本和空间占用
# 列出已部署的 OSTree 版本
rpm-ostree status
# 查看 OSTree 仓库大小
du -sh /var/lib/ostree/
4.2 清理旧版本
方法 A:使用 rpm-ostree cleanup
这是最推荐的方法。
# 清理所有已部署但非当前的旧版本
sudo rpm-ostree cleanup --reboot-after
# 或者,只清理未使用的版本
sudo rpm-ostree cleanup --prune
--prune 会删除所有未被当前或任何已知部署引用的版本。--reboot-after 会在清理后自动重启(如果需要)。
方法 B:手动指定保留版本数
你可以设置保留的版本数。
# 编辑 /etc/rpm-ostreed.conf
sudo nano /etc/rpm-ostreed.conf
添加或修改:
[Unprivileged]
MaxDeploymentsToKeep=3
这会保留最近 3 个部署版本。
4.3 验证清理结果
rpm-ostree status
du -sh /var/lib/ostree/
你应该能看到磁盘空间有所释放。
总结与最佳实践
- 服务管理:优先使用
systemctl mask来禁用不需要的服务,这是永久且安全的。 - Swappiness:使用 systemd service 来确保
vm.swappiness=10在每次启动时生效。 - SELinux:仅在测试时临时禁用,使用
setenforce 0,并尽快恢复。不要为了“性能提升”而永久禁用 SELinux,得不偿失。 - OSTree 清理:定期运行
sudo rpm-ostree cleanup --prune,并保持系统更新以获取最新的 OSTree 管理功能。
最后,记住 Silverblue 的设计哲学:稳定性优于激进优化。这些调整应该是在你理解了系统行为之后,为了特定需求而做出的权衡。希望这份指南能帮助你更好地驾驭 Silverblue,让它既快又稳!
如果你有任何问题,或者发现某个优化步骤在你的特定硬件上效果不佳,欢迎随时交流。毕竟,每个系统都是独特的,适合的才是最好的。
