Swapon a échoué: argument non valide sur un système Linux avec le système de fichiers Btrfs

16

Quel est le problème avec cette séquence d'opérations, fonctionnant sur un système Debian Squeeze avec un système de fichiers 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

Mon système de fichiers est:

$ 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
la source
malat, j'ai rouvert votre question et ajouté votre réponse comme ci-dessous. N'hésitez pas à poster votre réponse, je vais supprimer la mienne.
Sathyajith Bhat

Réponses:

16

Ce rapport de bogue mène à cette discussion

Donc "Argument invalide" doit être lu comme "Votre système de fichiers ne prend pas en charge le fichier d'échange"

tel que publié par malat

Sathya
la source
6
Belle prise! Le btrfssystème de fichiers ne peut pas prendre en charge les fichiers d'échange car il déplace les données de fichiers et le code d'échange Linux ne prend le mappage du fichier d'échange qu'une seule fois. Une catastrophe se produirait si cela était autorisé - les données de fichiers aléatoires qui utilisaient des blocs que le fichier d'échange une fois utilisé serait corrompus.
David Schwartz
1
la nouvelle page de manuel de swapon documente une nouvelle astuce "Une solution de contournement possible consiste à mapper le fichier sur un périphérique de bouclage". Je ne l'ai pas encore essayé.
malat
8

J'ai moins de 50 points de réputation donc je ne peux pas commenter. Mais je dois mettre à jour les réponses existantes. Dans le noyau Linux 5.0.0, btrfs prend désormais nativement en charge le fichier d'échange. (Vous devez le définir comme non-vache)

Voici quelques informations de kernel.org: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

À partir du noyau 5.0+, btrfs prend en charge les fichiers d'échange natifs, mais avec certaines limitations. Fichier d'échange - doit être entièrement alloué en tant que NOCOW sans compression sur un seul appareil.

Ce lien montre comment le faire: https://wiki.archlinux.org/index.php/swap#Swap_file .

N'ESSAYEZ PAS SUR LINUX <4.21 !!!

Avertissement: Btrfs sur le noyau Linux avant la version 5.0 ne prend pas en charge les fichiers d'échange. Le non-respect de cet avertissement peut entraîner une corruption du système de fichiers. Bien qu'un fichier d'échange puisse être utilisé sur Btrfs lorsqu'il est monté via un périphérique de boucle, cela entraînera des performances d'échange gravement dégradées.

récolter
la source
1
Pourriez-vous citer la section pertinente de votre lien?
Burgi
@Burgi J'ai édité ma réponse et c'est mieux maintenant!
recolic
2

Si vous voulez quand même échanger sur un fichier, utilisez simplement btrfs-swapon

Sebastian Wagner
la source
Je suis parvenu à la même solution, mais je m'inquiète de la justesse d'une telle approche. Ex. avec boucle dev je canne contourne les chèques créés avec truncate -s 4G swapfile_holes.img. C'est-à-dire que la swaponvérification de quelque chose est que le fichier d'échange doit remplir certaines conditions pour des performances raisonnables.
ony
1
Et il y a un instant, j'ai décidé d'éviter d'utiliser la losetupcartographie. Mon système s'est bloqué après avoir commencé à utiliser le swap through losetupsur btrfs (avec un fichier pré-alloué). Peut-être que cela interfère d'une manière ou d'une autre avec les tampons et les caches. C'est-à-dire que le système veut libérer de la mémoire et échanger quelque chose, mais cela entraîne une augmentation du cache pour la même taille. Bien que je ne sois pas sûr, j'éviterais cela.
ony
0

Mise à jour d'avril 2019 : veuillez consulter la réponse de recolic, qui affirme que Btrfs a commencé à prendre en charge le swap à partir de la version 5.0.0 du noyau Linux.

Réponse originale:

La réponse de Sathya semble contenir des liens morts.

J'ai trouvé cela dans la FAQ Btrfs:

Btrfs prend-il en charge les fichiers d'échange?

Actuellement non. La création d'un fichier NOCOW n'aide pas, la prise en charge des fichiers d'échange repose sur une fonction que btrfs n'implémente pas intentionnellement en raison de corruptions potentielles. L'implémentation de swap s'appuyait sur certaines hypothèses qui peuvent ne pas tenir dans btrfs, comme les numéros de bloc dans le fichier swap tandis que btrfs a un mappage de numéro de bloc différent en cas de plusieurs périphériques. Il existe une nouvelle API qui pourrait être utilisée pour porter le swap sur btrfs; pour plus de détails, jetez un œil aux idées de projets # Prise en charge des fichiers d'échange.

Une solution de contournement, bien qu'avec de mauvaises performances, consiste à monter un fichier d'échange via un périphérique de boucle.

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

mpb
la source
la FAQ indique également que l'échange sur Btrfs est pris en charge depuis le noyau Linux 5.0
phuclv
@phuclv: Ouais, progresse!
mpb
-2

Invalid argumentdit que quelque chose ne va pas dans les arguments pour la swaponcommande.

Tout d'abord, lisez man swapon.

Essayez sudo swapon swapfile2. Dans mon cas, cela fonctionne.

Paul Brit
la source
5
Pensez-vous que je pourrais trouver l'indicateur -v et -f sans lire la page de manuel?
malat