Вопрос или проблема
У меня был свайп в свапфайле, который работал довольно долго, но по какой-то причине он перестал работать.
sudo fallocate -l 4G /home/.swap/swapfile
sudo chmod 600 /home/.swap/swapfile
sudo mkswap /home/.swap/swapfile
# /etc/fstab
/home/.swap/swapfile swap swap defaults 0 0
sudo swapon -a
swapon: /home/.swap/swapfile: swapon failed: Invalid argument
Я использую самую новую версию Fedora, так что, возможно, что-то изменилось с обновлением или в чем может быть причина?
Если вы используете btrfs, вам следует создать свайпфайл без copy-on-write. Это делается с помощью chattr +C
. Важно установить этот атрибут до записи чего-либо в файл:
truncate -s 0 swapfile
chattr +C swapfile
fallocate -l 2G swapfile
chmod 0600 swapfile
mkswap swapfile
swapon swapfile
Добавьте это в /etc/fstab
с этой записью:
/path/swapfile none swap defaults 0 0
Я нашел это задокументированным в материале.
Пожалуйста, попробуйте заменить
fallocate -l 4G /home/.swap/swapfile
на
dd if=/dev/zero of=/home/.swap/swapfile bs=1M count=4096
Цитата из swapon(8):
Файлы с дырами
Реализация свапфайла в ядре ожидает возможности записи в файл напрямую, без помощи файловой системы. Это проблема для файлов с дырами или файлов copy-on-write на файловых системах, таких как Btrfs.
Команды, такие как cp(1) или truncate(1), создают файлы с дырами. Эти файлы будут отклонены swapon.
Предварительно выделенные файлы, созданные с помощью fallocate(1), могут интерпретироваться как файлы с дырами в зависимости от файловой системы. Предварительно выделенные свайп файлы поддерживаются в XFS начиная с Linux 4.18.
Наиболее портативным решением для создания свайпфайлa является использование dd(1) и
/dev/zero
.
Курсивное примечание, похоже, объясняет все. К сожалению, даже при подробном выводе swapon
не упоминается причина (файлы с дырами) сбоя.
Довольно старый вопрос, но я только что столкнулся с той же проблемой, и ничего из того, что здесь обсуждалось, не сработало для меня. Но я нашел это в мануале файловой системы btrfs:
mkswapfile [-s size] file
Создать новый файл, подходящий и отформатированный как свайпфайл. По умолчанию размер 2GiB, фиксированный размер страницы 4KiB, минимальный размер 40KiB.
Свайпфайл должен быть создан определенным образом: NOCOW и предварительно выделен. Подтом, содержащий свайпфайл, не может быть снимком, и блоки активированного свайпфайла не могут выравниваться.
Создание свайпфайла может быть достигнуто с помощью автономных команд. Активация должна быть выполнена командой swapon(8). Смотрите также команду btrfs inspect-internal map-swapfile и описание функции Swapfile.
ПРИМЕЧАНИЕ:
Команда является упрощенной версией 'mkswap', если вы хотите установить метку, размер страницы или другие параметры, пожалуйста, используйте 'mkswap'.
Опции
-s|--size SIZE
Создать свайпфайл заданного размера SIZE (принимаются суффиксы k/m/g/e/p).
-U|--uuid UUID
указать UUID, который нужно использовать, или специальное значение: clear (все нули), random, time (на основе времени случайный)
Так что я сделал это:
sudo btrfs filesystem mkswapfile --size 12g --uuid clear /swapfile/path
И это сработало идеально
Очевидно, ваша файловая система должна быть btrfs, что по умолчанию в Fedora, если я не ошибаюсь
Пожалуйста, проверьте обновленную документацию файловой системы BTRFS для новых ядер (> v.6.1): https://btrfs.readthedocs.io/en/latest/Swapfile.html
Она должна помочь вам решить все проблемы с созданием свайпфайла на BTRFS.
Моя конфигурация: Debian 12, ядро v.6.1, btrfs, dm-crypt, SSD
# btrfs filesystem mkswapfile --size 2G swapfile
# swapon swapfile
Как отметили другие, существует btrfs
вариант создания свайпфайла:
sudo btrfs filesystem mkswapfile --size 12g --uuid clear /swapfile/path
Однако, даже в этом случае, когда вы выполняете swapon /swapfile/path
, вы получите ту же ошибку Invalid argument
. Причина в том, что в некоторых конфигурациях btrfs
вы используете более одного устройства, например, в конфигурациях типа Just a Bunch of Disks (JBoD).
Моя стратегия заключалась в выделении большого файлы свапа в томе btrfs
, который поддерживался многими отдельными дисками. Это кажется невозможным с использованием этой простой конфигурации. Вместо этого я изучаю возможность безопасного изменения размера каждого раздела btrfs
, чтобы каждый диск имел запасные 16 ГБ, которые можно использовать как отдельный раздел свапа.
.
Ответ или решение
Ошибка "Swapfile Swapon: Invalid argument" может вызвать замешательство у пользователей Fedora, особенно если swap-файл ранее работал исправно. Эта проблема возникла в результате изменений в файловых системах, в частности, в использовании Btrfs. Давайте разберем причину проблемы и её решение.
Причина проблемы
Наиболее вероятной причиной возникновения ошибки является файловая система Btrfs, которая по умолчанию используется в Fedora. Btrfs применяет технологию копирования при записи (Copy-on-Write), что может создавать "дыры" в файлах, даже если вы используете команды, такие как fallocate
. Это несовместимо с требованием к swap-файлам, которые должны быть последовательными и не иметь дыр.
Если вы используете Btrfs, крайне важно отключить эту функцию и предусмотреть специальную подготовку перед созданием swap-файла.
Решение проблемы
-
Отключение копирования при записи: Используйте команду
chattr +C
для отключения Copy-on-Write для вашего файла swap. Это необходимо делать перед началом записи данных в файл. -
Создание файла без дыр: Вместо использования команды
fallocate
, такая команда, какdd
, более безопасна для создания swap-файлов без дыр:sudo dd if=/dev/zero of=/home/.swap/swapfile bs=1M count=4096
-
Установка прав доступа:
sudo chmod 600 /home/.swap/swapfile
-
Форматирование swap-файла:
sudo mkswap /home/.swap/swapfile
-
Активация swap-файла:
sudo swapon /home/.swap/swapfile
Конфигурация /etc/fstab
Убедитесь, что ваш файл /etc/fstab
правильно настроен:
/home/.swap/swapfile none swap defaults 0 0
Использование btrfs-specific utility
Для пользователей с более новыми версиями ядра (> v.6.1), может быть полезным воспользоваться встроенной командой для создания swap-файлов в Btrfs:
sudo btrfs filesystem mkswapfile --size 4G --uuid clear /swapfile/path
Это решение нативно поддерживает все особенности Btrfs и помогает избежать ошибок конфигурации.
Заключение
Если вы сталкиваетесь с этой ошибкой на файловой системе Btrfs, примените описанные выше решения для создания swap-файла без дыр и отключения Copy-on-Write. Эти действия обеспечат корректную работу swap-файла в Fedora. Эффективное управление swap-файлом является критически важным для поддержания производительности и надежности системы, особенно при использовании файловой системы Btrfs.