Administrator
发布于 2025-12-25 / 12 阅读
0
0

Linux Swap 自定义设置工具

  1. 菜单化操作:新增主菜单,支持选择「创建 Swap」或「删除 Swap」

  2. 独立删除 Swap 功能

    • 自动检测并停止正在运行的 Swap

    • 删除 /swapfile 交换文件

    • 清理 /etc/fstab 中的 Swap 开机自启配置

    • 操作完成后显示当前系统状态,确认删除结果

  3. 安全确认:删除操作增加二次确认(标注「不可恢复」),防止误操作

  4. 状态检测:删除前检测是否存在 Swap 文件 / 配置,无相关内容时给出友好提示

  5. 脚本特点:

    1. 权限检查:确保以 root 权限运行

    2. 友好交互:彩色输出、清晰的提示信息

    3. 输入校验:支持 MB/GB 单位,验证输入有效性(最小 100MB)

    4. 安全处理:先停止并清理旧的 Swap,再创建新的

    5. 开机生效:自动写入 /etc/fstab

    6. 兼容性强:优先使用 fallocate,兼容 dd 命令

    7. 状态反馈:操作完成后显示新的 Swap 状态

使用方法:

  1. 保存脚本为 manage_swap.sh

  2. 添加执行权限:chmod +x manage_swap.sh

  3. 运行脚本:sudo ./manage_swap.sh

  4. 根据菜单选择操作:

    • 1:创建自定义大小的 Swap(保留原有功能)

    • 2:彻底删除所有 Swap(文件 + 配置)

    • 3:退出脚本

关键注意事项:

  • 删除 Swap 后,系统将不再有交换空间,若物理内存不足可能导致程序崩溃

  • 脚本仅处理 /swapfile 类型的 Swap 文件,若你的系统使用 Swap 分区(如 /dev/sda2),需手动处理

  • 删除操作完成后,可通过 free -hswapon --show 验证 Swap 是否完全清除

  • 创建 / 删除操作均会修改 /etc/fstab,确保开机配置同步更新

#!/bin/bash

# 定义颜色常量(增强交互体验)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 重置颜色

# 检查是否为 root 用户
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误:必须以 root 权限运行此脚本!${NC}"
        exit 1
    fi
}

# 检查当前 Swap 状态
check_current_swap() {
    echo -e "${BLUE}===== 当前 Swap 信息 =====${NC}"
    swapon --show
    if [ $? -ne 0 ]; then
        echo -e "${YELLOW}当前系统未配置 Swap${NC}"
    fi
    echo -e "\n${BLUE}===== 内存和 Swap 总览 =====${NC}"
    free -h
    echo ""
}

# 获取有效的 Swap 大小输入
get_swap_size() {
    while true; do
        read -p "请输入要设置的 Swap 大小(单位:MB/GB,例如:2048MB 或 2GB):" SWAP_SIZE
        
        # 校验输入格式
        if [[ $SWAP_SIZE =~ ^[0-9]+(MB|GB)$ ]]; then
            # 提取数字和单位
            SIZE_NUM=$(echo $SWAP_SIZE | sed 's/[A-Za-z]*//g')
            SIZE_UNIT=$(echo $SWAP_SIZE | sed 's/[0-9]*//g' | tr '[:lower:]' '[:upper:]')
            
            # 转换为 MB 便于计算
            if [ "$SIZE_UNIT" = "GB" ]; then
                SWAP_SIZE_MB=$((SIZE_NUM * 1024))
            else
                SWAP_SIZE_MB=$SIZE_NUM
            fi
            
            # 检查最小值(至少 100MB)
            if [ $SWAP_SIZE_MB -lt 100 ]; then
                echo -e "${YELLOW}警告:Swap 大小建议不小于 100MB,请重新输入!${NC}"
                continue
            fi
            break
        else
            echo -e "${RED}错误:输入格式无效!请按照示例格式输入(如:2048MB 或 2GB)${NC}"
        fi
    done
}

# 停止并删除现有 Swap(独立功能)
delete_swap() {
    echo -e "${BLUE}===== 开始删除 Swap =====${NC}"
    
    # 检查是否有启用的 Swap
    if swapon --show | grep -q "swapfile"; then
        echo -e "${BLUE}正在停止 Swap...${NC}"
        swapoff -a
        echo -e "${GREEN}已停止所有 Swap${NC}"
    else
        echo -e "${YELLOW}未检测到正在运行的 Swap${NC}"
    fi
    
    # 删除 swap 文件
    if [ -f "/swapfile" ]; then
        rm -f /swapfile
        echo -e "${GREEN}已删除 /swapfile 文件${NC}"
    else
        echo -e "${YELLOW}未找到 /swapfile 文件${NC}"
    fi
    
    # 从 fstab 中移除 swap 配置
    if grep -q "swapfile" /etc/fstab; then
        sed -i '/swapfile/d' /etc/fstab
        echo -e "${GREEN}已清理 /etc/fstab 中的 Swap 配置${NC}"
    else
        echo -e "${YELLOW}/etc/fstab 中无 Swap 相关配置${NC}"
    fi
    
    echo -e "\n${GREEN}===== Swap 删除完成 =====${NC}"
    check_current_swap
}

# 创建新的 Swap
create_new_swap() {
    echo -e "${BLUE}===== 开始创建新 Swap =====${NC}"
    
    # 先清理旧的 Swap
    delete_swap
    
    # 创建 swap 文件(fallocate 优先,失败则用 dd)
    echo -e "${BLUE}正在创建 ${SWAP_SIZE} 的 Swap 文件...${NC}"
    if command -v fallocate &> /dev/null; then
        fallocate -l $SWAP_SIZE /swapfile
    else
        dd if=/dev/zero of=/swapfile bs=1M count=$SWAP_SIZE_MB
    fi
    
    # 设置正确的权限
    chmod 600 /swapfile
    mkswap /swapfile
    
    # 启用新 swap
    swapon /swapfile
    
    # 写入 fstab 确保开机生效
    echo "/swapfile none swap defaults 0 0" >> /etc/fstab
    
    echo -e "${GREEN}===== Swap 创建完成 =====${NC}"
    echo -e "新的 Swap 大小:${SWAP_SIZE}"
    echo -e "当前 Swap 状态:"
    swapon --show
    free -h | grep -E "Swap|交换"
}

# 显示主菜单
show_menu() {
    clear
    echo -e "${BLUE}=============================${NC}"
    echo -e "${BLUE}      Linux Swap 管理工具    ${NC}"
    echo -e "${BLUE}=============================${NC}"
    echo ""
    check_current_swap
    echo -e "${YELLOW}请选择操作:${NC}"
    echo "1. 创建自定义大小的 Swap"
    echo "2. 彻底删除所有 Swap(文件+配置)"
    echo "3. 退出"
    echo ""
    read -p "请输入选项 [1-3]:" CHOICE
}

# 主流程
main() {
    # 权限检查
    check_root
    
    while true; do
        show_menu
        case $CHOICE in
            1)
                # 确认创建
                read -p "是否确认创建新的 Swap?(y/N):" CONFIRM
                if [[ $CONFIRM =~ ^[Yy]$ ]]; then
                    get_swap_size
                    create_new_swap
                else
                    echo -e "${YELLOW}创建操作已取消${NC}"
                fi
                ;;
            2)
                # 确认删除
                read -p "是否确认删除所有 Swap?此操作不可恢复!(y/N):" CONFIRM
                if [[ $CONFIRM =~ ^[Yy]$ ]]; then
                    delete_swap
                else
                    echo -e "${YELLOW}删除操作已取消${NC}"
                fi
                ;;
            3)
                echo -e "${GREEN}感谢使用,再见!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}错误:无效的选项,请输入 1-3 之间的数字!${NC}"
                ;;
        esac
        
        # 操作完成后等待用户确认
        echo ""
        read -p "按任意键返回菜单..."
    done
}

# 启动主流程
main


评论