Swapon не удался: Неверный аргумент в системе Linux с файловой системой Btrfs

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

Что не так с этой последовательностью операций, выполняемых на системе Debian Squeeze с файловой системой Btrfs?

$ dd if=/dev/zero of=swapfile2 bs=1024 count=524288
$ sudo mkswap swapfile2
$ sudo chown root:root swapfile2
$ sudo chmod 0600 swapfile2  
$ sudo swapon -v -f swapfile2
swapon on swapfile2
swapon: /home/mathieu/swapfile2: обнаружена подпись подкачки: версия 1, размер страницы 4, тот же порядок байтов
swapon: /home/mathieu/swapfile2: размер страницы=4096, размер подкачки=536870912, размер устройства=536870912
swapon: swapfile2: swapon не удался: Неверный аргумент

Моя файловая система:

$ mount
/dev/mapper/voxbox-root на / тип btrfs (rw)
tmpfs на /lib/init/rw тип tmpfs (rw,nosuid,mode=0755)
proc на /proc тип proc (rw,noexec,nosuid,nodev)
sysfs на /sys тип sysfs (rw,noexec,nosuid,nodev)
udev на /dev тип tmpfs (rw,mode=0755)
tmpfs на /dev/shm тип tmpfs (rw,nosuid,nodev)
devpts на /dev/pts тип devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/mapper/voxbox-boot на /boot тип ext2 (rw)
fusectl на /sys/fs/fuse/connections тип fusectl (rw)

Этот отчет об ошибке приводит к этой
дискуссии

Таким образом, “Неверный аргумент” следует читать как “Ваша файловая система не поддерживает файл подкачки”

как упомянул malat

В ядре Linux 5.0.0 Btrfs теперь нативно поддерживает файлы подкачки. (Вы должны установить его как no-COW)

Вот некоторая информация с kernel.org: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

С ядра 5.0+ Btrfs имеет нативную поддержку файлов подкачки, но с некоторыми ограничениями. Файл подкачки – должен быть полностью выделен как NOCOW без сжатия на одном устройстве.

Эта ссылка показывает, как это сделать: https://wiki.archlinux.org/index.php/swap#Swap_file.

НЕ ПЫТАЙТЕСЬ ЭТО СДЕЛАТЬ В LINUX < 4.21 !!!

Предупреждение: Btrfs на ядре Linux до версии 5.0 не поддерживает файлы подкачки. Игнорирование этого предупреждения может привести к повреждению файловой системы. Хотя файл подкачки может использоваться на Btrfs, когда он смонтирован через устройство loop, это приведет к значительному ухудшению производительности подкачки.

Я получил загадочную ошибку после некорректного завершения работы. Единственным решением было удалить старый файл подкачки и создать его снова.

Поскольку в Btrfs есть определенные ограничения (например, копирование при записи должно быть отключено), я рекомендую следовать шагам на Arch Wiki (я скопировал шаги для создания 512M подкачки, но пожалуйста, прочитайте их документацию перед выполнением):

# truncate -s 0 /swapfile
# chattr +C /swapfile
# btrfs property set /swapfile compression none
# fallocate -l 512M /swapfile
# chmod 600 /swapfile
# mkswap /swapfile

Теперь swapon /swapfile должен пройти успешно.

Если нет, убедитесь, что ядро как минимум 5.0, так как в более ранних версиях ядра файлы подкачки не поддерживаются в Btrfs (источник: btrfs FAQ):

С ядра 5.0+ Btrfs имеет нативную поддержку файлов подкачки, но с некоторыми ограничениями. Файл подкачки – должен быть полностью выделен как NOCOW без сжатия на одном устройстве.

Для ядер до 5.0 файлы подкачки не поддерживаются. Простая установка файла в NOCOW не помогает, поддержка файлов подкачки зависит от одной функции, которую Btrfs намеренно не реализует из-за потенциальных повреждений. Реализация подкачки раньше полагалась на некоторые предположения, которые могут не быть верными в Btrfs, такие как номера блоков в файле подкачки, в то время как Btrfs имеет другую схему отображения номеров блоков в случае множественных устройств. Существует новый API, который может быть использован для портирования подкачки на Btrfs; для получения дополнительной информации посмотрите на project ideas#Поддержка файлов подкачки.

С версии 6.1 стало проще создать файл подкачки в Btrfs:

# btrfs filesystem mkswapfile --size 2G swapfile
# swapon swapfile

Больше информации в документации btrfs.

Если вы хотите использовать файл подкачки, просто используйте btrfs-swapon

Обновление Апрель 2019: Пожалуйста, посмотрите ответ reolic, который утверждает, что Btrfs начал поддерживать подкачку с версии ядра Linux 5.0.0.

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

Ответ Сатьи, похоже, содержит мертвые ссылки.

Я нашел это в FAQ Btrfs:

Поддерживает ли btrfs файлы подкачки?

В настоящее время нет. Простая установка файла как NOCOW не помогает, поддержка файлов подкачки зависит от одной функции, которую btrfs намеренно не реализует из-за потенциальных повреждений. Реализация подкачки раньше полагалась на некоторые предположения, которые могут не быть верными в Btrfs, такие как номера блоков в файле подкачки, в то время как у Btrfs другая схема отображения номера блоков в случае множественных устройств. Существует новый API, который может быть использован для портирования подкачки на Btrfs; для получения дополнительной информации посмотрите на project ideas#Поддержка файлов подкачки.

Обходной путь, хотя и с плохой производительностью, состоит в том, чтобы монтировать файл подкачки через устройство loop.

Источник: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

Неверный аргумент говорит о том, что что-то не так с аргументами для команды swapon.

Прежде всего, прочитайте man swapon.

Попробуйте sudo swapon swapfile2. В моем случае это сработало.

Ответ или решение

На вашем Debian Squeeze с файловой системой Btrfs возникла ошибка при попытке включить своп-файл, и вывод команды swapon указывает на проблему с аргументами. Ошибка swapon failed: Invalid argument обычно возникает в результате того, что используемая файловая система (в данном случае Btrfs) не поддерживает своп-файлы в некоторых версиях ядра Linux.

Причины проблемы

  1. Поддержка своп-файлов в Btrfs: До версии ядра 5.0 поддержка своп-файлов в Btrfs была ограниченной. Даже если вы установите файл как NOCOW (что вроде как должно было помочь), полная поддержка для своп-файлов в Btrfs отсутствовала из-за особенностей управления блоками в этой файловой системе.

  2. Правильные параметры: Сообщение об ошибке может также указывать на то, что файл не был правильно подготовлен для использования в качестве свопа, что включает в себя отсутствие компрессии и использование параметра NOCOW.

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

Чтобы решить эту проблему, выполните следующие шаги:

  1. Проверьте версию ядра: Убедитесь, что ваша версия ядра не ниже 5.0. Массовая поддержка своп-файлов в Btrfs была включена в 5.0. Вы можете проверить текущую версию вашего ядра командой:

    uname -r
  2. Подготовка своп-файла: Если у вас версия ядра 5.0 и выше, выполните следующие шаги для создания своп-файла:

    # Создайте своп-файл и установите необходимые параметры:
    sudo truncate -s 0 /swapfile
    sudo chattr +C /swapfile
    sudo btrfs property set /swapfile compression none
    sudo fallocate -l 512M /swapfile  # Или нужный вам размер свопа
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
  3. Проверка: После этих шагов проверьте, что своп включен, с помощью команды:

    swapon --show

Альтернативные решения

Если вы используете версию ядра ниже 5.0 или хотите временное решение, вы можете использовать своп через петлевое устройство (loop device):

sudo dd if=/dev/zero of=/swapfile bs=1M count=512
sudo mkswap /swapfile
sudo swapon /swapfile

Заключение

В случае, если проблема все еще не решена, убедитесь, что нет дополнительных настроек системы или программ, которые могут мешать правильному созданию и активации своп-файла. Если ошибка сохраняется, возможно, вам потребуется перепроверить настройки вашей системы и, в крайних случаях, обновить ядро до более новой версии, чтобы воспользоваться полной поддержкой своп-файлов в Btrfs.

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

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