Linux mkswap 命令

注意:mkswap用于在Linux系统上创建交换空间(swap space)。交换空间可以是磁盘分区、文件或逻辑卷,当物理内存不足时,系统会将不常用的内存页移到交换空间,为当前活动进程腾出内存。

命令简介

mkswap是Linux系统中用于初始化交换空间(swap space)的命令。它会在指定的设备或文件上设置交换区签名和标头信息,使其可以被Linux内核识别和使用。交换空间是系统内存管理的重要组成部分。

命令语法

mkswap [选项] 设备 [大小]

常用选项

选项 说明
-c, --check 创建交换区前检查坏块
-f, --force 强制创建,即使命令认为不合适
-p, --pagesize 大小 指定页面大小(字节)
-L, --label 标签 指定交换区标签
-U, --uuid UUID 指定交换区UUID
-v, --swapversion 版本 指定交换区格式版本(1或2)
--verbose 详细输出模式
--help 显示帮助信息
--version 显示版本信息

交换空间类型

类型 说明 优点 缺点
交换分区 磁盘上的独立分区 性能较好,无需文件系统开销 需要提前分区,调整大小困难
交换文件 文件系统中的特殊文件 灵活,易于创建和调整大小 性能稍差,有文件系统开销
交换逻辑卷 LVM逻辑卷作为交换空间 可动态调整大小,管理灵活 需要LVM支持
zswap 压缩的内存交换缓存 减少磁盘I/O,提高性能 需要内核支持,仍需要后备交换

使用示例

1. 创建交换分区

# 检查现有分区
sudo fdisk -l

# 假设我们使用/dev/sdb1作为交换分区
# 首先卸载分区(如果已挂载)
sudo umount /dev/sdb1

# 创建交换分区
sudo mkswap /dev/sdb1

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

# 验证交换空间
sudo swapon --show
free -h

2. 创建交换文件

# 创建4GB的交换文件
sudo fallocate -l 4G /swapfile

# 或使用dd创建(如果fallocate不可用)
# sudo dd if=/dev/zero of=/swapfile bs=1M count=4096

# 设置正确的权限
sudo chmod 600 /swapfile

# 创建交换区
sudo mkswap /swapfile

# 启用交换文件
sudo swapon /swapfile

# 验证
swapon --show

3. 创建带标签的交换分区

# 创建带标签的交换分区
sudo mkswap -L "swap_partition" /dev/sdb1

# 启用时可以使用标签
sudo swapon -L "swap_partition"

4. 检查坏块后创建交换区

# 创建前检查坏块
sudo mkswap -c /dev/sdb1

# 对于交换文件,通常不需要检查坏块
sudo mkswap -c /swapfile

5. 指定页面大小

# 指定4096字节页面大小
sudo mkswap -p 4096 /dev/sdb1

# 常见页面大小:4096(x86_64)、65536(某些旧系统)

6. 创建特定版本的交换区

# 创建swap version 1(旧格式)
sudo mkswap -v 1 /dev/sdb1

# 创建swap version 2(现代格式,支持标签和UUID)
sudo mkswap -v 2 /dev/sdb1

# 查看交换区版本
sudo swaplabel /dev/sdb1

7. 完整交换空间设置脚本

#!/bin/bash
# 交换空间设置脚本
SWAP_SIZE="4G"  # 交换空间大小
SWAP_FILE="/swapfile"
SWAP_LABEL="system_swap"

echo "=== 交换空间设置脚本 ==="
echo "交换文件: $SWAP_FILE"
echo "大小: $SWAP_SIZE"
echo "标签: $SWAP_LABEL"

# 检查现有交换空间
echo "当前交换空间:"
swapon --show
free -h | grep -i swap

# 创建交换文件
echo "创建交换文件..."
if [ -f $SWAP_FILE ]; then
    echo "交换文件已存在,先禁用..."
    sudo swapoff $SWAP_FILE 2>/dev/null
    sudo rm -f $SWAP_FILE
fi

sudo fallocate -l $SWAP_SIZE $SWAP_FILE
if [ $? -ne 0 ]; then
    echo "使用dd创建交换文件..."
    sudo dd if=/dev/zero of=$SWAP_FILE bs=1M count=$((4 * 1024)) status=progress
fi

# 设置权限
sudo chmod 600 $SWAP_FILE

# 创建交换区
echo "初始化交换空间..."
sudo mkswap -L "$SWAP_LABEL" -c $SWAP_FILE

# 启用交换空间
echo "启用交换空间..."
sudo swapon $SWAP_FILE

# 永久配置
echo "配置/etc/fstab..."
if ! grep -q "$SWAP_FILE" /etc/fstab; then
    echo "$SWAP_FILE none swap sw 0 0" | sudo tee -a /etc/fstab
fi

# 验证
echo "=== 设置完成 ==="
echo "交换空间信息:"
swaplabel $SWAP_FILE
swapon --show
free -h

交换空间大小建议

系统内存大小 建议交换空间 休眠支持 说明
≤ 2GB 2倍内存 内存 + 2GB 小内存系统需要更多交换空间
2GB - 8GB 等于内存大小 内存 + 2GB 一般桌面/服务器系统
8GB - 64GB 4GB - 8GB 内存 + 2GB 大内存系统,交换空间主要用于休眠
> 64GB 4GB(最小) 内存 + 2GB 大型服务器,交换主要应对内存峰值

性能优化建议

1. 交换分区位置优化

# 将交换分区放在快速磁盘上(SSD而非HDD)
# 使用性能较好的磁盘
sudo mkswap /dev/nvme0n1pX  # NVMe SSD
sudo mkswap /dev/sdaX       # SATA SSD
# 避免使用慢速磁盘或网络存储

2. 多个交换空间

# 创建多个交换空间以提高性能
sudo mkswap /dev/sdb1
sudo mkswap /dev/sdc1

# 启用时设置不同优先级(数字越大优先级越低)
sudo swapon -p 10 /dev/sdb1  # 高速SSD
sudo swapon -p 20 /dev/sdc1  # 低速HDD

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

3. 调整交换性(swappiness)

# 查看当前交换性(0-100,默认60)
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(几乎不使用交换)

4. 调整缓存压力(vfs_cache_pressure)

# 调整文件系统缓存回收倾向(默认100)
cat /proc/sys/vm/vfs_cache_pressure

# 降低值(如50)让系统更多保留目录和inode缓存
sudo sysctl vm.vfs_cache_pressure=50

# 永久设置
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf

交换空间管理

1. 查看交换空间信息

# 查看所有交换空间
swapon --show
swapon -s

# 查看详细信息
cat /proc/swaps

# 查看内存和交换使用情况
free -h
htop
top

2. 启用和禁用交换空间

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

# 启用交换文件
sudo swapon /swapfile

# 使用标签启用
sudo swapon -L "swap_label"

# 禁用交换空间
sudo swapoff /dev/sdb1
sudo swapoff /swapfile

# 禁用所有交换空间
sudo swapoff -a

3. 调整交换空间大小

# 对于交换文件,可以调整大小
# 1. 禁用交换文件
sudo swapoff /swapfile

# 2. 调整文件大小
sudo fallocate -l 8G /swapfile

# 3. 重新创建交换区
sudo mkswap /swapfile

# 4. 重新启用
sudo swapon /swapfile

4. 永久配置交换空间

# 编辑/etc/fstab添加交换空间配置
# 使用设备名
/dev/sdb1 none swap sw 0 0

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

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

# 使用交换文件
/swapfile none swap sw 0 0

常见问题解决

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

# 错误:mkswap: /dev/sdb1: Device or resource busy
# 解决方案:确保设备未挂载
sudo umount /dev/sdb1

# 如果已用作交换空间,先禁用
sudo swapoff /dev/sdb1

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

2. "权限被拒绝"错误

# 错误:mkswap: /swapfile: Permission denied
# 解决方案:
# 使用sudo
sudo mkswap /swapfile

# 或确保文件权限正确
sudo chmod 600 /swapfile
sudo chown root:root /swapfile

3. 交换空间无法启用

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

# 检查文件系统是否支持交换文件
# ext4, xfs, btrfs等主流文件系统都支持

# 检查是否有足够的磁盘空间
df -h /

4. 休眠(hibernate)失败

# 休眠需要交换空间 >= 内存大小
# 检查当前交换空间大小
swapon --show
free -h

# 如果交换空间不足,增加交换空间
# 或使用休眠专用交换文件
sudo mkswap /dev/sdb1
# 确保交换分区 >= 内存大小

高级话题

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 lvextend -L +4G /dev/vg_system/swap_lv
# sudo mkswap /dev/vg_system/swap_lv  # 重新初始化

3. 使用zram(压缩的内存交换)

# zram将部分内存作为压缩的交换设备
# 1. 加载zram模块
sudo modprobe zram

# 2. 配置zram设备大小
echo "4G" | sudo tee /sys/block/zram0/disksize

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

# 4. 启用交换空间
sudo swapon /dev/zram0 -p 100

# 5. 查看zram统计信息
cat /sys/block/zram0/mm_stat

重要注意事项

  • 数据丢失:mkswap会覆盖设备/文件上的所有数据
  • 设备确认:仔细确认设备名,避免格式化错误设备
  • 性能影响:频繁使用交换空间会显著降低系统性能
  • SSD寿命:在SSD上使用交换空间可能影响其寿命
  • 休眠支持:如需休眠功能,交换空间应≥内存大小
  • 安全性:交换空间可能包含敏感数据,考虑加密
  • 监控:定期监控交换空间使用情况

安装相关工具

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

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

# CentOS/RHEL
sudo yum install util-linux

# 安装其他相关工具
sudo apt-get install procps  # 包含free, top等命令
sudo apt-get install htop    # 更友好的进程查看器

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

相关命令

  • swapon - 启用交换空间
  • swapoff - 禁用交换空间
  • free - 显示内存和交换使用情况
  • fallocate - 快速创建大文件(用于交换文件)
  • dd - 创建交换文件(fallocate的替代)
  • fdisk/parted - 磁盘分区工具
  • sysctl - 调整内核参数(如swappiness)
  • cryptsetup - 加密交换空间
  • lvcreate/lvextend - LVM逻辑卷管理