Подробный гайд: Альтернативные способы создания swap-файла в Linux (2024–2026)
Для кого: системные администраторы, DevOps-инженеры, продвинутые пользователи.
Цель: освоить современные, безопасные и оптимизированные под разные ФС методы создания swap-файла, понять ограничения и выбрать оптимальный подход для вашей среды.
Что такое swap-файл и зачем он нужен?
Swap-файл — это обычный файл на диске, который ядро использует как расширенную оперативную память.
Применяется:
- При нехватке RAM (предотвращает OOM-killer)
- Для поддержки гибернации (
hibernate/suspend-to-disk) - Стабилизации работы серверов с переменной нагрузкой
- В контейнерных/виртуальных средах, где выделение отдельного раздела затруднено
Важные предостережения перед созданием
- Файловая система: Не все ФС поддерживают swap-файлы одинаково. Btrfs и ZFS требуют особых настроек.
- Безопасность: Данные в swap попадают на диск в открытом виде. Если диск не зашифрован (LUKS/dm-crypt), конфиденциальная информация может остаться после выключения.
- Права: Файл обязательно должен иметь права
600. Иначе ядро откажется активировать swap из соображений безопасности. - Производительность: Swap на HDD работает медленно. На SSD предпочтительно использовать
discardили TRIM. В 2025+ ядрахswapавтоматически учитывает особенности NVMe.
Способ 1: fallocate (рекомендуемый для ext4 / XFS / NTFS)
Самый быстрый и современный метод. Не заполняет файл нулями, а сразу резервирует блоки.
# 1. Создаём файл нужного размера
sudo fallocate -l 4G /swapfile
# 2. Устанавливаем права
sudo chmod 600 /swapfile
# 3. Форматируем как swap
sudo mkswap /swapfile
# 4. Активируем
sudo swapon /swapfile
# 5. Добавляем в fstab для постоянной работы
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Плюсы: мгновенное создание, минимальное влияние на I/O, поддержка большинства современных ФС
Минусы: не работает "из коробки" на Btrfs без отключения COW, не подходит для sparse-файловых систем
Способ 2: Классический dd (универсальный, но медленный)
Старый надёжный метод. Явно записывает нули, гарантируя смежность блоков.
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress conv=fdatasync
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Совет: для ускорения на современных системах используйте bs=4M или bs=16M. Параметр conv=fdatasync гарантирует сброс кэша до завершения.
Способ 3: truncate (только для тестов / лабораторий)
Создаёт "дырявый" (sparse) файл. Занимает место на диске только по мере фактической записи данных в swap.
sudo truncate -s 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Внимание: Ядро часто отказывается активировать swap на sparse-файлах, так как блоки не гарантированно смежны. Используйте только для отладки или в средах с поддержкой swap on sparse (экспериментально в некоторых ядрах).
Способ 4: Swap-файл на Btrfs
Btrfs по умолчанию использует Copy-on-Write (CoW), что несовместимо со стабильной работой swap. Начиная с ядра 5.0+ поддержка разрешена, но требует явного отключения CoW и фрагментации.
Вариант А: Создание на отдельном субтоме (рекомендуется)
# 1. Создаём субтом без CoW
sudo btrfs subvolume create /swapvol
sudo chattr +C /swapvol
# 2. Создаём файл
sudo fallocate -l 4G /swapvol/swapfile
sudo chmod 600 /swapvol/swapfile
# 3. Форматируем и активируем
sudo mkswap /swapvol/swapfile
sudo swapon /swapvol/swapfile
# 4. В fstab указываем субтом
echo '/swapvol/swapfile none swap sw,nofail 0 0' | sudo tee -a /etc/fstab
Вариант Б: Использование btrfs filesystem mkswapfile (ядро 5.15+)
sudo btrfs filesystem mkswapfile -s 4G /swapfile
sudo chmod 600 /swapfile
sudo swapon /swapfile
Команда сама отключает CoW, проверяет смежность и форматирует файл.
Проверка фрагментации:
sudo filefrag -v /swapfile | grep "extents"
# Должно быть: 1 extent
Способ 5: Swap на ZFS
Официально ZFS не поддерживает swap-файлы внутри пула. Рекомендуется использовать zvol (блочное устройство) или внешние решения.
Через ZVOL (безопасно и производительно)
# 1. Создаём zvol с подходящим размером блока
sudo zfs create -V 4G -b 4K -o sync=always pool/swap
# 2. Форматируем
sudo mkswap /dev/zvol/pool/swap
# 3. Активируем
sudo swapon /dev/zvol/pool/swap
# 4. В fstab
echo '/dev/zvol/pool/swap none swap sw 0 0' | sudo tee -a /etc/fstab
Альтернатива для ZFS: используйте zram или zswap (сжатие в RAM), так как swap на диске часто противоречит идеологии ZFS (ARC уже управляет кэшем эффективно).
Способ 6: Динамический и сжатый swap (современные подходы)
zram-generator (systemd, рекомендовано в 2024+)
Создаёт сжатый swap в оперативной памяти. Идеально для ноутбуков, VPS, контейнеров.
# Установка (Ubuntu/Debian)
sudo apt install zram-generator
# Конфигурация
sudo tee /etc/systemd/zram-generator.conf <<EOF
[zram0]
zram-size = min(ram, 4096)
compression-algorithm = zstd
swap-priority = 100
EOF
# Активация
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service
Автоматически создаёт /dev/zram0, форматирует, активирует, обрабатывает гибернацию (при наличии resume= в GRUB)
dphys-swapfile (Debian/Ubuntu/Raspbian)
Автоматически управляет размером файла в зависимости от RAM и нагрузки.
sudo apt install dphys-swapfile
sudo nano /etc/dphys-swapfile # настройте CONF_SWAPSIZE=2048
sudo systemctl enable --now dphys-swapfile
Автоматизация и systemd-подход
Вместо fstab можно использовать нативные юниты systemd:
/etc/systemd/system/swapfile.service
[Unit]
Description=Activate swap file
Before=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/swapon /swapfile
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now swapfile.service
Преимущество:
- точный контроль порядка загрузки, логирование, интеграция с
systemd-analyze.
Проверка и мониторинг
# Показать активные swap-устройства
swapon --show
# Подробная статистика
cat /proc/swaps
# Использование памяти + swap
free -h
# Проверить, используется ли swap
vmstat 1 5
Тонкая настройка ядра (/etc/sysctl.d/99-swap.conf)
# Как активно ядро использует swap (0–100)
vm.swappiness=10
# Давление на кэш файловой системы
vm.vfs_cache_pressure=50
# Для SSD: отправка TRIM при очистке swap
vm.swap_slot_cache=1
Применить:
sudo sysctl -p /etc/sysctl.d/99-swap.conf
Таблица выбора метода (2024–2026)
| Среда / ФС | Рекомендуемый метод | Примечание |
|---|---|---|
| ext4 / XFS | fallocate |
Быстро, надёжно, стандарт де-факто |
| Btrfs | btrfs filesystem mkswapfile |
Ядро 5.15+, иначе субтом + +C |
| ZFS | zvol или zram |
Swap в пуле официально не поддерживается |
| VPS / Контейнеры | zram-generator |
Экономия места, высокая скорость |
| Десктоп / Ноутбук | dphys-swapfile + zram |
Автоматическая адаптация, гибернация |
| Автоматизация (IaC) | Ansible community.general.mkswap + systemd unit |
Идеально для Terraform/Packer |
Безопасность и обслуживание
- Шифрование: Если диск не зашифрован, используйте
cryptsetupили убедитесь, что swap очищается при выключении (swapoff -aвshutdownскриптах). - Очистка: При удалении файла не просто
rm, аswapoff /swapfile && rm -f /swapfile. - Обновление ядра: Современные ядра (6.6+) улучшили поддержку swap на btrfs/zram и добавили
swap_cluster_infoдля оптимизации NVMe. - Мониторинг: Настройте алерты при использовании swap > 30% (
node_exporter+ Prometheus,zabbix-agentилиcollectd).
Заключение
Создание swap-файла давно вышло за рамки dd. В 2025–2026 годах приоритет отдаётся:
fallocateдля классических ФС- нативным утилитам ФС (
btrfs mkswapfile,zvol) - сжатым swap в памяти (
zram) - автоматизации через
systemdи конфигурационные менеджеры
Выбирайте метод исходя из файловой системы, требований к производительности и стратегии безопасности. Всегда проверяйте смежность блоков, права 600 и наличие записи в fstab/systemd.