Как создать файл подкачки на SSD-диске с помощью BTRFS

Как создать файл подкачки на SSD-диске с помощью BTRFS

У меня SSD с btrfs, я попробовал создать файл подкачки следующим образом:

dd if=/dev/zero of=swapfile01  bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01

В dmesg я вижу

[238434.731654] swapon: swapfile has holes

Я понимаю, что, возможно, есть некоторые дыры, вызванные фрагментацией диска, но это SSD-диск, так что это, вероятно, не должно иметь значения? Есть ли способ игнорировать дыры? Или как это исправить?

Не по теме - зачем мне это нужно (чтобы избежать неуместных вопросов в комментариях): у меня зашифрованный диск, размер которого чертовски сложно менять, поэтому я просто решил создать файл подкачки вместо изменения размера раздела подкачки (я добавил 14 ГБ оперативной памяти с 4 ГБ до 16 ГБ и теперь не могу перейти в режим гибернации).

решение1

Статус в 2019 году

Развитие Btrfs и ядра Linux сделало мой первоначальный ответустаревший. Пожалуйста, посмотриэтот другой ответ.


Оригинальный ответ от 2016 года

ОтЧасто задаваемые вопросы о btrfs:

Поддерживает ли btrfs файлы подкачки? В настоящее время нет. Простое создание файла NOCOW не поможет, поддержка файла подкачки основана на одной функции, которую btrfs намеренно не реализует из-за возможных повреждений. (...) Обходной путь, хотя и с низкой производительностью, — монтировать файл подкачки через петлевое устройство.

Поэтому пока нет хорошего способа создать файл подкачки на разделе Btrfs.

решение2

Как уже упоминалось выше,начиная с Linux 5.0теперь можно создавать файлы подкачки на BTRFS. Но они должны быть несжатыми и NoCOW. Вот как на самом деле создать такой файл:

  1. Создайте пустой файл:touch /swap
  2. Используйте chattrдля установки NoCOWатрибута:chattr +C /swap
  3. Убедитесь, что Cатрибут появился:lsattr /swap
  4. Заполните его: dd if=/dev/zero of=/swap bs=1M count=1024 # для 1 гигабайта
  5. mkswap /swap && chmod 600 /swap && swapon /swap

В качестве альтернативы вы можете создать каталог, указать chattr +Cего и создать в нем файл подкачки.

Обратите внимание, что вы не можете сделать это chattr +Cс уже существующим непустым файлом. Это задокументировано как неопределенное поведение (на самом деле, оно просто не меняет атрибуты). Поэтому вам следует либо создать пустой файл, а затем chattr, либо создать каталог с chattr, а затем создать в нем файл (в таком случае все файлы, созданные после chattring каталога, будут иметь атрибут nocow).

Предостережение:как уже упоминалось, для этого требуется версия ядра 5.0 или выше. Raspberry Pi, например, использует ядра 4.19.*, поэтому вы не сможете использовать на нем эту технику.

решение3

Поддержка файла подкачки была добавлена ​​в ядро ​​версии 5.0, как можно увидеть в коммитеhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 Для активации файла подкачки в Btrfs, файл должен быть полностью выделен как NOCOW без сжатия на одном устройстве.

решение4

Полезно знать о подкачке в BTRFS: если вы делаете резервные копии снимков/подтомов, вам следует создать отдельный подтом, для которого снимки не создаются.

На подтоме моментального снимка ваш файл подкачки снова станет COW, и вы не сможете сделать это swaponпосле перезагрузки:https://www.spinics.net/lists/linux-btrfs/msg96790.html

Я сделал свой последний подтом доступным для записи, например sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false, удалил его swapи снова смог записать swaponна основной том, но затем я создам отдельный подтом.

Связанный контент