Como criar swapfile em disco SSD com btrfs

Como criar swapfile em disco SSD com btrfs

Tenho SSD com btrfs, tentei criar um swapfile como:

dd if=/dev/zero of=swapfile01  bs=1M count=10240
mkswap swapfile01
chmod 600 swapfile01
swapon swapfile01

No dmesg eu vejo

[238434.731654] swapon: swapfile has holes

Eu entendo que provavelmente existem alguns buracos causados ​​pela fragmentação do disco, mas este é um disco SSD, então provavelmente não deveria importar? Existe uma maneira de ignorar os buracos? Ou como posso consertar isso?

Fora do tópico - por que eu quero isso (para evitar perguntas irrelevantes nos comentários): Eu tenho um disco criptografado que é difícil de redimensionar, então decidi criar um arquivo de troca em vez de redimensionar a partição de troca (adicionei 14 GB de ram, de 4gb a 16gb e não consigo hibernar agora).

Responder1

Situação em 2019

O desenvolvimento do Btrfs e do kernel Linux rendeu minha resposta originalobsoleto. Por favor, vejaesta outra resposta.


Resposta original de 2016

DePerguntas frequentes sobre btrfs:

O btrfs suporta arquivos de troca? Atualmente não. Apenas criar um arquivo NOCOW não ajuda, o suporte a arquivos de troca depende de uma função que o btrfs intencionalmente não implementa devido a possíveis corrupções. (...) Uma solução alternativa, embora com baixo desempenho, é montar um arquivo swap através de um dispositivo de loop.

Portanto, ainda não existe uma boa maneira de criar um arquivo de swap na partição btrfs.

Responder2

Como acima mencionado,desde Linux 5.0agora é possível criar arquivos de troca no BTRFS. Mas eles devem ser não compactados e NoCOW. Aqui está como você realmente cria esse arquivo:

  1. Crie um arquivo vazio:touch /swap
  2. Use chattrpara definir NoCOWatributos para ele:chattr +C /swap
  3. Verifique se esse Catributo apareceu:lsattr /swap
  4. Preencha: dd if=/dev/zero of=/swap bs=1M count=1024 # para 1 gigabyte
  5. mkswap /swap && chmod 600 /swap && swapon /swap

Alternativamente, você pode criar um diretório, definir chattr +Cesse diretório e então criar um arquivo de troca nele.

Observe que você não pode fazer chattr +Cisso com um arquivo não vazio já existente. Está documentado que é um comportamento indefinido (na verdade, simplesmente não altera atributos). Portanto, você deve criar um arquivo vazio e então chattr, ou criar um diretório com chattre então criar um arquivo nele (nesse caso, todos os arquivos criados após chattrentrar no diretório terão o atributo nocow).

Embargo:conforme mencionado, isso requer a versão 5.0 do kernel ou superior. Raspberry Pi, por exemplo, usa kernels 4.19.*, então você não poderá usar essa técnica nele.

Responder3

O suporte a arquivos de troca foi adicionado ao kernel versão 5.0, como pode ser visto no commithttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed46ff3d423780fa5173b38a844bf0fdb210a2a7 Para ativar o arquivo de troca no btrfs, o arquivo deve estar totalmente alocado como NOCOW sem compactação em um dispositivo.

Responder4

Uma coisa útil a saber sobre swap no btrfs é: se você estiver fazendo backup de snapshots/subvolumes, deverá criar um subvolume dedicado do qual não está fazendo snapshot.

No subvolume de snapshot, seu arquivo de troca se tornará COW novamente e você não poderá fazer isso swaponapós a reinicialização:https://www.spinics.net/lists/linux-btrfs/msg96790.html

Tornei meu último subvolume gravável, como sudo btrfs property set -ts /.sxbackup/sx-20210211-092159-utc/ ro false, deletei swap, e consegui fazê-lo swaponno volume principal novamente - mas farei um subvolume dedicado a seguir.

informação relacionada