linux swapoff命令

命令简介

swapoff 命令用于禁用Linux系统中的交换空间(swap space),包括交换分区和交换文件。它是内存管理的重要工具,与 swapon 命令配合使用。

注意:关闭交换空间前,请确保系统有足够的物理内存,否则可能导致系统不稳定或崩溃!

基本语法

swapoff [选项] [设备/文件]
swapoff -a
swapoff -v /path/to/swapfile

常用选项

选项 描述
-a, --all 关闭所有在 /proc/swaps/etc/fstab 中定义的交换空间
-v, --verbose 显示详细信息
-s, --summary 显示交换空间使用摘要(同 swapon -s
-h, --help 显示帮助信息
-V, --version 显示版本信息

工作原理

swapoff 工作流程
  1. 检查指定的交换设备/文件是否处于激活状态
  2. 从内核交换空间中移除该设备/文件
  3. 将交换空间中的数据写回物理内存(如果需要)
  4. 更新 /proc/swaps 文件
  5. 释放交换设备/文件占用的资源
swapoff 与 swapon 关系
  • swapon:启用交换空间
  • swapoff:禁用交换空间
  • /proc/swaps:当前激活的交换空间列表
  • /etc/fstab:系统启动时自动挂载的交换空间配置

实际示例

示例1:查看交换空间状态

在关闭交换空间前,先查看当前状态:

# 查看所有交换空间状态
free -h
# 输出示例:
#               total        used        free      shared  buff/cache   available
# Mem:           7.7G        2.1G        4.9G        123M        712M        5.3G
# Swap:          2.0G        512M        1.5G

# 查看详细的交换空间信息
swapon --show
# 输出示例:
# NAME      TYPE      SIZE   USED PRIO
# /dev/sda3 partition   2G 512.4M   -2

# 查看 /proc/swaps 文件
cat /proc/swaps
# 输出示例:
# Filename                                Type            Size    Used    Priority
# /dev/sda3                               partition       2097148 524288  -2

# 使用 swapoff 查看摘要
swapoff -s
# 输出示例:
# Filename                                Type            Size    Used    Priority
# /dev/sda3                               partition       2097148 524288  -2

示例2:关闭指定的交换分区

关闭特定的交换分区:

# 查看当前交换分区
sudo swapon --show

# 关闭指定的交换分区
sudo swapoff /dev/sda3

# 使用详细模式关闭
sudo swapoff -v /dev/sdb2

# 验证是否已关闭
sudo swapon --show
free -h

示例3:关闭交换文件

关闭通过文件创建的交换空间:

# 查看当前的交换文件
sudo swapon --show

# 关闭交换文件
sudo swapoff /swapfile
sudo swapoff /mnt/swapfile1

# 如果交换文件正在使用,可能需要等待数据写回内存
# 可以查看进度
watch -n 1 'free -h | grep Swap'

# 验证交换文件已关闭
ls -lh /swapfile
# 文件仍然存在,但不再作为交换空间使用

示例4:关闭所有交换空间

一次性关闭系统中所有的交换空间:

# 关闭所有交换空间
sudo swapoff -a

# 使用详细模式关闭所有
sudo swapoff -av

# 验证所有交换空间已关闭
sudo swapon --show
# 应该没有输出
free -h | grep Swap
# Swap:            0B          0B          0B

# 注意:这不会从 /etc/fstab 中删除配置
# 重启后,fstab 中配置的交换空间可能会被重新启用

示例5:临时禁用交换空间进行维护

在系统维护时临时禁用交换空间:

#!/bin/bash
# 临时禁用交换空间的脚本
# 文件名: disable_swap_temporarily.sh

echo "=== 当前交换空间状态 ==="
free -h | grep Swap
echo ""

# 关闭所有交换空间
echo "正在关闭交换空间..."
swapoff -a
if [ $? -eq 0 ]; then
    echo "✓ 交换空间已关闭"
else
    echo "✗ 关闭交换空间失败"
    exit 1
fi

echo ""
echo "=== 维护操作 ==="
echo "请执行您的维护任务..."
echo "按 Enter 键重新启用交换空间"
read

# 重新启用交换空间
echo "正在重新启用交换空间..."
swapon -a
if [ $? -eq 0 ]; then
    echo "✓ 交换空间已重新启用"
else
    echo "✗ 启用交换空间失败"
fi

echo ""
echo "=== 最终状态 ==="
free -h | grep Swap

示例6:永久禁用交换空间

永久禁用交换空间(需要修改系统配置):

# 1. 首先临时关闭所有交换空间
sudo swapoff -a

# 2. 从 /etc/fstab 中注释掉交换空间的配置
# 备份原文件
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d)

# 编辑 fstab 文件,注释掉包含 swap 的行
sudo sed -i '/swap/s/^/# /' /etc/fstab

# 或者使用文本编辑器手动注释:
# sudo nano /etc/fstab
# 找到类似下面的行并添加 # 注释:
# /swapfile none swap sw 0 0
# /dev/sda3 none swap sw 0 0

# 3. 可选:删除交换文件
# 如果使用交换文件,可以删除它
sudo rm /swapfile

# 4. 调整 swappiness 参数(可选)
# 修改内核参数,减少使用交换空间的倾向
echo "vm.swappiness=0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 5. 验证配置
cat /etc/fstab | grep -v "^#" | grep swap
# 应该没有输出
sudo swapon --show
# 应该没有输出

常见问题

可能的原因和解决方案:

  1. 权限不足:使用 sudo 或 root 权限执行
  2. 交换空间正在使用:系统可能正在使用交换空间,尝试:
    # 查看哪些进程在使用交换空间
    sudo smem -s swap -r | head -20
    
    # 尝试关闭占用交换空间的进程
    # 或者重启系统后再尝试
  3. 设备不存在:确认设备路径是否正确
    # 检查交换设备
    lsblk
    sudo blkid | grep swap

# 使用 free 命令查看
free -h

# 使用 top 或 htop
top
# 在 top 中按 M 键按内存使用排序

# 使用 vmstat
vmstat 1 5

# 查看详细的交换使用情况
cat /proc/meminfo | grep -i swap

# 查看哪些进程在使用交换空间
# 安装 smem 工具
sudo apt-get install smem  # Ubuntu/Debian
sudo yum install smem      # CentOS/RHEL

# 使用 smem 查看
sudo smem -s swap -r | head -20

主要风险:

  • 内存不足:如果物理内存不足,系统可能会因无法分配内存而崩溃
  • 性能下降:当内存紧张时,没有交换空间作为缓冲,可能导致OOM(Out Of Memory)错误
  • 进程被终止:Linux OOM Killer可能会终止占用内存较多的进程

建议:

  1. 在关闭交换空间前,确保有足够的物理内存
  2. 监控系统内存使用情况:watch -n 1 free -h
  3. 对于生产服务器,不要永久禁用交换空间
  4. 可以考虑设置 vm.swappiness=1 而不是完全禁用

# 重新启用所有在 /etc/fstab 中定义的交换空间
sudo swapon -a

# 或者启用特定的交换设备/文件
sudo swapon /dev/sda3
sudo swapon /swapfile

# 验证是否启用成功
sudo swapon --show
free -h

# 如果要从 /etc/fstab 中永久恢复
# 1. 移除注释符号
sudo sed -i '/^#.*swap/s/^# //' /etc/fstab

# 2. 启用交换空间
sudo swapon -a

# 3. 验证
mount | grep swap
free -h

最佳实践

应该做的
  • 操作前备份 /etc/fstab 文件
  • 使用 swapoff -v 查看详细操作信息
  • 操作前检查系统内存使用情况
  • 临时关闭时,准备好重新启用的命令
  • 在维护窗口进行交换空间操作
避免做的
  • 不要在生产系统高峰期操作
  • 避免在内存不足时关闭交换空间
  • 不要忘记从 /etc/fstab 中移除配置(如需永久禁用)
  • 避免强制关闭正在使用的交换空间
  • 不要在数据库服务器上随意禁用交换空间