Como criar swapfile no disco ssd com btrfs

7

Eu 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

Em dmesg eu vejo

[238434.731654] swapon: swapfile has holes

Entendo que provavelmente existem alguns furos causados ​​pela fragmentação do disco, mas esse é o disco SSD, portanto, provavelmente não deve importar? Existe uma maneira de ignorar os buracos? Ou como posso corrigir isso?

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

Petr
fonte
Por "buracos" significa que o arquivo não alocou todo o seu espaço, tornando-o inútil como um arquivo de troca. Você pode usar fallocate para tapar os orifícios.
19716 David Schwartz
Em relação à hibernação, se você usa o systemd, precisa de uma liberação que incorpore o PR # 12760 .
Mihai Capotă

Respostas:

7

Status em 2019

O desenvolvimento do kernel do Btrfs e Linux tornou obsoleta minha resposta original . Por favor, veja esta outra resposta .


Resposta original de 2016

Do FAQ do btrfs :

O btrfs suporta arquivos de troca? Atualmente não. Apenas criar um arquivo NOCOW não ajuda, o suporte ao arquivo 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 de troca por meio de um dispositivo de loop.

Portanto, ainda não há uma boa maneira de criar swapfile na partição btrfs.

Kamil Maciorowski
fonte
2
Bem, esta é uma primeira vez depois de anos usando btrfs que eu encontrei alguma característica muito importante que está faltando, e provavelmente primeira desvantagem em comparação com outros FS :(
Petr
Existem dados de referência ou métodos de teste para suportar o baixo desempenho exigido pelos desenvolvedores do Btrfs?
Hydranix
@ Hydranix não conheço nenhum. Considere fazer uma pergunta separada.
Kamil Maciorowski
@ Pet Yepp, tenho memória ECC, mas se o swap não estiver em uma partição btrfs, não há dados de garantia armazenados lá, mantendo sua integridade. Outro ponto para o zfs. : S
inf3rno
@ Pet As coisas mudaram. Eu não me importaria em tudo se você aceitar outra resposta agora.
Kamil Maciorowski 10/03
1

Eu li aqui que é possível usar o zram para troca. Ainda não tentei.

Espero que ajude. Cheerio.

Robin Banerjee
fonte
2
Este teria sido um bom comentário. Se você incluir as informações desse artigo, seria uma melhoria (especialmente porque é muito curta). Se você pudesse adicionar mais informações sobre as vantagens e desvantagens, seria uma ótima resposta.
Seth
Eu costumava ter problemas de estabilidade, mesmo com 16g de memória em uma máquina de mesa quando desligava a troca. Talvez seja mais fácil monitorar a quantidade de memória que um servidor usa, mas eu prefiro ter uma partição de troca. De qualquer forma, vou tentar pelo menos durante o tempo em que comparo btrfs, zfs e outras soluções.
inf3rno
1

Veja como configurar a troca via loopback no btrfs:

# dd if=/dev/zero of=/swapfile bs=1M count=1k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.23138 s, 872 MB/s

# losetup --find --show /swapfile
/dev/loop0

# mkswap /dev/loop0
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=04b048e2-47ab-4ab0-a79e-7e1c481a10c9

# swapon /dev/loop0

Isso é ideal? Não. Evite usá-lo na produção. Mas funciona como um último recurso.

w00t
fonte
1

Como mencionado acima, desde o Linux 5.0 agora é 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 o NoCOWatributo para ele:chattr +C /swap
  3. Verifique se o Catributo apareceu:lsattr /swap
  4. Preencha: dd if=/dev/zero of=/swap bs=1M count=1024 # por 1 gigabyte
  5. mkswap /swap && chmod 600 /swap && swapon /swap

Como alternativa, você pode criar um diretório, definir chattr +Cpara esse diretório e, em seguida, criar um arquivo de troca sob ele.

Observe que você não pode chattr +Cexecutar o arquivo não vazio já existente. Está documentado como um comportamento indefinido (na verdade, apenas não altera os atributos). Portanto, você deve criar um arquivo vazio e chattr, em seguida , criar um diretório chattre, em seguida, criar um arquivo nele (nesse caso, todos os arquivos criados após chattro diretório terão o atributo nocow).

Advertência: como mencionado, isso requer o kernel versão 5.0 ou superior. O Raspberry Pi, por exemplo, usa os kernels 4.19. *, Assim você não poderá usar esta técnica nele.

MarSoft
fonte