U盘Linux系统的两种swap解决方案
演示系统: Debian GNU/Linux forky/sid
适用场景: 系统安装在 U 盘中,有时插在自带 SSD 的主机上,有时插在没有 SSD 的主机上。
本教程介绍了如何智能管理 U 盘 Linux 系统的 Swap 空间:在有 SSD 时自动使用 SSD 上的 Swap 以保护 U 盘;在无 SSD 时通过 ZRAM 兜底,并确保桌面环境优先加载。
方案一:有 SSD 时,使用分区标签挂载 Swap
当主机内有受你控制的 SSD 时,可以将 Swap 放在 SSD 上,通过标签和 nofail 参数实现“有则挂载,无则跳过”。
1. 格式化并打标签
确认你要用作 Swap 的分区(例如 /dev/sda6)。使用 mkswap 命令将其格式化为 Swap,并同时赋予它一个标签(例如 ssd_swap):
sudo mkswap -L ssd_swap /dev/sda6
⚠️ 注意:此操作会清除该分区上的所有原有数据,请务必确认分区号正确。
2. 配置 fstab
提权编辑 /etc/fstab:
sudoedit /etc/fstab
在文件末尾添加以下一行:
LABEL=ssd_swap none swap sw,nofail 0 0
3. 验证挂载
保存并退出编辑器后,加载新的 fstab 配置并查看状态:
sudo swapon -a
free -h
方案二:无 SSD 时,使用 ZRAM 延迟兜底
如果没有物理 Swap,当内存耗尽时,系统可能会触发 OOM(Out of Memory)导致程序崩溃或卡死。此时可以用 ZRAM 在内存中划分一块压缩区域来兜底。
为了防止 ZRAM 在开机阶段占用宝贵的内存资源,我们让它在桌面环境加载完成后再启动,并自动检测:如果已有物理 Swap,则不启动 ZRAM。
1. 编写自动检测脚本
创建脚本文件 /usr/local/bin/auto_zram.sh:
sudo nano /usr/local/bin/auto_zram.sh
写入以下内容:
#!/bin/bash
swap_result=$(swapon --show=NAME --noheadings)
if [ "$swap_result" = "" ]; then
systemctl start zramswap
logger "auto_zram: zram enabled"
else
logger "auto_zram: a swap is available, skipping zram"
fi
赋予脚本执行权限:
sudo chmod +x /usr/local/bin/auto_zram.sh
2. 创建 systemd 服务
创建服务文件 /etc/systemd/system/auto-zram.service:
sudo nano /etc/systemd/system/auto-zram.service
写入以下内容(配置为在 graphical.target 之后启动):
[Unit]
Description=Enable ZRAM if no swap is available after Desktop is loaded
After=graphical.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/auto_zram.sh
[Install]
WantedBy=graphical.target
3. 切换服务并启用
禁用系统默认的 ZRAM 服务,启用我们自定义的服务:
# 禁用原始的 zramswap 服务
sudo systemctl disable zramswap.service
# 重载 systemd 并启用自定义服务
sudo systemctl daemon-reload
sudo systemctl enable auto-zram.service
如果你的处理器核心数较多,ZRAM 的压缩和解压效率会非常高,对系统性能的影响微乎其微。在这种情况下,即使有 SSD,你也可以考虑只使用 ZRAM,彻底告别物理 Swap。
本文来自博客园,作者:145a,转载请注明原文链接:https://www.cnblogs.com/54145a/p/19990068
╭────────────────────╮ │ 𝓌𝓇𝒾𝓉𝓉ℯ𝓃 𝒷𝓎 𝒽𝓊𝓂𝒶𝓃𝓈 │ 🙂 ℕ𝕠𝕥 𝕓𝕪 𝔸𝕀 ╰────────────────────╯

浙公网安备 33010602011771号