Ubuntu 修改 Swap 交换空间大小
在 Ubuntu 系统(包括 18.04、20.04、22.04 等版本)中,Swap 交换空间是虚拟内存,用于在物理 RAM 不足时扩展内存。默认情况下,Ubuntu 通常创建一个 1-2 GB 的 Swap 文件(位于 /swapfile)。修改 Swap 大小的原因可能是运行内存密集型任务(如机器学习、视频编辑)时出现 OOM(Out of Memory)错误。
注意事项:
- 操作前备份重要数据,以防分区调整出错。
- 推荐 Swap 大小:等于或略大于 RAM(例如 RAM 8 GB 时 Swap 设为 8-16 GB),但不超过 4 GB 作为备份使用。如果是服务器,建议根据实际负载调整。
- 这些操作需要 root 权限,使用
sudo。 - 如果系统使用 Swap 分区(而非文件),调整更复杂,可能需调整分区表(使用
gparted工具),建议在单用户模式或 Live USB 下操作。
以下是两种常见方法:调整现有 Swap 文件(推荐,简单无风险)和创建新 Swap 文件(如果现有 Swap 不足)。我将以调整为 8 GB 为例。
方法一:调整现有 Swap 文件大小(适用于大多数 Ubuntu 安装)
- 查看当前 Swap 信息
运行命令确认当前 Swap 大小和位置:
sudo swapon --show
或
free -h
输出示例:
NAME TYPE SIZE USED PRIO
/swapfile file 1G 0B -2
这显示 Swap 文件位于 /swapfile,大小 1 GB。
- 停用当前 Swap
sudo swapoff -a
(这会暂时禁用 Swap,确保没有进程在使用它。如果系统内存紧张,此步可能失败——先关闭不必要程序。)
- 删除旧 Swap 文件
sudo rm /swapfile
(确认文件已删除:ls /swapfile 应无输出。)
- 创建新 Swap 文件(例如 8 GB)
使用fallocate(更快)或dd(更兼容):
fallocate方法:sudo fallocate -l 8G /swapfiledd方法(如果 fallocate 不可用):sudo dd if=/dev/zero of=/swapfile bs=1G count=8
(bs=1G count=8表示块大小 1 GB,创建 8 个块。)
- 设置权限(仅 root 可读写):
sudo chmod 600 /swapfile
- 格式化为 Swap:
sudo mkswap /swapfile
- 启用新 Swap:
sudo swapon /swapfile
- 永久生效(开机自动挂载):
编辑/etc/fstab文件:
sudo nano /etc/fstab
在文件末尾添加一行(如果已存在 /swapfile none swap sw 0 0,无需重复):
/swapfile none swap sw 0 0
保存退出(Ctrl+O, Enter, Ctrl+X)。
- 验证:
sudo swapon --show
free -h
应显示新大小 8 GB。
方法二:创建额外 Swap 文件(不删除旧的,增加总空间)
如果不想修改现有 Swap,可创建新文件(例如 /newswapfile)并启用。步骤类似方法一的 4-9,但路径改为 /newswapfile,并在 /etc/fstab 中添加相应行。
方法三:调整 Swap 分区(高级,需分区工具)
如果使用分区(非文件),需:
- 停用 Swap:
sudo swapoff -a。 - 使用
gparted(sudo apt install gparted)调整分区大小(需未分配空间)。 - 格式化:
sudo mkswap /dev/sdX(X 为分区,如 sda3)。 - 更新
/etc/fstab和sudo swapon /dev/sdX。 - 重启验证。
警告:分区操作风险高,可能导致数据丢失。
优化 Swap 使用
- 调整 Swappiness(Swap 使用倾向):默认 60(内存用 40% 后开始 Swap)。设为 10(更倾向内存)或 0(禁用 Swap):
sudo sysctl vm.swappiness=10
永久:编辑 /etc/sysctl.conf 添加 vm.swappiness=10,然后 sudo sysctl -p。
- 优先级:如果多个 Swap,设置优先级:
sudo mkswap -p 10 /swapfile(数字越高优先)。
如果遇到错误(如“no space left”),检查磁盘空间:df -h。对于特定 Ubuntu 版本(如 24.04),步骤类似,但确认文件位置。
如果你的系统是服务器或有特殊配置,建议提供更多细节(如 swapon --show 输出)以进一步诊断。