Swapon falhou: argumento inválido em um sistema Linux com sistema de arquivos Btrfs


16

O que há de errado nessa sequência de operação, sendo executada em um sistema Debian Squeeze com um sistema de arquivos 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

Meu sistema de arquivos é:

$ 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, reabrimos sua pergunta e adicionamos sua resposta como abaixo. Sinta-se livre para postar sua resposta, vou excluir a minha.
Sathyajith Bhat

Respostas:


16

Este relatório de erros leva a esta discussão

Portanto, "Argumento inválido" deve ser lido como "Seu sistema de arquivos não suporta arquivo de troca"

como publicado pela malat


6
Boa pegada! O btrfssistema de arquivos não pode suportar arquivos de permuta porque move os dados do arquivo e o código de permuta do Linux leva apenas o mapeamento do arquivo de permuta uma vez. A catástrofe ocorreria se isso fosse permitido - dados aleatórios do arquivo que usavam blocos que o arquivo de troca usado uma vez seriam corrompidos.
David Schwartz

1
página de manual do swapon mais recente, documenta um novo truque "Uma solução possível é mapear o arquivo para um dispositivo de loopback". Ainda não tentei.
malat

8

Tenho menos de 50 reputação, por isso não posso comentar. Mas preciso atualizar as respostas existentes. No kernel do linux 5.0.0, o btrfs suporta nativamente o swapfile agora. (Você deve defini-lo como não-VACA)

Aqui estão algumas informações do kernel.org: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F

A partir do kernel 5.0+, o btrfs possui suporte a arquivos de troca nativos, mas com algumas limitações. Trocar arquivo - deve ser totalmente alocado como NOCOW sem compactação em um dispositivo.

Este link mostra como fazê-lo: https://wiki.archlinux.org/index.php/swap#Swap_file .

NÃO TENTE EM LINUX <4.21 !!!

Aviso: O Btrfs no kernel do Linux antes da versão 5.0 não suporta arquivos de troca. O não cumprimento deste aviso pode resultar em corrupção do sistema de arquivos. Embora um arquivo de troca possa ser usado no Btrfs quando montado em um dispositivo de loop, isso resultará em um desempenho de troca severamente degradado.


1
Você poderia citar a seção relevante no seu link?
Burgi

@Burgi eu editei minha resposta e está melhor agora!
recolic 16/03/19

2

Se você deseja trocar um arquivo de qualquer maneira, use btrfs-swapon


Cheguei à mesma solução, mas tenho preocupações com a correção dessa abordagem. Ex. com loop dev eu posso trabalhar em torno de buracos verificar criado com truncate -s 4G swapfile_holes.img. Ou seja, a razão pela qual swaponverifica algo é que o swapfile deve atender a alguns requisitos para um desempenho razoável.
ony

1
E, há pouco, decidi evitar o losetupmapeamento. Meu sistema ficou travado depois de começar a usar o swap losetupno btrfs (com arquivo pré-alocado). Talvez isso interfira de alguma forma com buffers e caches. Ou seja, o sistema deseja liberar memória e trocar alguma coisa, mas isso resulta em aumento de cache para o mesmo tamanho. Embora eu não tenha certeza, eu evitaria isso.
ony

0

Atualização em abril de 2019 : Consulte a resposta da recolic, que afirma que o Btrfs começou a oferecer suporte à troca a partir da versão 5.0.0 do kernel do Linux.

Resposta original:

A resposta de Sathya parece conter links mortos.

Encontrei isso no FAQ do Btrfs:

O btrfs suporta arquivos de troca?

Atualmente não. Apenas criar um arquivo NOCOW não ajuda, o suporte à troca de arquivos depende de uma função que o btrfs intencionalmente não implementa devido a possíveis corrupções. A implementação de troca costumava basear-se em algumas suposições que não podem ser mantidas no btrfs, como números de bloco no arquivo de troca, enquanto o btrfs possui um mapeamento de número de bloco diferente no caso de vários dispositivos. Há uma nova API que pode ser usada para transferir portas para btrfs; Para obter mais detalhes, consulte as idéias do projeto # Suporte ao arquivo Swap.

Uma solução alternativa, embora com baixo desempenho, é montar um arquivo de troca por meio de um dispositivo de loop.

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


o FAQ também diz que swap em Btrfs é suportado desde Kernel Linux 5.0
phuclv

@phuclv: Sim, progresso!
mpb

-2

Invalid argumentdiz que algo está errado nos argumentos de swaponcomando.

Antes de tudo, leia man swapon.

Tente sudo swapon swapfile2. No meu caso, funciona.


5
Você acha que eu poderia encontrar a flag -v e -f sem ler a página de manual?
malat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.