Por que usar o arquivo de troca em um sistema de arquivos montado em SMB/NFS não é possível no Linux?

Por que usar o arquivo de troca em um sistema de arquivos montado em SMB/NFS não é possível no Linux?

Gostaria de usar a RAM não utilizada de outra máquina como espaço de troca para minha instalação primária do Linux. Eu estava curioso sobre o desempenho dos ramdisks de rede em comparação com os discos rígidos mecânicos locais (lentos).

O arquivo de troca está em um tmpfsponto de montagem e é compartilhado por meio de arquivos samba. No entanto, toda vez que tento emitir:

swapon /mnt/ramswap/swapfile

Eu recebo:

swapon: /mnt/ramswap/swapfile: swapon failed: Invalid argument

e dmesgeu li:

[ 9569.806483] swapon: swapfile has holes

Tentei alocar o arquivo de troca com dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)e com truncate -s 2G(ambos seguidos de mkswap swapfile), mas o resultado é sempre o mesmo.

Emesta postagem(datado de 2002) alguém diz que usar um arquivo de troca sobre NFS/SMB não é possível no Linux. Esta afirmação ainda é válida? E se sim, qual é o motivo desta escolha e existe alguma solução alternativa para que isso funcione?

Responder1

Eu sei que este é um tópico um pouco antigo agora, mas acabei de me deparar com esse problema e descobri que é possível usar uma partição swap NFS usando o dispositivo de loopback do kernel:

Crie um arquivo vazio (preencha com zeros de /dev/zero):

root@machine:/# dd if=/dev/zero of=/swap bs=1024 count=1048576

Faça um dispositivo de loop:

root@machine:/# losetup /dev/loop0 /swap

Torne-o adequado para troca:

root@machine:/# mkswap /dev/loop0
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=931d6e04-78ec-41fd-ab2c-22522ac2711d

Agora use-o:

root@machine:/# swapon /dev/loop0

Torne a mudança permanente

Escreva um script para tornar essa troca permanente. /etc/init.d/swap pode ser assim:

#!/bin/sh

set -e

case "$1" in
start)
losetup /dev/loop0 /swap
swapon /dev/loop0
;;
stop)
swapoff /dev/loop0
losetup -d /dev/loop0
;;
restart)
swapoff /dev/loop0
swapon /dev/loop0
;;
*)
echo "Usage: swap { start | stop | restart }" >&2
exit 1
;;
esac

exit 0

Torne o arquivo executável:

root@machine:/# chmod +x /etc/init.d/swap

Habilitá-lo:

root@machine:/# update-rc.d swap defaults

Fonte:http://www.emanuelis.eu/2010/06/21/how-to-swap-to-nfs-mount/

Responder2

Para citar a página de manual ...

Isso se deve à implementação do arquivo de troca no kernel, que espera poder gravar no arquivo diretamente, sem a ajuda do sistema de arquivos.

Não é possível gravar diretamente em uma montagem NFS sem passar pelo sistema de arquivos, então você recebe esta mensagem de erro um pouco confusa.

Como observou @MattH, você pode usar o iSCSI para fazer isso, mas a verdadeira questão é se vale a pena. Afinal, a RAM é muito barata.

Responder3

Se você pudesse fazer isso como descreveu, devo salientar que você não está usando RAM não utilizada de outra máquina. Os arquivos de troca são um suporte baseado em arquivo para RAM local mais rápida. Você estaria usando o espaço no disco rígido de outras máquinas.

Você não pode fazer isso porque o Linux tem um tipo de partição especial para swap; ela deve estar em uma unidade local, não em um compartilhamento de rede. O Windows não faz isso dessa maneira, ele usa apenas um arquivo em um sistema de arquivos existente. Se bem me lembro, esse arquivo também deve estar em uma unidade local. Portanto, não pode estar em NFS ou SMB.

No entanto, acho que você poderá fazer isso com o iSCSI. Se você montar um destino iSCSI localmente e fornecer uma troca dentro dele, poderá funcionar. É uma boa ideia? não. Acho que é uma péssima ideia por razões de desempenho e confiabilidade. Muito provavelmente o Linux irá congelar se a rede cair e precisar acessar a partição swap. Você deve obter melhor desempenho com AoE. Mas, novamente, um problema com a rede ou outra máquina e você terá uma jornada difícil.

Basta comprar mais RAM ou, se não conseguir mais, adquira um SSD e crie uma partição swap nele.

EDITAR: Ok, você poderia fazer isso. Ainda não é recomendado, mas esta é uma maneira de alcançá-lo em teoria.

  1. Crie um tmpfs ou ramfs no host remoto.
  2. Formate o tmpfs ou ramfs como ext4.
  3. Crie um arquivo de imagem de disco bruto nele. (dd ou truncate fará isso)
  4. Exporte a imagem do disco com iscsi ou AoE.
  5. No seu PC Linux local, conecte o destino. Em seguida, crie a troca no destino com mkswap.
  6. Então troque.

Boa sorte!

Responder4

Estou compartilhando a RAM de outra máquina por meio de uma troca por NBD

servidor de hospedagem

Configure ramfs (se necessário, se não, basta pular para nbd)

sudo mkdir /mnt/ram
sudo mount -t tmpfs -o size=16G tmpfs /mnt/ram

Arquivo de configuração /etc/nbd-server/config:

[generic]
  user = nbd
  group = nbd
[swap]
  exportname = /mnt/ram/swap
  copyonwrite = false
  prerun = truncate -s 16G /mnt/ram/swap && mkswap /mnt/ram/swap

Iniciar NBD

sudo systemctl start nbd

cliente

sudo nbd-client 192.168.1.3 -name swap /dev/nbd0
sudo swapon /dev/nbd0

informação relacionada