Swapon falló: argumento no válido en un sistema Linux con sistema de archivos Btrfs

16

¿Qué tiene de malo esta secuencia de operación, que se ejecuta en un sistema Debian Squeeze con un sistema de archivos 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

Mi sistema de archivos es:

$ 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)
malat
fuente
Malat, reabrí tu pregunta y agregué tu respuesta como se muestra a continuación. Siéntase libre de publicar su respuesta, eliminaré la mía.
Sathyajith Bhat

Respuestas:

16

Este informe de error conduce a esta discusión

Por lo tanto, "Argumento no válido" debe leerse como "Su sistema de archivos no admite archivos de intercambio"

como publicado por malat

Sathya
fuente
66
¡Buena atrapada! El btrfssistema de archivos no puede admitir archivos de intercambio porque mueve los datos del archivo y el código de intercambio de Linux solo toma la asignación del archivo de intercambio una vez. La catástrofe ocurriría si esto se permite: los datos de archivos aleatorios que usaron bloques que el archivo de intercambio una vez utilizado se corromperían.
David Schwartz
1
la nueva página del manual de swapon documenta un nuevo truco "Una posible solución es asignar el archivo a un dispositivo de bucle invertido". Aun no lo he intentado.
malat
8

Tengo menos de 50 reputación, así que no puedo comentar. Pero tengo que actualizar las respuestas existentes. En linux kernel 5.0.0, btrfs ahora admite de forma nativa swapfile. (Debe configurarlo como no-COW)

Aquí hay información de kernel.org: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

Desde el kernel 5.0+, los btrfs tienen soporte nativo para archivos de intercambio, pero con algunas limitaciones. Archivo de intercambio: debe asignarse completamente como NOCOW sin compresión en un dispositivo.

Este enlace muestra cómo hacerlo: https://wiki.archlinux.org/index.php/swap#Swap_file .

¡NO LO INTENTES EN LINUX <4.21!

Advertencia: Btrfs en el kernel de Linux antes de la versión 5.0 no admite archivos de intercambio. Si no se hace caso a esta advertencia, se puede dañar el sistema de archivos. Si bien se puede usar un archivo de intercambio en Btrfs cuando se monta a través de un dispositivo de bucle, esto dará como resultado un rendimiento de intercambio severamente degradado.

recolic
fuente
1
¿Podría citar la sección relevante en su enlace?
Burgi
@Burgi ¡Edité mi respuesta y ahora es mejor!
Recolic
2

Si de todos modos desea intercambiar un archivo, simplemente use btrfs-swapon

Sebastian Wagner
fuente
Llegué a la misma solución, pero me preocupa la corrección de dicho enfoque. Ex. con loop dev puedo trabajar alrededor de los agujeros creados con truncate -s 4G swapfile_holes.img. Es decir, la razón por la cual las swaponcomprobaciones de algo es que el archivo de intercambio debe cumplir algunos requisitos para un rendimiento razonable.
ony
1
Y hace un momento decidí evitar usar el losetupmapeo. Mi sistema se atascó después de comenzar a usar el intercambio losetupen btrfs (con un archivo preasignado). Tal vez interfiera de alguna manera con las memorias intermedias y los cachés. Es decir, el sistema quiere liberar memoria y cambia algo, pero esto resulta en un aumento de caché para el mismo tamaño. Aunque no estoy seguro, lo evitaría.
ony
0

Actualización de abril de 2019 : consulte la respuesta de recolic, que afirma que Btrfs comenzó a admitir el intercambio a partir de la versión 5.0.0 del kernel de Linux.

Respuesta original:

La respuesta de Sathya parece contener enlaces muertos.

Encontré esto en las preguntas frecuentes de Btrfs:

¿Btrfs admite archivos de intercambio?

Actualmente no. Simplemente hacer un archivo NOCOW no ayuda, el soporte de intercambio de archivos se basa en una función que btrfs no implementa intencionalmente debido a posibles corrupciones. La implementación de intercambio solía basarse en algunos supuestos que pueden no mantenerse en btrfs, como los números de bloque en el archivo de intercambio, mientras que btrfs tiene una asignación de número de bloque diferente en el caso de múltiples dispositivos. Hay una nueva API que podría usarse para transferir puertos a btrfs; para más detalles, eche un vistazo a las ideas de proyectos # Soporte de archivos de intercambio.

Una solución alternativa, aunque con bajo rendimiento, es montar un archivo de intercambio a través de un dispositivo de bucle.

Fuente: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

mpb
fuente
las preguntas frecuentes también dicen que el intercambio en Btrfs es compatible desde el kernel 5.0 de Linux
phuclv
@phuclv: ¡Sí, progreso!
mpb
-2

Invalid argumentdice que algo está mal en los argumentos para el swaponcomando.

Antes que nada, lee man swapon .

Tratar sudo swapon swapfile2. En mi caso funciona.

Paul Brit
fuente
55
¿Posiblemente piensas que podría encontrar la bandera -v y -f sin leer la página del manual?
malat