This commit is contained in:
2026-04-13 23:31:42 +03:00
parent f94c91ab47
commit 52b65c88ad

88
bash/smart_swap.sh Normal file
View File

@@ -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