add swap
This commit is contained in:
88
bash/smart_swap.sh
Normal file
88
bash/smart_swap.sh
Normal 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
|
||||
Reference in New Issue
Block a user