centos7创建swap linux创建swap 创建swap

centos7创建swap   linux创建swap  创建swap  

 

创建一个 8GB 的 swap 文件。以下是完整的步骤:

 

=================================================================================

注意事项:

  1. 确保有足够的磁盘空间:8GB 文件需要至少 8GB 的可用空间

  2. 文件位置:通常放在 / 根目录下,也可以放在其他分区

  3. 性能考虑:

    • SSD 上使用 swap 文件性能较好

    • 机械硬盘上性能会差一些

  4. 内存充足时:如果物理内存充足(15G),可以设置较低的 swappiness(如10),减少 swap 使用

  5. 安全性:确保 /swapfile 权限为 600(只有 root 可读写)

 

 

 

创建 8GB Swap 文件的完整步骤:

步骤1:检查当前磁盘空间

# 查看磁盘空间
df -h

# 查看是否有现有的 swap
swapon --show
free -h


步骤2:创建 8GB 的 swap 文件

# 1. 创建 8GB 的空文件(使用 fallocate,速度更快)
fallocate -l 8G /swapfile

# 如果 fallocate 不支持,使用 dd:
# dd if=/dev/zero of=/swapfile bs=1M count=8192

# 2. 验证文件大小
ls -lh /swapfile
# 应该显示:-rw-r--r-- 1 root root 8.0G Dec 10 15:20 /swapfile


步骤3:设置正确的权限


# 只有 root 可读写,防止安全问题
chmod 600 /swapfile
ls -lh /swapfile
# 应该显示:-rw------- 1 root root 8.0G Dec 10 15:20 /swapfile


步骤4:设置为 swap 格式


# 格式化文件为 swap
mkswap /swapfile

# 输出示例:
# Setting up swapspace version 1, size = 8388604 KiB
# no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx


步骤5:启用 swap 文件


# 临时启用(重启后会失效)
swapon /swapfile

# 验证是否启用
swapon --show
free -h
# 现在应该能看到 8G 的 swap


步骤6:永久配置(添加到 fstab)

# 1. 备份 fstab
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d%H%M%S)

# 2. 添加 swap 配置到 /etc/fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 3. 验证 fstab
cat /etc/fstab
# 应该看到类似:
# UUID=19da9702-e4b3-4982-859f-691559f17007 /                       ext4    defaults        1 1
# /swapfile none swap sw 0 0




步骤7:优化 swap 设置(可选)

# 1. 调整 swappiness(控制使用 swap 的倾向,默认60)
# 值越低越少使用 swap,越高越多使用 swap
echo 'vm.swappiness=10' >> /etc/sysctl.conf

# 2. 调整 cache pressure(控制内存回收倾向)
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf

# 3. 立即生效
sysctl -p

# 4. 验证设置
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure



一键执行脚本:

创建一个脚本 create_swap.sh:


#!/bin/bash

echo "=== 开始创建 8GB Swap 文件 ==="

# 1. 检查当前状态
echo "1. 检查当前 swap 状态:"
free -h
echo ""

# 2. 检查磁盘空间
echo "2. 检查磁盘空间:"
df -h /
echo ""

# 3. 创建 swap 文件
echo "3. 创建 8GB swap 文件..."
if command -v fallocate &> /dev/null; then
    fallocate -l 8G /swapfile
else
    dd if=/dev/zero of=/swapfile bs=1M count=8192
fi

# 4. 设置权限
echo "4. 设置文件权限..."
chmod 600 /swapfile

# 5. 格式化为 swap
echo "5. 格式化为 swap..."
mkswap /swapfile

# 6. 启用 swap
echo "6. 启用 swap..."
swapon /swapfile

# 7. 添加到 fstab
echo "7. 添加到 /etc/fstab..."
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d%H%M%S)
echo '/swapfile none swap sw 0 0' >> /etc/fstab

# 8. 优化配置
echo "8. 优化 swap 配置..."
grep -q "vm.swappiness" /etc/sysctl.conf || echo 'vm.swappiness=10' >> /etc/sysctl.conf
grep -q "vm.vfs_cache_pressure" /etc/sysctl.conf || echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
sysctl -p

# 9. 验证结果
echo ""
echo "=== 创建完成 ==="
echo "最终状态:"
swapon --show
free -h

echo ""
echo "文件信息:"
ls -lh /swapfile

echo ""
echo "fstab 配置:"
tail -1 /etc/fstab

 

 

验证是否成功:
执行完成后,检查:

bash
# 查看 swap 状态
free -h
# 应该显示:Swap: 8.0G

# 查看详细的 swap 信息
swapon --show
# 应该显示:/swapfile file 8G 0B -2

# 检查是否开机自动加载
cat /etc/fstab | grep swap
# 应该显示:/swapfile none swap sw 0 0

# 测试重启后是否自动生效
# 可以重启系统后再次检查
🎯 推荐配置:
对于 15GB 内存的服务器:

swap 大小:8GB(内存的一半左右)

swappiness:10(内存充足,少用 swap)

vfs_cache_pressure:50(适中)

这样配置后,你的系统就有了 8GB 的 swap 空间,可以在内存不足时提供缓冲,提高系统稳定性。


 

 

 

 

1. 全面的Swap检测 ✅

  • 检测已启用的swap分区

  • 检测已存在的/swapfile文件

  • 检测fstab中的swap配置

2. 详细的删除指引 ✅

  • 完整的命令序列

  • 带有序号的操作步骤

  • 备份fstab的建议

  • 验证删除结果的方法

3. 友好的界面 ✅

  • 彩色输出(红/绿/黄/蓝)

  • 清晰的提示框

  • 直观的emoji符号

4. 更智能的配置 ✅

  • 动态调整swappiness值

  • 自动更新已存在的配置

  • 完整的验证输出

现在脚本更加安全和友好,能够有效防止误操作!

 

[root@ecs-2ef6-1f56 swap-create]# ./create_swap-v2.sh 12G
=== 开始创建 12.00GB (12288MB) Swap 文件 ===

========================================
检查系统现有Swap状态...
========================================
✓ 系统当前没有启用任何swap,可以继续执行

1. 检查系统信息:
   物理内存: 15.51GB (15884MB)
2. 校验大小参数...
3. 检查磁盘空间:
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       493G  5.7G  467G   2% /
✓ 根分区可用空间充足(477402 MB)

4. 创建 12.00GB swap 文件...
5. 设置文件权限...
6. 格式化为 swap...
Setting up swapspace version 1, size = 12582908 KiB
no label, UUID=cb2eed9b-083f-4199-9597-ae377c01fdb7
7. 启用 swap...
8. 添加到 /etc/fstab...
9. 优化 swap 配置...
vm.swappiness = 15
net.core.somaxconn = 1024
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
vm.vfs_cache_pressure = 50

=== 创建完成 ===
最终状态:
NAME      TYPE SIZE USED PRIO
/swapfile file  12G   0B   -2
              total        used        free      shared  buff/cache   available
Mem:            15G        2.9G         11G         13M        956M         12G
Swap:           11G          0B         11G

文件信息:
-rw------- 1 root root 12G Feb 12 19:38 /swapfile

fstab 配置:
#
UUID=fd97d138-685a-47a6-ab90-b4be5be5b96e /                       ext4    defaults        1 1
/swapfile none swap sw 0 0

swap优化参数:
vm.swappiness = 15
vm.vfs_cache_pressure = 50

✓ Swap创建成功!
提示:可以使用 'swapon --show''free -h' 随时查看swap状态
[root@ecs-2ef6-1f56 swap-create]# 

 

 

#!/bin/bash

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 显示使用帮助
show_help() {
    echo "用法: $0 [选项] <swap大小>"
    echo "选项:"
    echo "  -f, --force    强制模式:允许swap大于物理内存"
    echo "  -h, --help     显示帮助信息"
    echo ""
    echo "参数说明:"
    echo "  <swap大小>     支持单位: G, M, K (例如: 8G, 4096M, 4G)"
    echo ""
    echo "限制条件:"
    echo "  1. 大小必须 ≥ 2G (或2048M)"
    echo "  2. 大小必须是2的倍数 (2, 4, 8, 16, 32, 64...)"
    echo "  3. 默认不能超过物理内存大小"
    echo "  4. 使用 -f 参数可突破物理内存限制"
    echo ""
    echo "示例:"
    echo "  $0 8G          # 创建8GB swap"
    echo "  $0 4G          # 创建4GB swap"
    echo "  $0 -f 16G      # 强制创建16GB swap (即使物理内存小于16G)"
    exit 0
}

# 检查系统已存在的swap
check_existing_swap() {
    local has_swap=0
    local swap_list=""
    
    echo -e "${BLUE}========================================${NC}"
    echo -e "${YELLOW}检查系统现有Swap状态...${NC}"
    echo -e "${BLUE}========================================${NC}"
    
    # 检查是否启用了任何swap
    if swapon --show 2>/dev/null | grep -q .; then
        has_swap=1
        echo -e "${RED}检测到系统中已存在启用的swap分区:${NC}"
        echo ""
        swapon --show
        echo ""
    fi
    
    # 检查是否存在swap文件
    if [ -f "/swapfile" ]; then
        has_swap=1
        echo -e "${RED}检测到/swapfile文件已存在:${NC}"
        ls -lh /swapfile
        echo ""
    fi
    
    # 检查fstab中是否有swap配置
    if grep -q "swap" /etc/fstab 2>/dev/null; then
        local swap_fstab=$(grep "swap" /etc/fstab | grep -v "^#")
        if [ -n "$swap_fstab" ]; then
            has_swap=1
            echo -e "${RED}检测到/etc/fstab中存在swap配置:${NC}"
            echo "$swap_fstab"
            echo ""
        fi
    fi
    
    # 如果有任何swap存在,给出详细的删除指引
    if [ $has_swap -eq 1 ]; then
        echo -e "${RED}╔════════════════════════════════════════════════════════════╗${NC}"
        echo -e "${RED}║                      错误:系统已存在Swap                  ║${NC}"
        echo -e "${RED}║      请先删除现有Swap配置后再执行本脚本!                  ║${NC}"
        echo -e "${RED}╚════════════════════════════════════════════════════════════╝${NC}"
        echo ""
        
        # 获取当前swap信息
        local current_swap_size=""
        if swapon --show 2>/dev/null | grep -q "/swapfile"; then
            current_swap_size=$(swapon --show | awk '/\/swapfile/ {print $3}')
        elif [ -f "/swapfile" ]; then
            current_swap_size=$(ls -lh /swapfile | awk '{print $5}')
        fi
        
        echo -e "${YELLOW}【删除现有Swap的完整操作指南】${NC}"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo ""
        
        if [ -n "$current_swap_size" ]; then
            echo -e "当前Swap大小: ${RED}$current_swap_size${NC}"
            echo ""
        fi
        
        echo -e "${GREEN}请按顺序执行以下命令:${NC}"
        echo ""
        
        # 1. 关闭swap
        echo "1️⃣  关闭所有swap分区:"
        echo "   sudo swapoff -a"
        echo ""
        
        # 2. 从fstab中删除所有swap条目
        echo "2️⃣  从/etc/fstab中删除所有swap相关配置:"
        echo "   # 备份fstab"
        echo "   sudo cp /etc/fstab /etc/fstab.backup.\$(date +%Y%m%d%H%M%S)"
        echo "   # 删除swapfile条目"
        echo "   sudo sed -i '/\\/swapfile/d' /etc/fstab"
        echo "   # 删除其他swap分区条目"
        echo "   sudo sed -i '/swap/d' /etc/fstab"
        echo ""
        
        # 3. 删除swap文件
        if [ -f "/swapfile" ]; then
            echo "3️⃣  删除swap文件:"
            echo "   sudo rm -f /swapfile"
            echo ""
        fi
        
        # 4. 验证删除结果
        echo "4️⃣  验证删除结果:"
        echo "   free -h"
        echo "   swapon --show"
        echo "   grep swap /etc/fstab"
        echo ""
        
        # 5. 如果需要删除其他位置的swap文件
        echo "5️⃣  (可选)如果还有其他位置的swap文件,请手动删除:"
        echo "   # 查找所有swap文件"
        echo "   sudo find / -name \"*swap*\" -type f 2>/dev/null | grep -v \"^/proc\\|^/sys\\|^/dev\""
        echo ""
        
        echo -e "${YELLOW}⚠️  注意:删除swap前请确保有足够的内存可用${NC}"
        echo -e "${YELLOW}   执行 swapoff 可能需要一些时间来将swap中的数据移回内存${NC}"
        echo ""
        
        exit 1
    else
        echo -e "${GREEN}✓ 系统当前没有启用任何swap,可以继续执行${NC}"
        echo ""
    fi
}

# 初始化参数
FORCE_MODE=0
SWAP_SIZE=""

# 解析参数
while [[ $# -gt 0 ]]; do
    case $1 in
        -f|--force)
            FORCE_MODE=1
            shift
            ;;
        -h|--help)
            show_help
            ;;
        *)
            SWAP_SIZE=$1
            shift
            ;;
    esac
done

# 检查是否提供了大小参数
if [ -z "$SWAP_SIZE" ]; then
    echo "错误: 请指定swap大小"
    show_help
fi

# 转换大小为MB
SWAP_SIZE_MB=$(echo "$SWAP_SIZE" | sed -E 's/([0-9.]+)([GgMmKk])?/\1/')
UNIT=$(echo "$SWAP_SIZE" | sed -E 's/[0-9.]+([GgMmKk])?/\1/' | tr '[:lower:]' '[:upper:]')

case $UNIT in
    G|GB|GIB|"")
        SWAP_SIZE_MB=$(echo "$SWAP_SIZE_MB * 1024" | bc)
        ;;
    M|MB|MIB)
        # 已经是MB,不需要转换
        ;;
    K|KB|KIB)
        SWAP_SIZE_MB=$(echo "$SWAP_SIZE_MB / 1024" | bc)
        ;;
    *)
        echo "错误: 无法识别的单位 '$UNIT',支持 G, M, K"
        exit 1
esac

# 转为整数
SWAP_SIZE_MB=${SWAP_SIZE_MB%.*}
SWAP_SIZE_GB=$(echo "scale=2; $SWAP_SIZE_MB / 1024" | bc)

echo "=== 开始创建 ${SWAP_SIZE_GB}GB (${SWAP_SIZE_MB}MB) Swap 文件 ==="
echo ""

# 0. 首先检查系统是否已存在swap
check_existing_swap

# 1. 检查物理内存
echo "1. 检查系统信息:"
PHYSICAL_MEM_MB=$(free -m | awk '/^Mem:/ {print $2}')
PHYSICAL_MEM_GB=$(echo "scale=2; $PHYSICAL_MEM_MB / 1024" | bc)
echo "   物理内存: ${PHYSICAL_MEM_GB}GB (${PHYSICAL_MEM_MB}MB)"

# 2. 校验大小限制
echo "2. 校验大小参数..."

# 检查是否小于2GB
if [ $(echo "$SWAP_SIZE_MB < 2048" | bc) -eq 1 ]; then
    echo "错误: Swap大小不能小于2GB (2048MB)"
    exit 1
fi

# 检查是否是2的倍数
if [ $(echo "$SWAP_SIZE_GB % 2" | bc) -ne 0 ] && [ $(echo "$SWAP_SIZE_GB > 0" | bc) -eq 1 ]; then
    echo "错误: Swap大小必须是2的倍数 (2, 4, 8, 16, 32, 64...)"
    exit 1
fi

# 检查是否超过物理内存(非强制模式)
if [ $FORCE_MODE -eq 0 ]; then
    if [ $(echo "$SWAP_SIZE_MB > $PHYSICAL_MEM_MB" | bc) -eq 1 ]; then
        echo "错误: Swap大小 (${SWAP_SIZE_GB}GB) 不能大于物理内存 (${PHYSICAL_MEM_GB}GB)"
        echo "如需强制创建,请使用 -f 参数"
        exit 1
    fi
else
    echo "   强制模式: 允许swap大于物理内存"
fi

# 3. 检查磁盘空间
echo "3. 检查磁盘空间:"
df -h /
ROOT_AVAIL=$(df -BM / | awk 'NR==2 {gsub(/M/,""); print $4}')
REQUIRED_SPACE=$((SWAP_SIZE_MB + 4096))  # 额外预留4GB空间
if [ "$ROOT_AVAIL" -lt "$REQUIRED_SPACE" ]; then
    echo "错误:根分区可用空间不足,无法创建Swap文件!"
    echo "可用空间: $ROOT_AVAIL MB"
    echo "需要空间: $REQUIRED_SPACE MB (swap ${SWAP_SIZE_MB}MB + 预留4096MB)"
    exit 1
fi
echo "✓ 根分区可用空间充足($ROOT_AVAIL MB)"
echo ""

# 4. 创建 swap 文件
echo "4. 创建 ${SWAP_SIZE_GB}GB swap 文件..."
if command -v fallocate &> /dev/null; then
    fallocate -l ${SWAP_SIZE_MB}M /swapfile
else
    dd if=/dev/zero of=/swapfile bs=1M count=$SWAP_SIZE_MB status=progress
fi

# 5. 设置权限
echo "5. 设置文件权限..."
chmod 600 /swapfile

# 6. 格式化为 swap
echo "6. 格式化为 swap..."
mkswap /swapfile

# 7. 启用 swap
echo "7. 启用 swap..."
swapon /swapfile

# 8. 添加到 fstab
echo "8. 添加到 /etc/fstab..."
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d%H%M%S)
if ! grep -q "/swapfile none swap sw 0 0" /etc/fstab; then
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
else
    echo "✓ /swapfile 已存在于fstab中,无需重复添加"
fi

# 9. 优化配置(根据swap大小动态调整)
echo "9. 优化 swap 配置..."
# swappiness: 越小越倾向使用物理内存
if [ $(echo "$SWAP_SIZE_GB <= 4" | bc) -eq 1 ]; then
    SWAPPINESS=30
elif [ $(echo "$SWAP_SIZE_GB <= 8" | bc) -eq 1 ]; then
    SWAPPINESS=20
elif [ $(echo "$SWAP_SIZE_GB <= 16" | bc) -eq 1 ]; then
    SWAPPINESS=15
else
    SWAPPINESS=10
fi

# 更新或添加swappiness配置
if grep -q "^vm.swappiness" /etc/sysctl.conf; then
    sed -i "s/^vm.swappiness=.*/vm.swappiness=$SWAPPINESS/" /etc/sysctl.conf
else
    echo "vm.swappiness=$SWAPPINESS" >> /etc/sysctl.conf
fi

# 更新或添加vfs_cache_pressure配置
if grep -q "^vm.vfs_cache_pressure" /etc/sysctl.conf; then
    sed -i "s/^vm.vfs_cache_pressure=.*/vm.vfs_cache_pressure=50/" /etc/sysctl.conf
else
    echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
fi

sysctl -p

# 10. 验证结果
echo ""
echo "=== 创建完成 ==="
echo "最终状态:"
swapon --show
free -h

echo ""
echo "文件信息:"
ls -lh /swapfile

echo ""
echo "fstab 配置:"
tail -3 /etc/fstab | grep -B2 swap

echo ""
echo "swap优化参数:"
sysctl vm.swappiness vm.vfs_cache_pressure

echo ""
echo -e "${GREEN}✓ Swap创建成功!${NC}"
echo -e "${YELLOW}提示:可以使用 'swapon --show' 和 'free -h' 随时查看swap状态${NC}"

 

posted @ 2025-12-11 08:58  闻道者  阅读(13)  评论(0)    收藏  举报