#!/bin/bash set -e # ============================================================ # Оптимізація пам'яті Linux # zRAM + Swapfile 8 ГБ # Debian / Ubuntu # ============================================================ SWAPFILE="/swapfile" SWAP_SIZE="8G" ZRAM_CONFIG="/etc/systemd/zram-generator.conf" SYSCTL_CONFIG="/etc/sysctl.d/99-zram-mem.conf" echo "============================================================" echo " Налаштування zRAM + Swapfile" echo "============================================================" # ------------------------------------------------------------ # 0. Перевірка root # ------------------------------------------------------------ if [ "$EUID" -ne 0 ]; then echo "Помилка: скрипт потрібно запускати через sudo." echo echo "Приклад:" echo "sudo $0" exit 1 fi # ------------------------------------------------------------ # 1. Визначення файлової системи # ------------------------------------------------------------ echo echo "=== 1. Перевірка файлової системи ===" ROOT_FS=$(findmnt -n -o FSTYPE /) echo "Файлова система /: $ROOT_FS" case "$ROOT_FS" in btrfs) echo echo "УВАГА: коренева файлова система Btrfs." echo "Для swapfile потрібні спеціальні налаштування Btrfs." echo "Цей скрипт не буде автоматично створювати swapfile," echo "щоб не пошкодити систему." echo echo "Вихід." exit 1 ;; zfs) echo echo "УВАГА: коренева файлова система ZFS." echo "Звичайний /swapfile для ZFS не рекомендується." echo echo "Вихід." exit 1 ;; esac # ------------------------------------------------------------ # 2. Створення Swapfile # ------------------------------------------------------------ echo echo "=== 2. Swapfile 8 ГБ ===" if [ -e "$SWAPFILE" ]; then echo "$SWAPFILE вже існує." # Перевіряємо, чи це справді swap if file "$SWAPFILE" | grep -qi "swap"; then echo "Файл розпізнано як swap." else echo echo "ПОМИЛКА:" echo "$SWAPFILE існує, але не розпізнаний як swap-файл." echo echo "Щоб не видалити потенційно важливий файл," echo "скрипт зупинено." exit 1 fi else echo "Створюємо swapfile $SWAP_SIZE..." # Для ext4/xfs та більшості звичайних файлових систем # fallocate значно швидший за dd. fallocate -l "$SWAP_SIZE" "$SWAPFILE" chmod 600 "$SWAPFILE" mkswap "$SWAPFILE" echo "Swapfile створено." fi # ------------------------------------------------------------ # 3. Додавання Swapfile у /etc/fstab # ------------------------------------------------------------ echo echo "=== 3. Налаштування /etc/fstab ===" if grep -qE "^${SWAPFILE}[[:space:]]" /etc/fstab; then echo "Запис $SWAPFILE вже є в /etc/fstab." # Якщо старий запис без потрібного пріоритету — # замінюємо його. sed -i "\|^${SWAPFILE}[[:space:]]|c\\${SWAPFILE} none swap sw,pri=10 0 0" /etc/fstab else echo "${SWAPFILE} none swap sw,pri=10 0 0" >> /etc/fstab echo "Swapfile додано в /etc/fstab." fi # ------------------------------------------------------------ # 4. Активація Swapfile # ------------------------------------------------------------ echo echo "=== 4. Активація Swapfile ===" if swapon --show=NAME | grep -qx "$SWAPFILE"; then echo "Swapfile вже активний." else echo "Активуємо $SWAPFILE..." swapon -p 10 "$SWAPFILE" echo "Swapfile активовано." fi # ------------------------------------------------------------ # 5. Встановлення zram-generator # ------------------------------------------------------------ echo echo "=== 5. Встановлення systemd-zram-generator ===" export DEBIAN_FRONTEND=noninteractive apt update apt install -y systemd-zram-generator echo "systemd-zram-generator встановлено." # ------------------------------------------------------------ # 6. Конфігурація zRAM # ------------------------------------------------------------ echo echo "=== 6. Налаштування zRAM ===" cat > "$ZRAM_CONFIG" <<'EOF' [zram0] zram-size = ram * 1 compression-algorithm = zstd swap-priority = 100 fs-type = swap EOF echo "Створено:" echo "$ZRAM_CONFIG" echo echo "Параметри:" echo " Розмір : 100% від RAM" echo " Алгоритм : zstd" echo " Пріоритет : 100" # ------------------------------------------------------------ # 7. Налаштування параметрів ядра # ------------------------------------------------------------ echo echo "=== 7. Налаштування параметрів пам'яті ===" cat > "$SYSCTL_CONFIG" <<'EOF' # Оптимізація роботи пам'яті з zRAM vm.swappiness = 100 vm.vfs_cache_pressure = 50 EOF sysctl --system echo echo "vm.swappiness:" sysctl -n vm.swappiness echo echo "vm.vfs_cache_pressure:" sysctl -n vm.vfs_cache_pressure # ------------------------------------------------------------ # 8. Активація / оновлення zRAM # ------------------------------------------------------------ echo echo "=== 8. Активація zRAM ===" systemctl daemon-reload if systemctl is-active --quiet systemd-zram-setup@zram0.service; then echo "zRAM вже активна." echo "Перезапускаємо для застосування нової конфігурації..." systemctl restart systemd-zram-setup@zram0.service else echo "Створюємо zRAM..." systemctl start /dev/zram0 fi # ------------------------------------------------------------ # 9. Перевірка # ------------------------------------------------------------ echo echo "============================================================" echo " РЕЗУЛЬТАТ" echo "============================================================" echo echo "--- Swap ---" swapon --show echo echo "--- zRAM ---" zramctl echo echo "--- Пам'ять ---" free -h echo echo "--- Swappiness ---" sysctl vm.swappiness echo echo "--- Cache pressure ---" sysctl vm.vfs_cache_pressure echo echo "--- Стан zRAM service ---" systemctl --no-pager --full status systemd-zram-setup@zram0.service 2>/dev/null || true echo echo "============================================================" echo " ГОТОВО" echo "============================================================" echo echo "Очікувано:" echo " zRAM -> priority 100" echo " swapfile -> priority 10" echo echo "zRAM використовується першою, swapfile — як резерв." echo