swapoff 命令用于禁用Linux系统中的交换空间(swap space),包括交换分区和交换文件。它是内存管理的重要工具,与 swapon 命令配合使用。
swapoff [选项] [设备/文件]
swapoff -a
swapoff -v /path/to/swapfile
/proc/swaps 文件在关闭交换空间前,先查看当前状态:
# 查看所有交换空间状态
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
关闭特定的交换分区:
# 查看当前交换分区
sudo swapon --show
# 关闭指定的交换分区
sudo swapoff /dev/sda3
# 使用详细模式关闭
sudo swapoff -v /dev/sdb2
# 验证是否已关闭
sudo swapon --show
free -h
关闭通过文件创建的交换空间:
# 查看当前的交换文件
sudo swapon --show
# 关闭交换文件
sudo swapoff /swapfile
sudo swapoff /mnt/swapfile1
# 如果交换文件正在使用,可能需要等待数据写回内存
# 可以查看进度
watch -n 1 'free -h | grep Swap'
# 验证交换文件已关闭
ls -lh /swapfile
# 文件仍然存在,但不再作为交换空间使用
一次性关闭系统中所有的交换空间:
# 关闭所有交换空间
sudo swapoff -a
# 使用详细模式关闭所有
sudo swapoff -av
# 验证所有交换空间已关闭
sudo swapon --show
# 应该没有输出
free -h | grep Swap
# Swap: 0B 0B 0B
# 注意:这不会从 /etc/fstab 中删除配置
# 重启后,fstab 中配置的交换空间可能会被重新启用
在系统维护时临时禁用交换空间:
#!/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
永久禁用交换空间(需要修改系统配置):
# 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
# 应该没有输出
可能的原因和解决方案:
# 查看哪些进程在使用交换空间
sudo smem -s swap -r | head -20
# 尝试关闭占用交换空间的进程
# 或者重启系统后再尝试
# 检查交换设备
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
主要风险:
建议:
watch -n 1 free -hvm.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 中移除配置(如需永久禁用)