侧边栏壁纸
博主头像
龍騰博客 博主等级

行动起来,活在当下

  • 累计撰写 130 篇文章
  • 累计创建 31 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Swap 一键管理脚本

管理员
2026-05-21 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
#!/bin/bash

# 确保脚本以 root 权限运行
if [ "$EUID" -ne 0 ]; then
    echo "❌ 错误: 请使用 root 权限或 sudo 运行此脚本!"
    exit 1
fi

SWAP_FILE="/swapfile"
FSTAB_ENTRY="$SWAP_FILE none swap sw 0 0"

# 获取当前内存和 Swap 状态
show_status() {
    echo "========================================"
    echo "       当前系统内存与 Swap 状态"
    echo "========================================"
    free -h
    echo "========================================"
}

# 1. 安装/创建 Swap
install_swap() {
    if [ -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 检测到已经存在 $SWAP_FILE。"
        echo "如果你想改变大小,请在主菜单选择 [3] 调整大小。"
        return
    fi

    read -p "请输入你想创建的 Swap 大小 (例如: 2G, 4G): " swap_size
    # 转换为大写并去掉最后的 G
    swap_size=$(echo "$swap_size" | tr 'a-z' 'A-Z' | sed 's/G//g')

    if [[ ! "$swap_size" =~ ^[0-9]+$ ]]; then
        echo "❌ 错误: 输入格式不正确,请输入类似 '2G' 或 '4G' 的数字。"
        return
    fi

    echo "⏳ 正在分配 ${swap_size}G 空间,请稍候..."
    fallocate -l "${swap_size}G" $SWAP_FILE 2>/dev/null
    if [ $? -ne 0 ]; then
        # 如果 fallocate 失败,则使用 dd
        dd if=/dev/zero of=$SWAP_FILE bs=1M count=$((swap_size * 1024))
    fi

    echo "🔒 正在锁定文件权限 (chmod 600)..."
    chmod 600 $SWAP_FILE

    echo "⚙️ 正在格式化为 Swap..."
    mkswap $SWAP_FILE

    echo "🚀 正在激活 Swap..."
    swapon $SWAP_FILE

    # 写入开机自启
    if ! grep -q "$SWAP_FILE" /etc/fstab; then
        echo "$FSTAB_ENTRY" >> /etc/fstab
    fi

    # 优化 swappiness
    sysctl vm.swappiness=10
    if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
        echo "vm.swappiness=10" >> /etc/sysctl.conf
    else
        sed -i 's/vm.swappiness.*/vm.swappiness=10/g' /etc/sysctl.conf
    fi

    echo "✅ 恭喜!${swap_size}G Swap 安装并配置成功,swappiness 已优化为 10!"
}

# 2. 卸载 Swap
uninstall_swap() {
    if [ ! -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 系统中未找到 $SWAP_FILE,无需卸载。"
        return
    fi

    echo "⏳ 正在停用 Swap(这可能需要一点时间,系统正在将数据搬回物理内存)..."
    swapoff $SWAP_FILE
    
    echo "🧹 正在删除 Swap 文件..."
    rm -f $SWAP_FILE

    echo "📝 正在清理 /etc/fstab 开机挂载配置..."
    sed -i "\|\#\? *${SWAP_FILE} *|d" /etc/fstab

    echo "✅ Swap 卸载干净了!"
}

# 3. 调整 Swap 大小
resize_swap() {
    if [ ! -f "$SWAP_FILE" ]; then
        echo "⚠️ 提示: 当前未安装 Swap,将直接进入安装流程。"
        install_swap
        return
    fi

    echo "🔄 正在为您调整 Swap 大小..."
    echo "💡 提示:调整大小会先安全停用旧的 Swap,然后创建新的。"
    uninstall_swap
    echo "----------------------------------------"
    install_swap
}

# 主循环菜单
while true; do
    clear
    show_status
    echo "欢迎使用 Ubuntu Swap 一键管理脚本"
    echo "[1] 安装/创建 Swap"
    echo "[2] 完全卸载 Swap"
    echo "[3] 调整 Swap 大小"
    echo "[4] 退出脚本"
    echo "----------------------------------------"
    read -p "请输入数字选择功能 [1-4]: " choice

    case $choice in
        1)
            install_swap
            read -p "按回车键继续..." dummy
            ;;
        2)
            uninstall_swap
            read -p "按回车键继续..." dummy
            ;;
        3)
            resize_swap
            read -p "按回车键继续..." dummy
            ;;
        4)
            echo "👋 再见!"
            exit 0
            ;;
        *)
            echo "❌ 无效输入,请输入 1 到 4 之间的数字。"
            sleep 1
            ;;
    esac
done

🚀 如何在你的阿里云 VPS 上使用它?

你只需要把上面这段代码丢进你的 Ubuntu 终端:

  1. 新建文件

    nano swap_manager.sh
    

    (把上面的脚本内容复制进去,按 Ctrl+O 保存,Ctrl+X 退出)

  2. 赋予执行权限

    chmod +x swap_manager.sh
    
  3. 运行脚本(因为涉及虚拟内存调整,必须加 sudo):

   sudo ./swap_manager.sh

💡 脚本亮点说明:

  • 容错处理:在分配空间时,优先使用速度极快的 fallocate(瞬间完成),如果系统内核或文件系统不支持,脚本会自动无缝切换到兼容性最好的 dd 命令,确保在各种 Ubuntu 版本上都能成功。

  • 干净的卸载:很多人卸载 Swap 只是删了文件,忘了删 /etc/fstab,导致下次开机直接系统报错甚至进不去系统。这个脚本使用 sed 做了精准的行匹配删除,非常安全。

0

评论区