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逻辑卷管理