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