Вопрос или проблема
Что не так с этой последовательностью операций, выполняемых на системе 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)
Этот отчет об ошибке приводит к этой
дискуссииТаким образом, “Неверный аргумент” следует читать как “Ваша файловая система не поддерживает файл подкачки”
В ядре 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.
Причины проблемы
-
Поддержка своп-файлов в Btrfs: До версии ядра 5.0 поддержка своп-файлов в Btrfs была ограниченной. Даже если вы установите файл как NOCOW (что вроде как должно было помочь), полная поддержка для своп-файлов в Btrfs отсутствовала из-за особенностей управления блоками в этой файловой системе.
-
Правильные параметры: Сообщение об ошибке может также указывать на то, что файл не был правильно подготовлен для использования в качестве свопа, что включает в себя отсутствие компрессии и использование параметра NOCOW.
Решение проблемы
Чтобы решить эту проблему, выполните следующие шаги:
-
Проверьте версию ядра: Убедитесь, что ваша версия ядра не ниже 5.0. Массовая поддержка своп-файлов в Btrfs была включена в 5.0. Вы можете проверить текущую версию вашего ядра командой:
uname -r
-
Подготовка своп-файла: Если у вас версия ядра 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
-
Проверка: После этих шагов проверьте, что своп включен, с помощью команды:
swapon --show
Альтернативные решения
Если вы используете версию ядра ниже 5.0 или хотите временное решение, вы можете использовать своп через петлевое устройство (loop device):
sudo dd if=/dev/zero of=/swapfile bs=1M count=512
sudo mkswap /swapfile
sudo swapon /swapfile
Заключение
В случае, если проблема все еще не решена, убедитесь, что нет дополнительных настроек системы или программ, которые могут мешать правильному созданию и активации своп-файла. Если ошибка сохраняется, возможно, вам потребуется перепроверить настройки вашей системы и, в крайних случаях, обновить ядро до более новой версии, чтобы воспользоваться полной поддержкой своп-файлов в Btrfs.