LinuxRuLinux без лишней теории
Память и диск

Как создать swap-файл в Linux, увеличить или удалить его

Редакция LinuxRu7 мин чтенияИнструкции

Чтобы создать swap-файл в Linux, хватит пяти команд: fallocate -l 8G /swapfile, chmod 600, mkswap, swapon и строка в /etc/fstab для автоподключения. Увеличить swap в Ubuntu можно так же, предварительно отключив старый файл через swapoff, а на Btrfs файл создают командой btrfs filesystem mkswapfile.

Как создать swap-файл в Linux, увеличить или удалить его
Фото: Dsimic, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Что есть сейчас
  2. Какой размер
  3. Создать на ext4
  4. Увеличить в Ubuntu
  5. Swap на Btrfs
  6. Swappiness
  7. Гибернация
  8. Удалить swap
  9. Ошибки swapon
  10. Частые вопросы

Сначала проверьте, какой swap уже есть

swapon --show
free -h

Пример вывода на Ubuntu 26.04:

NAME      TYPE SIZE USED PRIO
/swap.img file   4G 512M   -2

Что можно увидеть:

  • /swap.img или /swapfile с типом file - swap-файл, так по умолчанию делает установщик Ubuntu;
  • /dev/zram0 - сжатый swap в памяти, стандарт в Fedora с 33-й версии. Это не файл на диске, о нём отдельная статья про ZRAM;
  • /dev/nvme0n1p3 с типом partition - классический раздел подкачки;
  • пустой вывод - swap нет вовсе, так часто бывает на VPS и после ручной установки Arch.

Файл и раздел работают одинаково быстро. Файл удобнее: его размер меняется за минуту без переразметки диска.

Какой размер swap-файла выбрать

Жёсткого правила "вдвое больше памяти" давно нет. Swap нужен, чтобы ядро выгрузило редко используемые страницы и не включило OOM-killer при пике нагрузки. Если нужна гибернация, правило другое: в swap должно поместиться всё содержимое занятой памяти.

Оперативная памятьБез гибернацииС гибернацией
до 4 ГБравно объёму RAMRAM x 2
8 ГБ4-8 ГБ12 ГБ
16 ГБ4-8 ГБ20 ГБ
32 ГБ и больше4-8 ГБRAM + 4-8 ГБ
VPS на 1-2 ГБ1-2 ГБне применяется

Это ориентиры, а не закон. Если вы компилируете большие проекты или держите тяжёлые виртуальные машины, лучше чуть больше. Место на диске под swap проверьте заранее: df -h /.

Как создать swap-файл на ext4 и XFS

Классическая последовательность работает в Debian, Ubuntu, Fedora и Arch на ext4 и XFS:

sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show

Права 600 обязательны: иначе любой пользователь прочитает выгруженную на диск память, а swapon предупредит о небезопасных правах. Если fallocate не поддерживается файловой системой, создайте файл через dd, это медленнее, но надёжно:

sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 status=progress

В свежих util-linux, которые стоят в Debian 13, Ubuntu 26.04 и Fedora 44, всё делается одной командой. Она сама выставляет права и заполняет блоки:

sudo mkswap --file /swapfile --size 8G
sudo swapon /swapfile

Подключение при загрузке

Чтобы swap включался после перезагрузки, добавьте строку в /etc/fstab:

echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile && sudo swapon -a   # проверка, что строка корректна

Если swapon -a молча отработал и файл снова виден в swapon --show, запись верная. Формат fstab и опции подробно разобраны в статье про монтирование и /etc/fstab.

Как увеличить swap в Ubuntu

Активный swap-файл нельзя растянуть на ходу. Его отключают, пересоздают с новым размером и включают обратно. Имя файла возьмите из swapon --show, в Ubuntu это обычно /swap.img:

sudo swapoff /swap.img
sudo fallocate -l 16G /swap.img
sudo chmod 600 /swap.img
sudo mkswap /swap.img
sudo swapon /swap.img
free -h

swapoff переносит содержимое swap обратно в оперативную память. Если свободной RAM меньше, чем занято в swap, команда будет работать долго или завершится ошибкой: закройте тяжёлые программы перед ней. Строку в /etc/fstab менять не нужно, имя файла осталось прежним.

Вместо замены можно добавить второй файл, например /swapfile2, и прописать его в fstab отдельной строкой. Ядро использует оба.

Swap-файл на Btrfs

На Btrfs обычный fallocate не подойдёт: swap-файл должен быть без копирования при записи (NOCOW), без сжатия и целиком на одном устройстве. Кроме того, подтом с активным swap-файлом нельзя снапшотить, поэтому файл кладут в отдельный подтом, который не попадает в снимки Snapper или Timeshift.

sudo btrfs subvolume create /swap
sudo btrfs filesystem mkswapfile --size 8G /swap/swapfile
sudo swapon /swap/swapfile
echo '/swap/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab

Команда mkswapfile есть в btrfs-progs начиная с 6.1 и сама ставит атрибут NOCOW. На старых системах то же делают вручную: создать пустой файл, выполнить chattr +C, затем fallocate, chmod 600 и mkswap. Если корень смонтирован как подтом @, удобнее создать подтом @swap на верхнем уровне и примонтировать его в /swap, как это делают многие установщики. Как настроить снимки, чтобы они не мешали, описано в статье про Btrfs и Snapper. Ограничения перечислены в документации Btrfs.

Swappiness: как часто ядро уходит в swap

vm.swappiness задаёт, насколько охотно ядро выгружает анонимную память (данные программ) по сравнению со сбросом файлового кэша. Диапазон от 0 до 200, по умолчанию 60.

cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10          # до перезагрузки
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system                  # применить файлы из sysctl.d

Ориентиры: 10-30 для десктопа с SSD и достаточным объёмом памяти, если раздражают подтормаживания после долгого простоя браузера; 60 оставьте, если не видите проблем. Значение 0 не отключает swap полностью, оно лишь откладывает его до последнего, и при нехватке памяти система всё равно начнёт выгружать. С ZRAM, наоборот, ставят высокие значения вроде 150-180, потому что сжатая память быстрее диска.

Если у вас одновременно ZRAM и swap-файл, задайте приоритеты: ядро сначала заполняет устройство с большим pri. В fstab это опция pri=10 для файла, а zram-generator обычно ставит zram приоритет 100.

Гибернация в swap-файл

Для гибернации ядру нужно знать при загрузке, на каком разделе лежит файл и с какого смещения он начинается. Это два параметра: resume=UUID=... и resume_offset=....

findmnt -no UUID -T /swapfile                     # UUID раздела с файлом
sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'   # ext4
sudo btrfs inspect-internal map-swapfile -r /swap/swapfile                        # Btrfs

Для Btrfs значение из filefrag не подходит, только из map-swapfile -r. Дальше впишите параметры в GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub и обновите загрузчик и initramfs:

# пример строки в /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=1234abcd-... resume_offset=34816"
# Debian, Ubuntu
sudo update-grub
sudo update-initramfs -u
# Fedora
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo dracut -f
# проверка
systemctl hibernate

В Arch с mkinitcpio в HOOKS должен быть хук resume (или systemd). В свежих версиях systemd на UEFI-машинах параметр resume часто не нужен: systemd сам записывает расположение образа в переменную EFI перед гибернацией. Ручная настройка остаётся самым предсказуемым вариантом.

При включённом Secure Boot ядро в режиме lockdown запрещает гибернацию, и systemctl hibernate вернёт ошибку при любом размере swap. Сначала проверьте cat /sys/kernel/security/lockdown: если в квадратных скобках стоит integrity или confidentiality, ищите решение в настройках Secure Boot, а не в swap. Подробности в статье про Secure Boot.

Как удалить swap-файл

sudo swapoff /swapfile
sudo sed -i '\#^/swapfile #d' /etc/fstab   # или удалите строку вручную в nano
sudo rm /swapfile
sudo systemctl daemon-reload

Не пропускайте правку fstab. Если удалить файл, а строку оставить, systemd при загрузке будет искать swap и запишет ошибку в журнал. Если вы уходите на ZRAM, сначала настройте его, а потом удаляйте файл, чтобы не остаться совсем без подкачки.

Ошибки swapon и как их понять

  • swapon: /swapfile: swapon failed: Invalid argument - на Btrfs файл создан без NOCOW или лежит в сжатом каталоге. Пересоздайте через btrfs filesystem mkswapfile.
  • skipping - it appears to have holes - файл разреженный, например скопирован через cp или создан truncate. Создайте заново через fallocate или dd.
  • insecure permissions 0644, 0600 suggested - выполните sudo chmod 600 на файл.
  • read swap header failed - забыли mkswap после создания или изменения размера.
  • Система стала тормозить и шуршать диском - память закончилась, и swap лишь отсрочил OOM. Посмотрите, кто съел RAM, в htop. Поможет статья о зависаниях Linux и OOM, где разобраны earlyoom и Magic SysRq.

Частые вопросы

Swap-файл или раздел подкачки: что лучше?

По скорости разницы нет. Файл проще изменить и удалить без переразметки диска, поэтому установщики Ubuntu и многих других дистрибутивов создают именно файл. Раздел нужен в редких случаях, например для гибернации на файловой системе, где swap-файл не поддерживается.

Сколько swap нужно при 16 ГБ памяти?

Без гибернации обычно хватает 4-8 ГБ. Для гибернации нужен объём не меньше занятой памяти, то есть ориентир около 20 ГБ.

Вредит ли swap SSD?

При нормальной работе swap пишется редко, и на ресурс современных SSD это почти не влияет. Если система постоянно активно свопится, проблема в нехватке памяти, а не в диске. Снизить запись помогают swappiness 10-30 или ZRAM.

Как временно отключить swap?

sudo swapoff -a отключит все области подкачки до перезагрузки. Перед этим убедитесь, что свободной оперативной памяти хватает на содержимое swap.

Можно ли иметь сразу ZRAM и swap-файл?

Да. Задайте zram более высокий приоритет, чтобы ядро сначала использовало сжатую память, а файл служил запасом. Приоритет файла указывается опцией pri в /etc/fstab.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.