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

2

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 apenas curioso sobre o desempenho de ramdisks de rede em comparação com discos rígidos mecânicos locais (lentos).

O swapfile está em um ponto de montagem tmpfs e é compartilhado por meio de samba . No entanto, toda vez que tento emitir:

swapon /mnt/ramswap/swapfile

Eu recebo:

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

e em dmesg eu li:

[ 9569.806483] swapon: swapfile has holes

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

Em este post (datado de 2002) alguém diz que usar um swapfile 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 para isso funcionar?

    
por Avio 31.10.2012 / 22:25

3 respostas

3

Para citar a página man ...

This is due to the swap file implementation in the kernel expecting to be able to write to the file directly, without the assistance of the file system.

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

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

    
por 31.10.2012 / 23:34
6

Eu sei que este é um segmento antigo agora, mas acabei de encontrar este problema e descobri que é possível usar uma partição swap do NFS fazendo uso do dispositivo de loopback do kernel:

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

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

Crie 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:

root@machine:/# swapon /dev/loop0

Faça 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

Ativar:

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

Fonte: link

    
por 06.01.2015 / 09:39
1

Se você pudesse fazê-lo como você descreve, devo salientar que você não está usando outras máquinas RAM não utilizada. Os arquivos de troca são um backup baseado em arquivo para RAM mais rápida local. Você usaria o espaço em disco das outras máquinas.

Você não pode fazer isso porque o Linux tem um tipo de partição especial para swap, ele deve estar em uma unidade local, não em um compartilhamento de rede. O Windows não faz desta 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 ser em NFS ou SMB.

No entanto, acho que você pode 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. Eu acho que é uma idéia terrível por razões de desempenho e confiabilidade. O mais provável é que o Linux congele se a rede cair e precisar acessar a partição swap. Você deve obter um melhor desempenho com a AoE. Mas, novamente, um problema com a rede ou a outra máquina e você está em uma situação difícil.

Compre mais RAM ou, se não conseguir mais, pegue um SSD e crie uma partição swap nele.

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

  1. Crie um tmpfs ou ramfs no host remoto.
  2. Formate os tmpfs ou os ramfs como ext4.
  3. Crie um arquivo de imagem de disco bruto nele. (dd ou truncado vai fazer 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 alvo com mkswap.
  6. Então swapon.

Boa sorte!

    
por 31.10.2012 / 22:37