
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:
- Crie um arquivo vazio:
touch /swap
- Use
chattr
para definirNoCOW
atributos para ele:chattr +C /swap
- Verifique se esse
C
atributo apareceu:lsattr /swap
- Preencha:
dd if=/dev/zero of=/swap bs=1M count=1024
# para 1 gigabyte mkswap /swap && chmod 600 /swap && swapon /swap
Alternativamente, você pode criar um diretório, definir chattr +C
esse diretório e então criar um arquivo de troca nele.
Observe que você não pode fazer chattr +C
isso 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 chattr
e então criar um arquivo nele (nesse caso, todos os arquivos criados após chattr
entrar 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 swapon
apó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 swapon
no volume principal novamente - mas farei um subvolume dedicado a seguir.