¿Por qué no es posible utilizar un archivo de intercambio en un sistema de archivos montado SMB/NFS en Linux?

¿Por qué no es posible utilizar un archivo de intercambio en un sistema de archivos montado SMB/NFS en Linux?

Me gustaría utilizar la RAM no utilizada de otra máquina como espacio de intercambio para mi instalación principal de Linux. Simplemente tenía curiosidad sobre el rendimiento de los discos ram de red en comparación con los discos duros mecánicos locales (lentos).

El archivo de intercambio está en un tmpfspunto de montaje y se comparte a través de samba. Sin embargo, cada vez que intento emitir:

swapon /mnt/ramswap/swapfile

Yo obtengo:

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

y en dmesgleo:

[ 9569.806483] swapon: swapfile has holes

Intenté asignar el archivo de intercambio con dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)y con truncate -s 2G(ambos seguidos de mkswap swapfile) pero el resultado es siempre el mismo.

Enesta publicación(que data de 2002) alguien dice que usar un archivo de intercambio a través de NFS/SMB no es posible en Linux. ¿Sigue siendo válida esta afirmación? Y en caso afirmativo, ¿cuál es el motivo de esta elección? ¿Existe alguna solución para que esto funcione?

Respuesta1

Sé que este es un hilo un poco antiguo ahora, pero me encontré con este problema y descubrí que es posible usar una partición de intercambio NFS haciendo uso del dispositivo de bucle invertido del kernel:

Cree un archivo vacío (rellénelo con ceros desde /dev/zero):

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

Haz un dispositivo de bucle:

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

Hágalo adecuado para el intercambio:

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

Ahora úsalo:

root@machine:/# swapon /dev/loop0

Haz que el cambio sea permanente

Escribe un script para que este intercambio sea permanente. /etc/init.d/swap puede ser así:

#!/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

Haga el archivo ejecutable:

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

Permitirle:

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

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

Respuesta2

Para citar la página de manual...

Esto se debe a que la implementación del archivo de intercambio en el kernel espera poder escribir en el archivo directamente, sin la ayuda del sistema de archivos.

No es posible escribir directamente en un montaje NFS sin pasar por el sistema de archivos, por lo que recibe este mensaje de error un poco confuso.

Como señaló @MattH, es posible que pueda utilizar iSCSI para hacer esto, pero la verdadera pregunta es si vale la pena. Después de todo, la RAM es bastante barata.

Respuesta3

Si pudiera hacerlo como lo describe, debo señalar que no está utilizando la RAM no utilizada de otra máquina. Los archivos de intercambio son un respaldo basado en archivos para una RAM local más rápida. Estaría usando espacio en el disco duro de otras máquinas.

No puede hacerlo porque Linux tiene un tipo de partición especial para intercambio, debe estar en una unidad local, no en un recurso compartido de red. Windows no lo hace de esta manera, usa solo un archivo en un sistema de archivos existente. Si no recuerdo mal, ese archivo también debe estar en una unidad local. Entonces no puede ser en NFS o SMB.

Sin embargo, creo que es posible que puedas hacerlo con iSCSI. Si monta un destino iSCSI localmente y proporciona un intercambio dentro de él, puede funcionar. ¿Es una buena idea? No. Creo que es una idea terrible por razones de rendimiento y confiabilidad. Lo más probable es que Linux se congele si la red se cae y necesita acceder a la partición de intercambio. Deberías obtener un mejor rendimiento con AoE. Pero nuevamente, un problema con la red o la otra máquina y te espera un viaje lleno de obstáculos.

Simplemente compre más RAM o, si no cabe más, obtenga un SSD y cree una partición de intercambio en él.

EDITAR: Ok, podrías hacerlo. Todavía no se recomienda, pero esta es una forma de lograrlo en teoría.

  1. Cree un tmpfs o ramfs en el host remoto.
  2. Formatee tmpfs o ramfs como ext4.
  3. Cree un archivo de imagen de disco sin formato en él. (dd o truncar lo hará)
  4. Exporte la imagen del disco con iscsi o AoE.
  5. En su PC Linux local, conecte el objetivo. Luego cree el intercambio en el objetivo con mkswap.
  6. Luego intercambie.

¡Buena suerte!

Respuesta4

Estoy compartiendo la RAM de otra máquina mediante un intercambio a través de NBD

servidor huesped

Configure ramfs (si es necesario, si no, simplemente pase a nbd)

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

Archivo de configuración /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 al día siguiente

sudo systemctl start nbd

cliente

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

información relacionada