2025-12-19 12:30:02 +08:00
|
|
|
|
#!/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
|
|
|
|
|
|
|
|
|
|
|
|
# 检查是否已有交换分区
|
2025-12-19 12:33:48 +08:00
|
|
|
|
CURRENT_SWAP_KB=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
|
2025-12-19 19:02:43 +08:00
|
|
|
|
CURRENT_SWAP_GB=$(awk "BEGIN {printf \"%.0f\", $CURRENT_SWAP_KB / 1024 / 1024}")
|
2025-12-19 12:33:48 +08:00
|
|
|
|
if [ "$CURRENT_SWAP_GB" -gt 0 ]; then
|
2025-12-19 12:30:02 +08:00
|
|
|
|
log_warn "系统已有 ${CURRENT_SWAP_GB}GB 交换分区"
|
|
|
|
|
|
swapon --show
|
|
|
|
|
|
read -p "是否继续添加新的交换分区?(y/N) " -r
|
|
|
|
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
|
|
|
|
log_info "已取消"
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-12-19 19:02:43 +08:00
|
|
|
|
# 获取系统内存大小(GB,四舍五入)
|
2025-12-19 12:30:02 +08:00
|
|
|
|
TOTAL_MEM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
|
2025-12-19 19:02:43 +08:00
|
|
|
|
TOTAL_MEM_GB=$(awk "BEGIN {printf \"%.0f\", $TOTAL_MEM_KB / 1024 / 1024}")
|
2025-12-19 12:30:02 +08:00
|
|
|
|
|
|
|
|
|
|
# 确定交换分区大小
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
2025-12-19 19:02:43 +08:00
|
|
|
|
# 检查磁盘空间(向下取整,保守估计)
|
|
|
|
|
|
AVAILABLE_GB=$(df / | tail -1 | awk '{printf "%.0f", $4/1024/1024}')
|
2025-12-19 12:30:02 +08:00
|
|
|
|
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
|