Files
server-tools/bash/smart_swap.sh

92 lines
3.5 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# --- 1. Проверка прав root ---
if [ "$EUID" -ne 0 ]; then
echo "Ошибка: Пожалуйста, запустите скрипт через sudo."
exit 1
fi
SWAP_PATH="/swapfile"
# --- 2. Функция для расчета оптимального размера ---
calculate_default() {
TOTAL_RAM=$(free -g | awk '/^Mem:/{print $2}')
if [ "$TOTAL_RAM" -le 2 ]; then
echo $((TOTAL_RAM * 2))
elif [ "$TOTAL_RAM" -le 8 ]; then
echo $TOTAL_RAM
else
echo 4
fi
}
# --- 3. Проверка существующего Swap ---
if [ -f "$SWAP_PATH" ]; then
echo "------------------------------------------------"
echo "Обнаружен существующий файл подкачки: $SWAP_PATH"
swapon --show | grep "$SWAP_PATH"
echo "------------------------------------------------"
echo "Выберите действие:"
echo "1) Выйти (ничего не менять)"
echo "2) Перезаписать (удалить старый и создать новый)"
echo "3) Изменить размер (старый будет удален, создан новый с указанным весом)"
# ВАЖНО: Читаем напрямую с клавиатуры (tty), чтобы избежать перехвата из curl
read -p "Ваш выбор [1-3]: " ACTION < /dev/tty
case $ACTION in
2|3)
echo "Отключаю и удаляю старый swap..."
swapoff $SWAP_PATH 2>/dev/null
rm -f $SWAP_PATH
sed -i "\|^$SWAP_PATH|d" /etc/fstab
;;
*)
echo "Выход из скрипта."
exit 0
;;
esac
fi
# --- 4. Определение размера ---
DEFAULT_SWAP=$(calculate_default)
[ "$DEFAULT_SWAP" -eq 0 ] && DEFAULT_SWAP=1
# ВАЖНО: Читаем напрямую с клавиатуры (tty)
read -p "Введите желаемый размер swap в ГБ [по умолчанию: ${DEFAULT_SWAP}GB]: " USER_SWAP < /dev/tty
FINAL_SIZE=${USER_SWAP:-$DEFAULT_SWAP}
# --- 5. Проверка свободного места на диске ---
FREE_DISK_GB=$(df -BG / | awk 'NR==2 {print $4}' | sed 's/G//')
if [ "$FINAL_SIZE" -ge "$FREE_DISK_GB" ]; then
echo "Ошибка: Недостаточно места! Свободно: ${FREE_DISK_GB}GB, требуется: ${FINAL_SIZE}GB."
exit 1
fi
# --- 6. Создание Swap-файла ---
echo "Создаю файл подкачки размером ${FINAL_SIZE}GB..."
# Попытка быстрого выделения места, если не выйдет - через dd
fallocate -l "${FINAL_SIZE}G" $SWAP_PATH || dd if=/dev/zero of=$SWAP_PATH bs=1G count=$FINAL_SIZE
chmod 600 $SWAP_PATH
mkswap $SWAP_PATH
swapon $SWAP_PATH
# --- 7. Настройка автозагрузки ---
if ! grep -q "$SWAP_PATH" /etc/fstab; then
echo "$SWAP_PATH none swap sw 0 0" >> /etc/fstab
echo "Запись добавлена в /etc/fstab."
fi
# --- 8. Оптимизация (Swappiness) ---
if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
echo "vm.swappiness=10" >> /etc/sysctl.conf
# Применяем настройку напрямую, чтобы не выводить в консоль другие твои настройки (BBR и т.д.)
sysctl -w vm.swappiness=10 >/dev/null
fi
echo "------------------------------------------------"
echo "Файл подкачки успешно настроен!"
free -h