Свайп-файл: swapon неверный аргумент

Вопрос или проблема

У меня был свайп в свапфайле, который работал довольно долго, но по какой-то причине он перестал работать.

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-файла.

Решение проблемы

  1. Отключение копирования при записи: Используйте команду chattr +C для отключения Copy-on-Write для вашего файла swap. Это необходимо делать перед началом записи данных в файл.

  2. Создание файла без дыр: Вместо использования команды fallocate, такая команда, как dd, более безопасна для создания swap-файлов без дыр:

    sudo dd if=/dev/zero of=/home/.swap/swapfile bs=1M count=4096
  3. Установка прав доступа:

    sudo chmod 600 /home/.swap/swapfile
  4. Форматирование swap-файла:

    sudo mkswap /home/.swap/swapfile
  5. Активация 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.

Оцените материал
Добавить комментарий

Капча загружается...