Начиная с версии ядра 5.0+ на btrfs можно создать swap-файл, но с некоторыми ограничениями: swap-файл должен располагаться целиком на одном устройстве, создаваться обязательно с отключенным COW и сжатием7). Кроме того swap-файл не может попасть в снимок. В перспективе предполагается снять часть ограничений.
Предположим что у нас btrfs на одном устройстве и у нас подходящая версия ядра 5.0+, дальше все довольно просто:
touch /swap # создаем пустой файл /swap - COW можно отключить только на пустом файле
chmod go-r /swap # swap должен иметь права 600, а touch проставляет права 644
chattr +C /swap # отключаем COW
chattr -c /swap # отключаем компрессию файла
fallocate swap -l4g # выделяем место под файл 4Gib
mkswap /swap # создаем внутреннюю разметку в файле для swap-а
swapon /swap # подключаем swap
Важно выделять место под swap-файл именно командой fallocate. Если создать пустой файл командой truncate, то он фактически останется пустым т.к. в btrfs используется механика sparse files и mkswap отработает успешно, но swapon сообщит, что в файле есть «дырки», т.е. не размеченные на диск области файла.