#!/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