Linux swapon 命令

注意:swapon用于启用Linux系统中的交换空间(swap space)。交换空间可以是磁盘分区、文件或逻辑卷,当物理内存不足时,系统会将不常用的内存页移动到交换空间以释放物理内存。

命令简介

swapon是Linux系统中用于启用和配置交换空间的命令。它可以将预先初始化的交换分区、交换文件或逻辑卷激活为可用的交换空间,并可以设置交换空间的优先级、查看交换空间状态等。

命令语法

swapon [选项] [设备]

常用选项

选项 说明
-a, --all 启用/etc/fstab中标记的所有交换设备
-d, --discard 启用TRIM支持(仅SSD)
-e, --ifexists 静默跳过不存在的设备
-f, --fixpgsz 重新初始化交换空间(如果页面大小不匹配)
-L 标签 按标签启用交换设备
-p, --priority 优先级 设置交换空间的优先级
-s, --summary 显示交换空间摘要信息
-v, --verbose 详细输出模式
-U UUID 按UUID启用交换设备
--help 显示帮助信息
--version 显示版本信息
--show[=字段] 以表格形式显示交换空间信息

交换空间优先级

交换空间优先级(0-32767)决定了系统使用交换空间的顺序:

优先级 说明
32767 最高优先级,系统优先使用
100-1000 高优先级,推荐用于高速存储
0-100 中等优先级
-1 最低优先级,最后使用

使用示例

1. 启用交换分区

# 启用交换分区
sudo swapon /dev/sdb1

# 启用并设置优先级
sudo swapon -p 100 /dev/sdb1  # 高优先级

# 启用多个交换分区
sudo swapon /dev/sdb1 /dev/sdc1

2. 启用交换文件

# 启用交换文件
sudo swapon /swapfile

# 启用并设置标签(如果已设置)
sudo swapon -L "system_swap" /swapfile

# 启用并设置UUID
sudo swapon -U "12345678-1234-1234-1234-123456789012"

3. 启用所有配置的交换空间

# 启用/etc/fstab中定义的所有交换设备
sudo swapon -a

# 启用并显示详细信息
sudo swapon -av

# 启用时跳过不存在的设备
sudo swapon -ae

4. 查看交换空间状态

# 查看交换空间摘要信息
swapon -s

# 以表格形式显示详细信息
swapon --show

# 显示特定字段
swapon --show=NAME,TYPE,SIZE,USED,PRIO

# 查看所有可用信息
swapon --show=all

5. 设置交换空间优先级

# 为高速SSD上的交换空间设置高优先级
sudo swapon -p 1000 /dev/nvme0n1p3

# 为慢速HDD上的交换空间设置低优先级
sudo swapon -p 10 /dev/sda3

# 多个交换空间不同优先级
sudo swapon -p 1000 /dev/nvme0n1p3
sudo swapon -p 100 /dev/sdb1
sudo swapon -p 10 /dev/sdc1

6. 启用TRIM支持(SSD优化)

# 启用交换空间的TRIM支持(仅适用于SSD)
sudo swapon -d /dev/sdb1

# 同时启用TRIM和设置优先级
sudo swapon -d -p 100 /dev/sdb1

7. 完整交换空间管理脚本

#!/bin/bash
# 交换空间管理脚本
HIGH_SPEED_SWAP="/dev/nvme0n1p3"
LOW_SPEED_SWAP="/dev/sda3"
SWAP_FILE="/swapfile"

echo "=== 交换空间管理脚本 ==="

# 显示当前交换空间状态
echo "当前交换空间状态:"
swapon --show

# 禁用所有交换空间(如果需要重新配置)
echo "禁用所有交换空间..."
sudo swapoff -a

# 启用高速交换分区(高优先级)
echo "启用高速交换分区..."
if [ -b "$HIGH_SPEED_SWAP" ]; then
    sudo swapon -d -p 1000 "$HIGH_SPEED_SWAP"
    echo "✓ 高速交换分区已启用 (优先级: 1000)"
else
    echo "✗ 高速交换分区不存在: $HIGH_SPEED_SWAP"
fi

# 启用低速交换分区(低优先级)
echo "启用低速交换分区..."
if [ -b "$LOW_SPEED_SWAP" ]; then
    sudo swapon -p 10 "$LOW_SPEED_SWAP"
    echo "✓ 低速交换分区已启用 (优先级: 10)"
else
    echo "✗ 低速交换分区不存在: $LOW_SPEED_SWAP"
fi

# 启用交换文件(中等优先级)
echo "启用交换文件..."
if [ -f "$SWAP_FILE" ]; then
    sudo swapon -p 100 "$SWAP_FILE"
    echo "✓ 交换文件已启用 (优先级: 100)"
else
    echo "✗ 交换文件不存在: $SWAP_FILE"
fi

# 验证最终状态
echo "最终交换空间状态:"
swapon --show=NAME,TYPE,SIZE,USED,PRIO

# 显示内存和交换使用情况
echo "内存和交换使用情况:"
free -h

8. 系统启动时自动启用交换空间

# 编辑/etc/fstab配置自动启用
# 格式:设备 挂载点 类型 选项 转储 检查

# 示例配置:
# 使用设备名
/dev/sdb1 none swap sw 0 0

# 使用UUID(推荐)
UUID=12345678-1234-1234-1234-123456789012 none swap sw,pri=100 0 0

# 使用标签
LABEL=swap_partition none swap sw,pri=1000 0 0

# 使用交换文件
/swapfile none swap sw,pri=50 0 0

# 启用TRIM支持(仅SSD)
/dev/nvme0n1p3 none swap sw,discard,pri=1000 0 0

# 启动后测试配置
sudo swapon -a  # 启用所有配置的交换空间
swapon --show   # 验证是否成功

交换空间性能监控

1. 实时监控交换使用情况

# 使用vmstat监控交换活动
vmstat 1  # 每秒刷新一次

# 使用sar监控交换统计
sar -W 1  # 每秒监控页面交换

# 使用top或htop
top
htop

# 专门查看交换信息
cat /proc/swaps
cat /proc/meminfo | grep -i swap

2. 监控脚本示例

#!/bin/bash
# 交换空间监控脚本
INTERVAL=5  # 监控间隔(秒)
COUNT=12    # 监控次数

echo "交换空间监控 - 每${INTERVAL}秒刷新"
echo "时间戳          总交换   使用中   百分比   优先级"

for ((i=0; i

常见问题解决

1. "设备忙"或"资源忙"错误

# 错误:swapon: /dev/sdb1: Device or resource busy
# 解决方案:检查设备是否已被启用
swapon --show | grep sdb1

# 如果已启用,先禁用再启用
sudo swapoff /dev/sdb1
sudo swapon /dev/sdb1

# 检查是否有其他进程使用
sudo lsof | grep /dev/sdb1

2. "权限被拒绝"错误

# 错误:swapon: /swapfile: Permission denied
# 解决方案:
# 1. 使用sudo
sudo swapon /swapfile

# 2. 检查文件权限
sudo chmod 600 /swapfile
sudo chown root:root /swapfile

# 3. 检查SELinux上下文(如果启用SELinux)
sudo restorecon /swapfile

3. 交换空间无法启用

# 检查交换空间是否已正确初始化
sudo mkswap /dev/sdb1  # 重新初始化(会丢失数据)

# 检查文件系统是否支持
# 对于交换文件,确保文件系统支持(ext4, xfs等)

# 检查内核是否支持交换文件
grep CONFIG_SWAP /boot/config-$(uname -r)

# 检查dmesg日志
dmesg | tail -20

4. 优先级设置不生效

# 检查当前优先级设置
swapon --show=NAME,PRIO

# 重新启用并设置优先级
sudo swapoff /dev/sdb1
sudo swapon -p 100 /dev/sdb1

# 检查/etc/fstab中的优先级设置
# 确保格式正确:sw,pri=100

性能优化技巧

1. 使用多个交换空间并设置优先级

# 配置多级交换空间
# 高速SSD交换分区 - 最高优先级
sudo swapon -d -p 1000 /dev/nvme0n1p3

# 快速SATA SSD交换分区 - 中等优先级
sudo swapon -p 500 /dev/sdb1

# 慢速HDD交换分区 - 低优先级
sudo swapon -p 10 /dev/sdc1

# 系统会优先使用高优先级的交换空间

2. 优化交换性参数

# 查看当前交换性设置
cat /proc/sys/vm/swappiness

# 临时调整(值越小,系统越少使用交换)
sudo sysctl vm.swappiness=10

# 永久调整
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 建议值:
# 桌面系统:10-30
# 服务器:1-10
# 数据库服务器:1

3. 启用压缩交换(zswap)

# zswap是内存中的压缩交换缓存
# 检查是否已启用
cat /sys/module/zswap/parameters/enabled

# 启用zswap(需要内核支持)
echo 1 | sudo tee /sys/module/zswap/parameters/enabled

# 设置zswap参数
echo lz4 | sudo tee /sys/module/zswap/parameters/compressor
echo 20 | sudo tee /sys/module/zswap/parameters/max_pool_percent

4. 使用交换文件替代交换分区

# 交换文件更灵活,易于调整大小
# 创建交换文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile

# 启用交换文件
sudo swapon /swapfile

# 调整交换文件大小
sudo swapoff /swapfile
sudo fallocate -l 8G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

高级配置

1. 加密交换空间

# 使用dm-crypt创建加密交换空间
# 1. 创建加密设备
sudo cryptsetup luksFormat /dev/sdb1

# 2. 打开加密设备
sudo cryptsetup luksOpen /dev/sdb1 cryptswap

# 3. 创建交换空间
sudo mkswap /dev/mapper/cryptswap

# 4. 启用加密交换空间
sudo swapon /dev/mapper/cryptswap

# 5. 配置/etc/crypttab和/etc/fstab实现自动启用

2. 使用LVM逻辑卷作为交换空间

# 1. 创建逻辑卷
sudo lvcreate -L 8G -n swap_lv vg_system

# 2. 创建交换空间
sudo mkswap /dev/vg_system/swap_lv

# 3. 启用交换空间
sudo swapon /dev/vg_system/swap_lv

# 4. 动态调整逻辑卷大小
# 增加交换空间大小
sudo swapoff /dev/vg_system/swap_lv
sudo lvextend -L +4G /dev/vg_system/swap_lv
sudo mkswap /dev/vg_system/swap_lv
sudo swapon /dev/vg_system/swap_lv

重要注意事项

  • 性能影响:频繁使用交换空间会显著降低系统性能
  • SSD寿命:在SSD上使用交换空间可能影响其使用寿命
  • 数据安全:交换空间可能包含敏感信息,考虑使用加密交换
  • 休眠支持:如需休眠功能,交换空间总大小应≥内存大小
  • 监控必要:定期监控交换空间使用情况,避免交换抖动
  • 适当大小:根据系统内存使用情况合理设置交换空间大小
  • 优先级设置:合理设置优先级可优化多存储设备的性能

相关命令对比

命令 功能 与swapon的关系
swapoff 禁用交换空间 与swapon功能相反
mkswap 初始化交换空间 先使用mkswap初始化,再使用swapon启用
free 显示内存和交换使用情况 用于查看swapon启用的交换空间使用情况
sysctl 调整内核参数 可调整vm.swappiness影响交换行为
fallocate 创建交换文件 为swapon准备交换文件
fstab 系统启动配置 配置swapon -a自动启用的交换设备

安装相关工具

# swapon通常已包含在util-linux包中
# 检查是否安装
which swapon

# 如果需要安装(很少需要)
# Debian/Ubuntu
sudo apt-get install util-linux

# CentOS/RHEL
sudo yum install util-linux

# 安装监控工具
sudo apt-get install procps    # 包含free, vmstat等
sudo apt-get install sysstat   # 包含sar
sudo apt-get install htop      # 更友好的进程查看器

# 安装LVM工具(如果需要使用逻辑卷)
sudo apt-get install lvm2

相关命令

  • swapoff - 禁用交换空间
  • mkswap - 初始化交换空间
  • free - 显示内存和交换使用情况
  • vmstat - 监控系统资源使用情况
  • sysctl - 调整内核参数
  • fallocate/dd - 创建交换文件
  • fstab - 系统启动配置文件
  • sar - 系统活动报告工具
  • cryptsetup - 加密交换空间
  • lvcreate/lvextend - LVM逻辑卷管理