说实话,Fedora Silverblue 这套immutable(不可变)系统是个“真香”定律的典型代表——日常用着稳如老狗,但一旦涉及到系统底层升级或者磁盘空间告急,那种无力感真的会让很多从传统发行版转过来的朋友抓狂。我见过太多人因为一次 rpm-ostree 卡死或者根分区爆满,直接把系统搞崩,最后不得不对着黑屏发呆半小时。今天咱们不聊虚的,就把这几个最让人头疼的问题拆开来,给你一套能直接上手、有代码有实例、甚至能把原理讲得连你家隔壁小学生都能听懂的完整解决方案。
一、升级卡死黑屏:别慌,这是“原子化”的代价
Silverblue 的核心机制是“原子升级”,它不会直接在当前运行的系统上打补丁,而是先把新的镜像层(image layer)下载好、校验完,然后在后台准备好,等你下次重启时才“切换”过去。这个过程听起来很优雅,但一旦卡在 Preparing: ... 或者切换黑屏,基本就意味着操作系统的底层文件系统挂载出现了死锁。这时候你第一反应肯定是狂按 Ctrl+C 或者强制重启,但请先忍住,因为对于 immutable 系统来说,强制重启往往是导致系统无法回滚的元凶。
1.1 为什么升级会黑屏卡死?
我们要先理解一个概念:rpm-ostree 的操作分为两个阶段。第一阶段是“拉取并准备”(pull and prepare),这时候你看到的是命令行进度条;第二阶段是“部署并切换”(deploy and switch),这时候屏幕通常会黑掉,因为系统在卸载当前的 root 文件系统挂载点,并挂载新的。
如果你看到的黑屏持续超过 5-10 分钟,或者进度条一直不动,通常有以下几个常见原因:
- 内核模块兼容性问题:比如你安装了专有 NVIDIA 驱动,但新内核的 ABI 接口发生了微小变化,导致 dracut(生成 initramfs 的工具)在打包内核模块时陷入死循环。
- 磁盘 I/O 瓶颈:老式机械硬盘(HDD)在处理大量小文件的哈希校验时,吞吐量极低,容易让系统误判为死锁。
- 剩余空间不足:这是最隐蔽的杀手。升级需要为新的镜像预留空间,如果
/var或/root分区剩余空间低于 5GB,rpm-ostree可能会因为无法写入临时文件而静默挂起。
1.2 紧急处理:如何优雅地“逃生”
当黑屏卡住时,不要强制断电。我们可以尝试通过 TTY(虚拟控制台)介入。按 Ctrl + Alt + F2(或 F3-F6),如果能进入命令行登录界面,恭喜你,系统还活着。登录后,执行以下操作来查看卡住的原因:
# 查看 rpm-ostree 进程状态,确认是否真的死锁还是只是慢
ps aux | grep rpm-ostree
# 查看系统日志,寻找最近的错误信息,特别是 dmesg 中的 I/O 错误
sudo journalctl -xe --since "10 minutes ago" | grep -E "(error|fail|stuck|timeout)"
如果确认进程已死锁,或者你无法等待,可以尝试强制终止并清理未完成的事务。注意:这可能导致系统状态不一致,需做好重装准备。
# 强制停止 rpm-ostree 进程
sudo kill -9 $(pgrep rpm-ostree)
# 清理可能残留的未完成事务
sudo rpm-ostree cleanup --reboot
执行清理命令后,再次尝试重启,系统通常会回滚到上一个已知良好的部署状态。
1.3 预防措施:让升级更稳健
为了避免下次升级再踩雷,我们可以在升级前做好预判。比如,检查当前的磁盘空间和依赖冲突:
# 查看当前部署状态和可用空间
rpm-ostree status
# 预览即将进行的升级,看看是否有包冲突
rpm-ostree upgrade --dry-run
如果担心 NVIDIA 驱动问题,建议在升级前暂时移除专有驱动,等升级完成后再重新安装,或者使用 Fedora 仓库自带的开源 nouveau 驱动过渡。对于老电脑用户,我更推荐在升级前运行一次 sudo rpm-ostree cleanup --prune,把那些已经不再使用的旧版本镜像层清理掉,这样可以释放大量空间,减少升级时的 I/O 压力。
二、磁盘空间不足:自动清理的“断舍离”艺术
Silverblue 的不可变特性意味着 / 根分区通常不大,而用户的个人数据都在 /home 下。随着时间推移,缓存、日志、旧内核版本会像野草一样疯长。当磁盘空间低于 10% 时,系统性能会显著下降,甚至无法进行软件安装。我们需要一套自动化的清理机制,而不是每次手动去翻文件夹。
2.1 清理目标:哪些东西占了你的空间?
首先,我们要知道谁在偷吃你的空间。在终端运行以下命令,直观地看看各个目录的占用情况:
# 查看根分区各一级目录的占用大小(单位:GB)
du -h --max-depth=1 / | sort -hr | head -n 10
通常,占用大户集中在以下几个地方:
/var/cache:包管理器缓存(DNF/COPR)、应用缓存(如 Steam、浏览器缓存)。/var/log:系统日志,尤其是journalctl日志。/usr/share:文档、字体和图标主题,特别是多桌面环境共存时。- 旧的内核镜像:
rpm-ostree默认会保留最近的几个部署,但如果配置不当,可能会堆积过多。
2.2 自动化清理脚本:一劳永逸的解决方案
我们可以编写一个简单的 Bash 脚本,并结合 cron 或 systemd timer 实现定期自动清理。这个脚本不会动你的重要数据,只针对缓存和临时文件。
创建一个脚本文件,比如 ~/scripts/auto-clean-silverblue.sh:
#!/bin/bash
# Silverblue 自动清理脚本
# 作者:Agnes
# 功能:清理 DNF 缓存、Journal 日志、以及过时的缓存
set -e
LOG_FILE="/var/log/silverblue-cleanup.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始自动清理..." | sudo tee -a $LOG_FILE
# 1. 清理 DNF 缓存(保留最新的元数据,删除旧的包缓存)
echo "清理 DNF 缓存..." | sudo tee -a $LOG_FILE
sudo dnf clean all
sudo dnf autoremove -y
# 2. 限制 Journal 日志大小,只保留最近 7 天的日志
echo "清理系统日志..." | sudo tee -a $LOG_FILE
sudo journalctl --vacuum-time=7d
# 3. 清理用户级的缓存(谨慎操作,不影响系统)
echo "清理用户缓存..."
rm -rf ~/.cache/thumbnails/*
rm -rf ~/.cache/pip/*
rm -rf ~/.cache/npm/*
# 4. 清理 rpm-ostree 未使用的部署
echo "清理过时的系统部署..."
sudo rpm-ostree cleanup --prune
# 5. 显示清理后的磁盘空间
echo "清理完成,当前磁盘使用情况:" | tee -a $LOG_FILE
df -h / | tee -a $LOG_FILE
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理结束。" | sudo tee -a $LOG_FILE
别忘了给脚本执行权限:
chmod +x ~/scripts/auto-clean-silverblue.sh
2.3 设置定时任务:让清理自动化
为了让这个脚本定期运行,我们可以使用 systemd timer,这比传统的 cron 更现代化,也更适合 Silverblue 的环境。
创建一个服务文件 ~/system/auto-clean.service:
[Unit]
Description=Silverblue Auto Cleanup Service
[Service]
Type=oneshot
ExecStart=/home/your_username/scripts/auto-clean-silverblue.sh
(注意:请将 your_username 替换为你的实际用户名)
创建一个定时器文件 ~/system/auto-clean.timer:
[Unit]
Description=Run Silverblue Auto Cleanup Daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
然后安装并启动定时器:
mkdir -p ~/.config/systemd/user
cp ~/system/auto-clean.service ~/.config/systemd/user/
cp ~/system/auto-clean.timer ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now auto-clean.timer
现在,你的系统每天都会自动执行一次“大扫除”,再也不用担心磁盘空间告急导致的升级失败或系统卡顿。
三、提升老电脑流畅度:三项关键配置技巧
老电脑跑 Fedora Silverblue,最怕的就是“卡”。这种卡不一定是 CPU 不够强,更多时候是内存管理、I/O 调度和桌面环境资源占用不匹配导致的。下面这三项配置,是针对资源受限硬件的“针对性手术”,每一项都能带来可感知的流畅度提升。
3.1 技巧一:调整 SWAP 策略,让内存“喘口气”
老电脑内存通常只有 4GB 或 8GB,当物理内存耗尽时,系统会动用 SWAP(交换分区)。默认情况下,Linux 的 swappiness 参数可能过于激进地往 SWAP 里搬数据,导致系统响应变慢。我们可以调整这个参数,让系统更倾向于使用物理内存。
首先,查看当前的 SWAPPINESS 值:
cat /proc/sys/vm/swappiness
如果显示的是 60,对于老电脑来说可能太高了。我们可以将其调整为 10,意味着只有当物理内存几乎耗尽时,才使用 SWAP。
临时生效(重启后失效):
sudo sysctl vm.swappiness=10
永久生效:
编辑 /etc/sysctl.d/99-swappiness.conf 文件:
vm.swappiness=10
然后执行 sudo sysctl --system 使配置生效。
注意:如果你的内存非常小(如 2GB),建议保持默认的 60,否则系统可能会因为内存不足而直接 OOM Kill 掉关键进程。
3.2 技巧二:使用 ZRAM 替代传统 SWAP,提升 I/O 性能
对于老电脑的机械硬盘来说,SWAP 的读写速度是巨大的瓶颈。ZRAM 是一种将内存的一部分压缩后当作 SWAP 使用的技术。虽然它会占用一些 CPU 资源进行压缩/解压,但对于机械硬盘而言,CPU 压缩的速度远远快于硬盘寻道的时间,整体性能会有显著提升。
在 Fedora Silverblue 上安装和启用 ZRAM 非常简单:
# 启用 Fedora 仓库的 zram-generator 套件
sudo rpm-ostree install zram-generator
# 重启系统以加载内核模块
reboot
重启后,系统会自动创建一个基于内存的压缩 SWAP 设备。你可以用 swapon --show 验证是否生效。ZRAM 不仅速度快,还能减少对硬盘的磨损,对老电脑的硬盘健康也有好处。
3.3 技巧三:轻量化桌面环境配置,减少“视觉负担”
Fedora Silverblue 默认使用 GNOME 桌面,GNOME 以美观著称,但也以资源占用高闻名。对于老电脑,我们不需要换掉 GNOME,但可以通过配置减少它的“负重”。
1. 禁用不必要的动画和透明度: 打开“设置” -> “辅助功能” -> “视觉”,勾选“减少动画”。或者通过命令行:
# 禁用桌面特效动画
gsettings set org.gnome.desktop.interface enable-animations false
# 禁用窗口透明度
gsettings set org.gnome.desktop.wm.preferences unredirect-fullscreen-windows true
2. 使用 Lite 版扩展或替代面板:
GNOME Shell 的资源占用很大一部分来自扩展。建议禁用所有非必要的扩展,只保留最核心的几个。另外,可以安装 Caffeine 扩展,防止屏幕自动锁屏和休眠,减少系统唤醒时的资源消耗。
3. 调整后台服务: 检查并禁用一些不常用的系统服务。例如,如果你不用打印机,可以禁用 CUPS 服务:
systemctl --user disable --now cups.service
通过 gnome-tweaks( GNOME 优化 工具),你可以进一步调整窗口的焦点策略、鼠标速度等,让交互更跟手,提升主观上的“流畅感”。
写在最后:
Fedora Silverblue 的哲学是“稳定至上”,但这并不意味着它不可调优。面对升级卡死,我们要学会冷静排查,利用 TTY 和清理命令“救火”;面对磁盘空间,我们要建立自动化的清理习惯,让系统保持清爽;面对老电脑的卡顿,我们要从内存调度、I/O 优化和桌面轻量化三个维度入手,榨干每一分硬件性能。
这套组合拳打下来,你的 Silverblue 应该能稳稳当当地再战三年。如果还有具体的报错信息或者特殊的硬件配置,欢迎随时来找我,我们一起把问题逐个击破。记住,Linux 的魅力就在于此——哪怕是最老的机器,也能通过精心的配置,焕发出新的生机。
