
У меня 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. Вот как на самом деле создать такой файл:
- Создайте пустой файл:
touch /swap
- Используйте
chattr
для установкиNoCOW
атрибута:chattr +C /swap
- Убедитесь, что
C
атрибут появился:lsattr /swap
- Заполните его:
dd if=/dev/zero of=/swap bs=1M count=1024
# для 1 гигабайта mkswap /swap && chmod 600 /swap && swapon /swap
В качестве альтернативы вы можете создать каталог, указать chattr +C
его и создать в нем файл подкачки.
Обратите внимание, что вы не можете сделать это chattr +C
с уже существующим непустым файлом. Это задокументировано как неопределенное поведение (на самом деле, оно просто не меняет атрибуты). Поэтому вам следует либо создать пустой файл, а затем chattr
, либо создать каталог с chattr
, а затем создать в нем файл (в таком случае все файлы, созданные после chattr
ing каталога, будут иметь атрибут 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
на основной том, но затем я создам отдельный подтом.