From 52b65c88ad502a1b8041bbdad47a591eb0aafdc7 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 13 Apr 2026 23:31:42 +0300 Subject: [PATCH] add swap --- bash/smart_swap.sh | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 bash/smart_swap.sh diff --git a/bash/smart_swap.sh b/bash/smart_swap.sh new file mode 100644 index 0000000..6dd00e5 --- /dev/null +++ b/bash/smart_swap.sh @@ -0,0 +1,88 @@ +#!/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) Изменить размер (старый будет удален, создан новый с указанным весом)" + read -p "Ваш выбор [1-3]: " ACTION + + 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 + +read -p "Введите желаемый размер swap в ГБ [по умолчанию: ${DEFAULT_SWAP}GB]: " USER_SWAP +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 + sysctl -p +fi + +echo "------------------------------------------------" +echo "Файл подкачки успешно настроен!" +free -h \ No newline at end of file