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。

posted @ 2026-05-07 20:36  145a  阅读(29)  评论(0)    收藏  举报