92 lines
3.5 KiB
Bash
92 lines
3.5 KiB
Bash
#!/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 |