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

16

Что не так с этой последовательностью операций, выполняемой в системе 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: found swap signature: version 1, page-size 4, same byte order
swapon: /home/mathieu/swapfile2: pagesize=4096, swapsize=536870912, devsize=536870912
swapon: swapfile2: swapon failed: Invalid argument

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

$ mount
/dev/mapper/voxbox-root on / type btrfs (rw)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/mapper/voxbox-boot on /boot type ext2 (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
малат
источник
Малат, я снова открыл твой вопрос и добавил твой ответ, как показано ниже. Не стесняйтесь оставить свой ответ, я удалю свой.
Сатьяджит Бхат

Ответы:

16

Этот отчет об ошибке приводит к этому обсуждению

Поэтому «Неверный аргумент» следует читать как «Ваша файловая система не поддерживает файл подкачки»

а отвечал на Малаты

сатья
источник
6
Хорошо поймал! btrfsФайловая система не поддерживает файлы подкачки , поскольку он перемещает файл данных вокруг и код подкачки Linux занимает только отображение файл подкачки в один раз. Катастрофа произошла бы, если бы это было разрешено - случайные данные файла, которые использовали блоки, которые когда-то использовал файл подкачки, были бы повреждены.
Дэвид Шварц
1
более новая справочная страница swapon document новый трюк "Один из возможных обходных путей - сопоставить файл с устройством обратной связи". Я еще не пробовал.
Малат
8

У меня меньше 50 репутации, поэтому я не могу комментировать. Но я должен обновить существующие ответы. В ядре Linux 5.0.0 btrfs изначально поддерживает swapfile. (Вы должны установить его как 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 при монтировании через устройство петли, это приведет к серьезному снижению производительности подкачки.

recolic
источник
1
Не могли бы вы процитировать соответствующий раздел в вашей ссылке?
Бурги
@ Бурги Я отредактировал свой ответ, и теперь лучше!
Recolic
2

Если вы хотите поменять файл, просто используйте btrfs-swapon

Себастьян Вагнер
источник
Я пришел к такому же решению, но у меня есть опасения по поводу правильности такого подхода. Ex. с петлей dev я могу работать вокруг проверки отверстий, созданных с truncate -s 4G swapfile_holes.img. Т.е. причина чего-то swaponпроверяется в том, что файл подкачки должен удовлетворять некоторым требованиям для разумной производительности.
оны
1
И только минуту назад я решил не использовать losetupкартографию. Моя система зависла после начала использования swap losetupна btrfs (с предварительно выделенным файлом). Может быть, это как-то мешает работе буферов и кешей. Т.е. система хочет освободить память и что-то поменять, но это приводит к увеличению кеша для того же размера. Хотя я не уверен, я бы избежал этого.
оны
0

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

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

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

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

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

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

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

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

MPB
источник
в FAQ также сказано, что своп на Btrfs поддерживается начиная с ядра Linux 5.0
phuclv
@phuclv: Да, прогресс!
mpb
-2

Invalid argumentговорит, что что-то не так в аргументах для swaponкоманды.

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

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

Пол Брит
источник
5
Как вы думаете, я мог бы найти флаги -v и -f, не читая страницу руководства?
Малат