Во время подключения своп файла
$ sudo swapon /my-swap-file
swapon: swapfile has holes
swapon: /my-swap-file: swapon failed: Invalid argument
в ответ выдается ошибка Недопустимый аргумент. Проблема кроется в fallocate, не выделяющего реального пространства, которое требуется для swapon.
Решение: с помощью DD выполнить задачу возложенную на fallocate и в остальном, процесс продолжится по предыдущему сценарию.
Вместо sudo fallocate -l 1G /my-swap-file выполнить:
$ sudo dd if=/dev/zero of=/my-swap-file bs=1MiB count=1000
1000+0 записей получено
1000+0 записей отправлено
скопировано 1048576000 байт (1,0 GB), 1,44063 с, 728 МВ/c
Значимые здесь параметры dd
of: указывает файл или устройство назначения назначения.
bs: количество байт, которые будут записаны или прочитаны за раз.
count: Копирует только указанное число входных блоков.
т.е. в строке в файл /my-swap-file копируется 1000 блоков, по 1MiB размер каждого блока. В остальном, все действия остаются прежними:
$ sudo chmod 600 /my-swap-file
$ sudo mkswap /my-swap-file
Setting up swapspace version 1, size = 1023996 KiB
без метки, UUID=bb94e86e-c1d2-4b5a-8cc2-fdffd2078d7e
$ sudo swapon /my-swap-file
Что интересно, на одной из VPS с установленной CentOS 7, fallocate отработал без последующих проблем, на другой же, пришлось обратится к утилите DD. Также, по ссылке обсуждается вопрос swapon failed: Invalid argument и его решение. И также, в комментариях отмечается, что на разных машинах и дистрибутивах, неоднозначная ситуация.
Проблема с fallocate (1) заключается в том, что он использует ioctl файловой системы для быстрого и эффективного выделения ресурсов, недостатком является то, что он не выделяет пространство физически, а системный вызов swapon (2) требует реального пространства. Ссылка: https://bugzilla.redhat.com/show_bug.cgi?id=1129205