#!/bin/bash
#
# Ubuntu/Debian 一键开启交换分区脚本
# 用法: sudo ./setup-swap.sh [大小GB]
# 示例: sudo ./setup-swap.sh 4  # 创建 4GB 交换分区
#       sudo ./setup-swap.sh     # 默认创建与内存相同大小的交换分区
#

set -e

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

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
    log_error "请使用 sudo 运行此脚本"
    exit 1
fi

# 检查是否已有交换分区
CURRENT_SWAP_KB=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
CURRENT_SWAP_GB=$(awk "BEGIN {printf \"%.0f\", $CURRENT_SWAP_KB / 1024 / 1024}")
if [ "$CURRENT_SWAP_GB" -gt 0 ]; then
    log_warn "系统已有 ${CURRENT_SWAP_GB}GB 交换分区"
    swapon --show
    read -p "是否继续添加新的交换分区？(y/N) " -r
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "已取消"
        exit 0
    fi
fi

# 获取系统内存大小（GB，四舍五入）
TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
TOTAL_MEM_GB=$(awk "BEGIN {printf \"%.0f\", $TOTAL_MEM_KB / 1024 / 1024}")

# 确定交换分区大小
if [ -n "$1" ]; then
    SWAP_SIZE_GB=$1
else
    # 默认与内存相同，最小 1GB，最大 8GB
    SWAP_SIZE_GB=$TOTAL_MEM_GB
    [ "$SWAP_SIZE_GB" -lt 1 ] && SWAP_SIZE_GB=1
    [ "$SWAP_SIZE_GB" -gt 8 ] && SWAP_SIZE_GB=8
fi

SWAP_FILE="/swapfile_xingrin"

log_info "系统内存: ${TOTAL_MEM_GB}GB"
log_info "将创建 ${SWAP_SIZE_GB}GB 交换分区: $SWAP_FILE"

# 检查磁盘空间（向下取整，保守估计）
AVAILABLE_GB=$(df / | tail -1 | awk '{printf "%.0f", $4/1024/1024}')
if [ "$AVAILABLE_GB" -lt "$SWAP_SIZE_GB" ]; then
    log_error "磁盘空间不足！可用: ${AVAILABLE_GB}GB，需要: ${SWAP_SIZE_GB}GB"
    exit 1
fi

# 创建交换文件
log_info "正在创建交换文件（可能需要几分钟）..."
dd if=/dev/zero of=$SWAP_FILE bs=1G count=$SWAP_SIZE_GB status=progress

# 设置权限
chmod 600 $SWAP_FILE

# 格式化为交换分区
mkswap $SWAP_FILE

# 启用交换分区
swapon $SWAP_FILE

# 添加到 fstab（开机自动挂载）
if ! grep -q "$SWAP_FILE" /etc/fstab; then
    echo "$SWAP_FILE none swap sw 0 0" >> /etc/fstab
    log_info "已添加到 /etc/fstab，开机自动启用"
fi

# 优化 swappiness（降低交换倾向，优先使用内存）
SWAPPINESS=10
if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
    echo "vm.swappiness=$SWAPPINESS" >> /etc/sysctl.conf
fi
sysctl vm.swappiness=$SWAPPINESS >/dev/null

log_info "交换分区创建成功！"
echo ""
echo "当前交换分区状态:"
swapon --show
echo ""
free -h
