mirror of
https://github.com/yyhuni/xingrin.git
synced 2026-01-31 11:46:16 +08:00
98 lines
2.7 KiB
Bash
Executable File
98 lines
2.7 KiB
Bash
Executable File
#!/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
|